Forum: Mikrocontroller und Digitale Elektronik arm_sin_cos_f32() gibt keine Ergebnisse aus


von Erik H. (agutanus)


Angehängte Dateien:

Lesenswert?

Für einen Autopiloten (Modellflugzeuge) verwende ich unter anderem die 
Funktion arm_sin_cos_f32(). Leider kann ich nach Aufruf dieser Funktion 
nicht mit den sin-cos-Werten weiterrechnen... Wenn ich stattdessen 
arm_sin_f32() und arm_cos_f32() nutze, funktioniert alles wunderbar!
1
/* calculate orientation-setpoint (qSP) */
2
/* using euler > quaternion conversion */
3
4
// funktioniert:
5
sin_phiSP_half = arm_sin_f32(phiSP * 0.5);
6
sin_thetaSP_half = arm_sin_f32(thetaSP * 0.5);
7
sin_psiSP_half = arm_sin_f32(psiSP * 0.5);
8
cos_phiSP_half = arm_cos_f32(phiSP * 0.5);
9
cos_thetaSP_half = arm_cos_f32(thetaSP * 0.5);
10
cos_psiSP_half = arm_cos_f32(psiSP * 0.5);
11
12
// funktioniert nicht:
13
arm_sin_cos_f32((phiSP * 0.5), &sin_phiSP_half, &cos_phiSP_half);
14
arm_sin_cos_f32((thetaSP * 0.5), &sin_thetaSP_half, &cos_thetaSP_half);
15
arm_sin_cos_f32((psiSP * 0.5), &sin_psiSP_half, &cos_psiSP_half);
16
17
qSP0 = (cos_phiSP_half * cos_thetaSP_half * cos_psiSP_half) + (sin_phiSP_half * sin_thetaSP_half * sin_psiSP_half);
18
qSP1 = (sin_phiSP_half * cos_thetaSP_half * cos_psiSP_half) - (cos_phiSP_half * sin_thetaSP_half * sin_psiSP_half);
19
qSP2 = (cos_phiSP_half * sin_thetaSP_half * cos_psiSP_half) + (sin_phiSP_half * cos_thetaSP_half * sin_psiSP_half);
20
qSP3 = (cos_phiSP_half * cos_thetaSP_half * sin_psiSP_half) - (sin_phiSP_half * sin_thetaSP_half * cos_psiSP_half);

von W.S. (Gast)


Lesenswert?

Igitt, beim Anschauen dieses Armsincodes wird mir schlecht. Auf wieviel 
Stellen willst du das denn genau haben? Vielleicht nützt dir der Sinus 
nach Pedersen viel eher.

sin(x) = x * (K*x^2 + L + M/(x^2 + N))
mit
K=0.15625
L=-11.45242628
N=38.55864669

kostet nur 3 Multiplikationen und 1 Division. Man kann das sogar in 
Festkomma sprich integer formulieren, ist echt interessant.
Quelle: "Lampe, Jorke, Wengel"

W.S.

von Erik H. (agutanus)


Lesenswert?

Diese Annäherung klingt vielversprechend, da ich lediglich 3 
Nachkommastellen benötige und das ganze auch für cos einsetzbar ist.
Allerdings kann ich nach kurzer Suche dazu nichts finden. Lediglich das 
Buch der genannten Autoren:
http://www.hood.de/angebot/45547775/lampe-jorke-wengel-algorithmen-der-mikrorechentechnik.htm

Wie lautet in der Annäherung die Konstante 'M'?

Allerdings ändert das nichts an meiner Frage, warum die Funktion mit den 
übergebenen pointern nicht funktioniert...?

von Erik H. (agutanus)


Lesenswert?

Habe den Fehler gefunden:
Die Funktion arm_sin_cos_f32() erwartet einen Eingangswert in grad, 
während arm_sin_f32() in radians rechnet... Wer sich das wieder 
ausgedacht hat!

Habe mir jedenfalls das erwähnte Buch gekauft, da es scheinbar recht 
nützliche Algorithmen enthält, aus Zeiten in denen Rechenzeit noch etwas 
zählte.

Nötig sind die Codeeinsparungen noch nicht, da ich erst 18% der 
Rechenzeit und 40% der Codegröße nutze...
Eventuell werde ich die Sampletime mal von 10 auf 5 ms heruntersetzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.