Winkel aus allen Achsen mit 3 Achsbeschleunigungssensor - Wieso TotalForce Berechnung?

Gast #1348044
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
Gast #1348062
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.
Gast #1348245
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
Gast #1349205
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
Gast #1350117
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren