mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
   winkel_x = asin((messwert_x / gravity)) * (180 / pi());
   winkel_y = asin((messwert_y / gravity)) * (180 / pi());
   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
  accx = -messwert_x / gravity
  accy = -messwert_y / gravity
  accz =  messwert_z / gravity
  
  totalforce = sqrt((accx*accx)+(accy*accy)+(accz*accz));
  
  winkel_x = asin(accx/totalforce);
  winkel_y = asin(accy/totalforce);
  winkel_z = asin(accz/totalforce);
(http://www.anddev.org/convert_android_acceleromete...)

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

Autor: karadur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Autor: ad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
angle_aileron = atan2(fAccelMeasured_aileron, fAccelMeasured_tail);
angle_elevator = atan2(fAccelMeasured_elevator, fAccelMeasured_tail);

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

klasse, vielen Dank!!!

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, möchte ich nochmal nachreichen, wie aktuell gerade aussieht,
        // Neutralwerte, ACCX & ACCY (Waagerecht auf dem Tisch)
        Neutralwert = 2121;
        
        accx = (float)((messwert_y - Neutralwert));
        accy = (float)((messwert_x - Neutralwert));
        accz = (float)((messwert_z - Neutralwert));

        totalforce = (float)(sqrt((accx * accx)
                                 + (accy * accy) 
                                 + (accz * accz)));
        accx /= totalforce;
        accy /= totalforce;
        accz /= totalforce;

        tilt_x = atan2(accx, accz)  * (180 / pi());
        tilt_y = atan2(accy, accz)  * (180 / pi());

        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

// Normalize values:

// Restrict pitch value to -90 to +90
if (tilt_x < -90) {
  tilt_x = -180 - tilt_x;
  accz += 180;
  tilt_y += 180;
} else if (tilt_x > 90) {
  tilt_x = 180 - tilt_x;
  accz += 180;
  tilt_y += 180;
}

// roll from -180 to + 180
if (tilt_y >= 180) {
  tilt_y -= 360;
}

// yaw from 0 to 360
if (accz < 0) {
  accz = accz + 360;
}
if (accz >= 360) {
  accz -= 360;
}


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

Autor: paa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.