2012-03-29 14 views
2

Ich arbeite gerade an einem Neigungs-kompensierten linearen Beschleunigungsmesser auf einem Android-Telefon. Was ich im Grunde erreichen möchte, ist die Beschleunigung, die im Erdrahmen liegt, und nicht der Sensorrahmen. Ich möchte auch meinen Vektor frei machen. Die X-Achse des Beschleunigungsmessers wird separat mit der X-Achse eines Landfahrzeugs ausgerichtet. Daher ist eine Gierkompensation (Winkel zwischen der x-Achse des Telefons und dem magnetischen Norden) nicht erwünscht.Entfernen Sie eine beliebige Rotationsachse aus einer Rotationsmatrix

Dafür haben wir 2 Sensorwerte:

1) 3x3 Rotationsmatrix R (Rotation von der Erde Rahmen Sensorrahmen)

2) 3x1 Beschleunigungsvektor a = (x , y, z)^T von Sensorrahmen

manuell auf die Schwerkraft aus entfernen a_transposed wir ca n einfach einen Schwerkraftvektor in Erde Rahmen definieren:

g = (0,0,9.81)^T

I kann nun die Schwerkraft mit Rotationsmatrix R multiplizieren und subtrahieren sie von a Vektor. Als Ergebnis a ' ist der Schwerkraft freie Beschleunigungsvektor.

a '= a - (R * g) (in diesem Schritt ein'

Bis hier alles funktioniert die gleichen Werte wie die Software Sensor LINEAR_ACCELERATION in API hat).

Jetzt möchte ich meine linearen Beschleunigungsvektoreine‘ in der Erde Rahmen ohne dabei Z-Achsendrehung um Konto drehen. Um zu berechnen i so ersten zu tun, um die Umkehrung der Rotationsmatrix R, die Transponierung davon gleich ist:

R^(- 1) = R^T

Dann multiplizieren i ein‘ mit R^(- 1) und drehen Sie es zurück zum Erdrahmen.

a '= R^(- 1) * a'

Bei diesem Schritt I ein Neigungs kompensierten linearen Beschleunigungsdaten haben, wenn mein Telefon magnetischen Norden zugewandt ist, weil ich auch um die Z-Achse gedreht habe, die wird nicht benötigt. Ich muss es um die z-Achse drehen, um das endgültige richtige Ergebnis zu erhalten. Zu diesem Zweck habe ich den Euler-Winkel (Drehung um die Z-Achse) aus der Rotationsmatrix berechnet, die Gieren ist. Und drehte meinen Vektor einmal in die entgegengesetzte Richtung, indem ich den Gierwinkel verwendete. Dies sollte der letzte Korrekturschritt sein, aber es gibt Kosten unter Verwendung von Euler-Winkeln.

Diese Methode funktioniert nicht, wenn ich das Telefon direkt nach oben halte, weil der Rollwinkel gleich 90 Grad ist und eine kardanische Verriegelung verursacht. Mein berechneter Gierwinkel ist dann unbekannt und meine Rückdrehung schlägt fehl.

Meine Frage ist, wie man die Rotationsmatrix ändert/ändert, so dass ich nur um die x- und y-Achse drehen kann, indem ich die z-Achse ignoriere, ohne euler Winkel zu verwenden?

i überprüft haben alread aber es hat nicht geholfen, mich: How do I remove axis from a rotation matrix?

+0

Dies ist unklar. Wenn das Telefon nach Norden gerichtet ist und sich nach Osten bewegt, zeigt ** ein ** nach Osten; Welchen Weg soll es zeigen? Wenn das Telefon nach oben zeigt und nach Osten beschleunigt, ** wird ein ** nach Osten zeigen; Welchen Weg soll es zeigen? – Beta

+0

Das Telefon wird in einem Fahrzeug platziert und die X-Achse des Telefons wird mit der X-Achse des Autos, das die Vorderseite des Autos ist, verbunden (in einem separaten Kalibrierungsschritt über GPS). Wenn das Telefon nach Norden ausgerichtet ist und nach Osten beschleunigt und die X-Achse des Telefons nach Osten zeigt, ist das in Ordnung. – kolpazar

+0

Dann wann/warum müssen Sie "umdrehen, um das endgültige richtige Ergebnis zu erhalten"? – Beta

Antwort

0
a_geo = R^-1*(a_phone - R*g) = R^-1*a_phone - g 

so alles, was Sie bisher getan haben, ist Ihre unvoreingenommene Beschleunigung in lokalen geographischen Rahmen projizieren (N, E, D oder etwas). Wenn das, was Sie wollen, eine Projektion auf horizontalen Ebene ist, vernichten Sie einfach die 3. Koordinate, können sagen, Ihre Indizes sind 1 basiert, wie Matlab oder Fortran:

a_horiz=a_geo; a_horiz[3]=0; 

Oder mit einer Matrix ausgedrückt,

a_horiz = [1,0,0; 
      0,1,0; 
      0,0,0] * a_geo; 

Sie können diese zurück zu Ihrem Telefon Achse projizieren,

R*a_horiz; 

Aber es ist nicht klar, ob es wirklich das, was Sie wollen ... ich denke, Sie wollen einfach nur eine Überschrift Rotation anzuwenden und eine Art von h haben orizontale Vorwärtsbeschleunigung und horizontale seitliche (Steuerbord) Beschleunigung. Ich kenne keinen einfachen Trick ... Nur die Überschrift extrahieren (wie Sie nur beachten, wenn Ihr Telefon x-Achse nicht vertikal ist)

psi = atan2(R(1,2) , R(1,1)); 

dann Ihre horizontale Beschleunigung drehen

a_horiz_car = [ cos(psi) , sin(psi) , 0; 
       -sin(psi) , cos(psi) , 0; 
       0  ,  0 , 1] * a_horiz; 

Nur die ersten zwei Koordinaten sind interessant, also könnte man 2x2 Matrix verwenden.

+0

Danke für die Lösung! – kolpazar

+0

Auch wenn es einen Fehler gab, korrigierte ich gerade in Matrix [1,1,0; 1,1,0; 0,0,0], die [1,0,0; 0,1,0; 0,0,0] –

0

Hat Ihr Gerät Gyros, und läuft es 2.3 (API 9) oder höher?

Wenn dies der Fall ist, können Sie möglicherweise die virtuellen Sensoren TYPE_GRAVITY und/oder TYPE_LINEAR_ACCELERATION verwenden, um direkt zu erhalten, was Sie wollen.

Verwandte Themen