Eine einfache Möglichkeit, Euler-Winkel aus der Rotationsmatrix zu berechnen --- Hilfe!

Dies ist eine Fortsetzung dieser Frage :

Ich habe die Rotationsmatrix

( A 11 A 12 A 13 A 21 A 22 A 23 A 31 A 32 A 33 )

Ich verwende eine vormultiplizierende Rotationsmatrix (die mit Spaltenvektoren arbeitet) für intrinsische Rotationen (dh ich mache Rotationen um die Achsen der Ebene, die sich dreht). Und da der feste Rahmen mein Referenzrahmen ist ---

( 1 0 0 0 1 0 0 0 1 )

Meine Rotationsmatrix ist nichts anderes als die Spalteneinheitsvektoren der Achsen des gedrehten Rahmens, dh

( X 1 X 2 X 3 j 1 j 2 j 3 z 1 z 2 z 3 )

Also habe ich also die Werte von a11,a12,a13,a21,a22,a23,a31,a32,a33 als x1, x2, x3, y1, y2, y3, z1, z2, z3.

Wenn ich nun einen bestimmten Rotationssatz betrachte (z. B. zuerst X, dann Y, dann Z), mit den entsprechenden Tait-Bryan-Winkeln --- a, b und c. Meine Rotationsmatrix wird die folgende sein. Rx(a)*Ry(b)*Rz(c) ---

( cos ( B ) cos ( C ) cos ( B ) Sünde ( C ) Sünde ( B ) cos ( A ) Sünde ( C ) + cos ( C ) Sünde ( A ) Sünde ( B ) cos ( A ) cos ( C ) Sünde ( A ) Sünde ( B ) Sünde ( C ) cos ( B ) Sünde ( A ) Sünde ( A ) Sünde ( C ) cos ( A ) cos ( C ) Sünde ( B ) cos ( C ) Sünde ( A ) + cos ( A ) Sünde ( B ) Sünde ( C ) cos ( A ) cos ( B ) )

Wenn ich nun nach den obigen Winkeln a, b & c (Nick, Gieren und Rollen) lösen muss, habe ich im Grunde neun Gleichungen, aber drei Unbekannte. Es folgen die Gleichungen ---

a11 =  cos(b)∗cos(c)
a12 = −cos(b)∗sin(c)
a13 =  sin(b)
a21 = cos(a)∗sin(c)+cos(c)∗sin(a)∗sin(b)
a22 = cos(a)∗cos(c)−sin(a)∗sin(b)∗sin(c)
a23 = −cos(b)∗sin(a)
a31 = sin(a)∗sin(c)−cos(a)∗cos(c)∗sin(b)
a32 = cos(c)∗sin(a)+cos(a)∗sin(b)∗sin(c)
a33 = cos(a)∗cos(b) 

Hier habe ich davon erfahren.

Jetzt verwende ich eine nichtlineare Kurvenanpassungsmethode der kleinsten Quadrate, um den obigen Satz überbestimmter Gleichungen zu lösen. Es gibt zwei Hauptprobleme, denen ich begegne

  1. Die Endwerte von a, b, c ändern sich, wenn ich die Anfangswerte im iterativen Algorithmus ändere. Ich erhalte unterschiedliche Ergebnisse, wenn ich mit [50 50 50] starte, und unterschiedliche Ergebnisse mit [0 0 0].
  2. Zweitens glaube ich nicht, dass die erhaltenen Werte korrekt sind; da die Nick-, Gier- und Rollwinkel im Video ziemlich unterschiedlich erscheinen. Ich verwende den Befehl lsqcurvefit (klicken Sie für die Frage, die ich auf stackoverflow gestellt habe) in Matlab . (klicken für Dokumentation)

Ich beschäftige mich schon seit einiger Zeit mit diesem Problem, wie man Pitch, Yaw & Roll berechnet. Ich denke, dieser Beitrag wird Ihnen alle Details darüber geben, was ich versucht habe. Ich brauche Ihre Hilfe, um herauszufinden, ob das, was ich tue, der beste Ansatz ist, um mein Problem anzugehen. Wenn ja, weisen Sie bitte darauf hin, was an meiner Methode falsch ist. Wenn Sie der Meinung sind, dass es andere einfachere Methoden gibt, lassen Sie es mich bitte wissen. Ich bin sicher, es muss eine bessere Methode geben, da dies eine ziemlich einfache Sache zu sein scheint.

Sollte ich meinen Matlab-Algorithmus ändern? Kennt jemand eine spezielle Matlab/Mathematica-Toolbox, die das Gieren, Nicken und Rollen berechnet?

Danke!

Antworten (2)

Verwenden

A 23 A 33 = cos B Sünde A cos A cos B = bräunen A A 13 A 23 2 + A 33 2 = Sünde B cos B Sünde 2 A + cos 2 A = bräunen B A 12 A 11 = cos B Sünde C cos B cos C = bräunen C

Dann bekommst du:

 a = atan2(-a23,a33)
 b = atan2(a13, sqrt(a23^2+a33^2) )
 c = atan2(-a12,a11)

Wenn ich nun einen bestimmten Rotationssatz betrachte (z. B. zuerst X, dann Y, dann Z), mit den entsprechenden Tait-Bryan-Winkeln --- a, b und c. Meine Rotationsmatrix wird die folgende sein ...

Sehen Sie sich dieses Array an. Es ist von der Form

cos ( B ) cos ( C ) cos ( B ) Sünde ( C ) Sünde ( B ) cos ( B ) Sünde ( A ) cos ( B ) cos ( A )

Notiere dass der A 13 Element hängt ab B nur: A 13 = Sünde ( B ) . Dadurch erhalten Sie sofort den Winkel B : B = arcsin ( A 13 ) . Seit cos B ist nicht-negativ für B In [ π / 2 , P ich / 2 ] , dem Bereich von Arkussinus(x), können die zwei Argumente arctangens verwendet werden, um Winkel zu berechnen A Und C : A = atan2 ( A 23 , A 33 ) Und C = atan2 ( A 12 , A 11 ) .


Update: Gimbal-Sperre

Das obige ist unvollständig. Nehme an, dass cos B ist Null. Das passiert wann B = ± π 2 , machen Sünde B = ± 1 . Die Matrix nimmt in diesen Fällen eine der beiden folgenden Formen an.

Wenn Sünde B = 1 , wird die Matrix

0 0 1 Sünde ( A C ) cos ( A C ) 0 cos ( A C ) Sünde ( A C ) 0

Wenn Sünde B = 1 , wird die Matrix

0 0 1 Sünde ( A + C ) cos ( A + C ) 0 cos ( A + C ) Sünde ( A + C ) 0

Beachten Sie, dass in beiden Fällen mehrere ( A , C ) Paare ergeben dieselbe Matrix. Wenn Sünde B = 1 , lässt sich aus der Matrix nur die Differenz ableiten A C : bräunen ( A C ) = A 21 A 22 in diesem Fall von Gimbal Lock. Wenn Sünde B = 1 , alles, was gefolgert werden kann, ist die Summe A + C : bräunen ( A + C ) = A 21 A 22 in diesem anderen Fall der Gimbal-Sperre. In beiden Fällen die Fähigkeit zur eindeutigen Identifizierung A Und C ist verloren. Eine Lösung besteht darin, einen dieser beiden Winkel willkürlich auf Null zu setzen. Es ist bequemer einzustellen C = 0 weil dann A kann berechnet werden als A = atan2 ( A 21 , A 22 ) in beiden Fällen.

Gimbal-Lock ist bei mehr als nur diesen beiden singulären Werten ein Problem, wenn die Matrix unter Verwendung von Arithmetik mit endlicher Genauigkeit (z. B. Arithmetik mit einfacher oder doppelter Genauigkeit) gebildet wird. Angenommen, die Matrix A wird durch Multiplikation zweier Transformationsmatrizen gebildet B Und C so dass die A 13 Element der Produktmatrix nahe bei plus oder minus eins liegt. Die nominell zur Berechnung verwendeten Elemente A Und C nahe Null sein, und diese nahe Null-Werte sind oft Gegenstand eines extremen Präzisionsverlusts. Winkel berechnen A Und C über die erste Prozedur ergibt Müllwerte. Es ist besser, solche Beinahe-Gimbal-Lock-Matrizen so zu behandeln, als wären sie tatsächlich kardanisch gesperrt.