Dies ist eine Fortsetzung dieser Frage :
Ich habe die Rotationsmatrix
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 ---
Meine Rotationsmatrix ist nichts anderes als die Spalteneinheitsvektoren der Achsen des gedrehten Rahmens, dh
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) ---
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
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!
Verwenden
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
Notiere dass der Element hängt ab nur: . Dadurch erhalten Sie sofort den Winkel : . Seit ist nicht-negativ für In , dem Bereich von Arkussinus(x), können die zwei Argumente arctangens verwendet werden, um Winkel zu berechnen Und : Und .
Update: Gimbal-Sperre
Das obige ist unvollständig. Nehme an, dass ist Null. Das passiert wann , machen . Die Matrix nimmt in diesen Fällen eine der beiden folgenden Formen an.
Wenn , wird die Matrix
Wenn , wird die Matrix
Beachten Sie, dass in beiden Fällen mehrere Paare ergeben dieselbe Matrix. Wenn , lässt sich aus der Matrix nur die Differenz ableiten : in diesem Fall von Gimbal Lock. Wenn , alles, was gefolgert werden kann, ist die Summe : in diesem anderen Fall der Gimbal-Sperre. In beiden Fällen die Fähigkeit zur eindeutigen Identifizierung Und ist verloren. Eine Lösung besteht darin, einen dieser beiden Winkel willkürlich auf Null zu setzen. Es ist bequemer einzustellen weil dann kann berechnet werden als 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 wird durch Multiplikation zweier Transformationsmatrizen gebildet Und so dass die Element der Produktmatrix nahe bei plus oder minus eins liegt. Die nominell zur Berechnung verwendeten Elemente Und nahe Null sein, und diese nahe Null-Werte sind oft Gegenstand eines extremen Präzisionsverlusts. Winkel berechnen Und ü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.