Forum: Mikrocontroller und Digitale Elektronik Winkel aus allen Achsen mit 3 Achsbeschleunigungssensor - Wieso TotalForce Berechnung?


von Bernd (Gast)


Lesenswert?

Hallo Zusammen,

ich bestimme gerade mit einem 3 Achs ACC die Winkel im Raum,
bislang mit jeder Achse einzelnd, soweit kein Problem, bis
auf die Tatsache das die Werte über 45 Grad ungenau werden.
1
   winkel_x = asin((messwert_x / gravity)) * (180 / pi());
2
   winkel_y = asin((messwert_y / gravity)) * (180 / pi());
3
   winkel_z = asin((messwert_z / gravity)) * (180 / pi());

Auf diesem Bild sieht man schön wieso,
http://www.esensors.net/Winkel-Beschleunigung.png
das irgendwann ungenau wird.

Zu Lösung des Problems (verrechnung aller Achsen) habe ich
ein bißchen im Internet gestöbert und bin auch diesen Ansatz gestoßen
1
  accx = -messwert_x / gravity
2
  accy = -messwert_y / gravity
3
  accz =  messwert_z / gravity
4
  
5
  totalforce = sqrt((accx*accx)+(accy*accy)+(accz*accz));
6
  
7
  winkel_x = asin(accx/totalforce);
8
  winkel_y = asin(accy/totalforce);
9
  winkel_z = asin(accz/totalforce);
(http://www.anddev.org/convert_android_accelerometer_values_and_get_tilt_from_accel-t6595.html)

Nur versteh ich die Hintergründe nicht. Es wird die Wurzel aus dem
Produkt aller Messwert hoch2 gezogen....

Bei meinen Versuchen kam nur Unsinn heraus, kann aber auch an einem
andern Fehler liegen... Hier fehlt vermutlich noch das (180 / pi())
für den Winkel... aber kann mir das jemand erklären?

Wurmt mich etwas das ich das nicht kapiere :)

Danke & Viele Grüße
Bernd

von karadur (Gast)


Lesenswert?

Hallo

Wurzel aus den Quadratsummen ist der Betrag des 3D-Vektors.

von ad (Gast)


Lesenswert?

2)
Es werden die Beschleunigungen auf die gemessene Gesamtbeschleunigung 
normiert.
Evtl sind falsche Messungen weniger schlimm. Die Winkel sind in Radiant 
und nicht in Grad.

1)
Die Ungenauigkeit über 45° ist primär durch eine Verwendung von einer 
Geraden anstatt von asin gegeben.

von Bernd (Gast)


Lesenswert?

Hallo,

vielen Dank,

[pre]
1)
Die Ungenauigkeit über 45° ist primär durch eine Verwendung von einer
Geraden anstatt von asin gegeben.
[pre]

Ja, das weiß, allerdings möchte ich zwische 45-90 Grad die gleiche
Genauigkeit wie 0-45 Grad. Wie man auf diesem Bild schön sieht
http://www.esensors.net/Winkel-Beschleunigung.png
ist Bereich 70-90 Grad kaum zu gebrauchen.

Dies geht durch einbeziehung der Z-Achse anstelle der X oder Y
Achse ab 45 Grad. Dahingehend bin ich eigentlich auf der Suche,
vermutlich nicht durch obigen Code abgedeckt.

Kennt hier jemand schon eine fertig Implementierung? Hast
das schon mal jemand gemacht oder weiß wie das geht?
Ein einfaches Umschalten ab 45 Grad auf Z ist wohl keine
saubere Lösung.

Danke & Viele Grüße
Bernd

von Gast (Gast)


Lesenswert?

angle_aileron = atan2(fAccelMeasured_aileron, fAccelMeasured_tail);
angle_elevator = atan2(fAccelMeasured_elevator, fAccelMeasured_tail);

von Bernd (Gast)


Lesenswert?

Hallo,

klasse, vielen Dank!!!

von Bernd (Gast)


Lesenswert?

So, möchte ich nochmal nachreichen, wie aktuell gerade aussieht,
1
        // Neutralwerte, ACCX & ACCY (Waagerecht auf dem Tisch)
2
        Neutralwert = 2121;
3
        
4
        accx = (float)((messwert_y - Neutralwert));
5
        accy = (float)((messwert_x - Neutralwert));
6
        accz = (float)((messwert_z - Neutralwert));
7
8
        totalforce = (float)(sqrt((accx * accx)
9
                                 + (accy * accy) 
10
                                 + (accz * accz)));
11
        accx /= totalforce;
12
        accy /= totalforce;
13
        accz /= totalforce;
14
15
        tilt_x = atan2(accx, accz)  * (180 / pi());
16
        tilt_y = atan2(accy, accz)  * (180 / pi());
17
18
        printf("%d;%d\r", tilt_x, tilt_y);

ob totalforce funktioniert, weiß ich nicht genau, sieht mit
und ohne 1 zu 1 aus. Zumindest auf den Winkel gerundet, hmmm....

Interessant wäre es noch die Winkel zu normalisieren,
das heiß, Überschläge zuzulassen.

Wild gestöbert im Internet.... und das hier gefunden,
aus einem etwas anderen Zusammenhang
1
// Normalize values:
2
3
// Restrict pitch value to -90 to +90
4
if (tilt_x < -90) {
5
  tilt_x = -180 - tilt_x;
6
  accz += 180;
7
  tilt_y += 180;
8
} else if (tilt_x > 90) {
9
  tilt_x = 180 - tilt_x;
10
  accz += 180;
11
  tilt_y += 180;
12
}
13
14
// roll from -180 to + 180
15
if (tilt_y >= 180) {
16
  tilt_y -= 360;
17
}
18
19
// yaw from 0 to 360
20
if (accz < 0) {
21
  accz = accz + 360;
22
}
23
if (accz >= 360) {
24
  accz -= 360;
25
}

Abgesehen davon, das bei mir noch accz unbehandelt ist (??? auch mit 
atan2?) harmoniert ein Überschlag mit der atan2 funktion?

Mir fehlen hier leider die mathmatischen Hintergründe,... wieso
ist zu Bsp. für X,Y und Z ein Abstufung von 360, 180 und 90 Grad
vorgesehen?

Weiß hier jemand etwas?

Danke & Viele Grüße
Bernd

von paa (Gast)


Lesenswert?

Es kommt auf die Definition deiner Winkel an.

Bei Eulerwinkeln nach Din9300
 http://de.wikipedia.org/wiki/Eulersche_Winkel

hat man (bin mir aber nicht sicher)
tF=sqrt(acc_x^2+acc_y^2+acc_z^2)

theta=asin(acc_x/tF)
psi=atan2(acc_y/acc_z)

von Bernd (Gast)


Lesenswert?

Hallo paa,

vermutlich ist atan2 wohl nicht nach Euler? oder?
Winkelangaben sehen eigentlich ganz gut, aus.
Hat das schon mal jemand erfolgreich normalisiert?
sonst ist ja bei 90 Grad kippen Schluß ...

Danke & Viele Grüße
Bernd

von Roland P. (pram)


Lesenswert?

Ich denke die Totalforce-Berechnung kannst du weg lassen, da sich die im 
atan2 sowieso "rauskürzen" würde.
Durch die zus. Division wird das Ergebnis höchstens noch etwas 
ungenauer.

Gruß
Roland

von Mladen A. (malven)


Lesenswert?

Yo, Sie haben gerade unseren Arsch gerettet. Wir bedanken uns bei Ihnen, 
dafür, dass Sie diesen Post gemacht haben. Ich hoffe Sie führen noch ein 
glückliches Leben.

von Kolja L. (kolja82)


Lesenswert?

Yea, 12 1/2 Jahre. Das ist ein spätes Lob.

von Guido K. (Firma: Code Mercenaries GmbH) (thebug)


Lesenswert?

Kolja L. schrieb:
> Yea, 12 1/2 Jahre. Das ist ein spätes Lob.

Das zeigt den Wert von Foren in der Kombination mit einer Suchmaschine 
:)

Oft hat ja schon mal jemand das gleiche Problem gehabt und eine Lösung 
gefunden, man muss ja nicht jedes Rad selber erfinden ;)

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.