In einigen Quellen ist etwas los, was die Wichtigkeit der Reihenfolge der Anwendung von Rollen, Neigen und Gieren betrifft. Aber ich kann nicht verstehen, warum dies so ist.
Nehmen Sie Ihre rechte Hand: Zeigen Sie mit dem Daumen nach oben, dem Zeigefinger von Ihnen weg und dem Mittelfinger nach links. Sie haben jetzt ein rechtshändiges Koordinatensystem: Ihr Daumen ist die x-Achse, Ihr Zeigefinger die y-Achse und Ihr Mittelfinger die z-Achse.
Drehen Sie zuerst + 90 ° um die x-Achse (Daumen). Ihr Zeigefinger zeigt jetzt nach links und Ihr Mittelfinger zu Ihnen. Drehen Sie anschließend + 90 ° um die y-Achse (Zeigefinger). Ihr Daumen zeigt jetzt von Ihnen weg, Ihr Zeigefinger nach links und Ihr Mittelfinger nach oben.
Gehen Sie nun zurück in die Ausgangsposition und wenden Sie die gleichen zwei Umdrehungen in einer anderen Reihenfolge an die y-Achse und dann die x-Achse: + 90 ° um die y-Achse drehen (Zeigefinger). Ihr Daumen zeigt jetzt nach rechts, Ihr Zeigefinger von Ihnen weg und Ihr Mittelfinger nach oben. Drehen Sie anschließend + 90 ° um die x-Achse (Daumen). Ihr Daumen zeigt jetzt nach rechts, Ihr Zeigefinger nach oben und Ihr Mittelfinger zu Ihnen.
Dies unterscheidet sich vom letzten Ergebnis: Die Reihenfolge der Drehung ist wichtig.
Ich habe Beschleunigungsmesserwerte verwendet, indem ich sie in einige Formeln im Internet eingegeben habe (diese arktangenten Formeln, die jeder verwendet, aber niemand gut erklärt).
Wenn sich das Flugzeug mit einer konstanten Geschwindigkeit bewegt, der Beschleunigungsmesser misst nur die Beschleunigung aufgrund der Schwerkraft, die ein Vektor ist, der genau nach unten zeigt (0, 0, -g) im globalen Koordinatensystem. Dies gilt unabhängig von der Ausrichtung des Sensors immer.
Wenn der Sensor perfekt ausgerichtet ist, ist das lokale Koordinatensystem des Sensors auf das globale Koordinatensystem ausgerichtet, sodass der Sensor auch (0, 0, -g) misst.
Wenn der Sensor gekippt wird, hat der gemessene Vektor auch eine x- und eine y-Komponente.
Stellen Sie sich zur Vereinfachung den Fall vor, in dem der Sensor um die positive y-Achse geneigt ist.
Der Sensor misst jetzt eine x-Komponente sowie eine az-Komponente: (x, 0, -z).
Wie Sie dem folgenden Bild entnehmen können, ist der Drehwinkel θ = atan2 (x, z)
.
Der schwarze Pfeil ist die Erdbeschleunigung. und die roten und blauen Pfeile sind die x- und z-Achse des Koordinatensystems des (gekippten) Sensors.
Beschleunigungsmessermessungen sind jedoch nicht nützlich, um die Ausrichtung zu bestimmen, wenn der Sensor beschleunigt. weil dann der gemessene Vektor nicht mehr genau nach unten zeigt (im globalen Koordinatensystem).
Gyroskope messen die Winkelgeschwindigkeit. Durch die Integration der Winkelgeschwindigkeit erhalten Sie den Winkel.
Es gibt eine Einschränkung: Es ist unmöglich, genau zu integrieren, da wir nur Messungen zu diskreten Zeitpunkten durchführen. Dies bedeutet, dass wir so etwas wie die Euler-Methode verwenden müssen, die bekanntermaßen zu einer Drift der Orientierungsschätzung führt. Erschwerend kommt hinzu, dass die Messung verrauscht ist und dieses Rauschen ebenfalls integriert ist, was zu einem noch größeren Fehler führt.
Glücklicherweise können Sie beide unvollständigen Messungen mithilfe eines Sensors zu einer einzigen, besseren Orientierungsschätzung kombinieren Fusionsalgorithmus. Ich habe erfolgreich Sebastian Madgwicks Algorithmus für meinen Quadcopter verwendet.
Er verwendet die Messungen des Beschleunigungsmessers, um die Kreiseldrift zu minimieren.
Beachten Sie, dass dieser Algorithmus Quaternionen anstelle von Euler verwendet Winkel (Rollen, Neigen, Gieren), weil letztere unter kardanischer Verriegelung leiden und weil Quaternionen genealerweise weniger Rechenleistung erfordern.
Beachten Sie auch, dass Sie den Gierwinkel nicht mit dem Beschleunigungsmesser bestimmen können Machen Sie sich mit dieser Messung vertraut.
Es ist eine gute Idee, alle Ihre Berechnungen mit Quaternionen durchzuführen. Sie benötigen wahrscheinlich keine Euler-Winkel für Ihren Quadcopter, außer vielleicht zu Debugging-Zwecken.
Wenn Sie möchten, können Sie die Quaternion auch direkt aus dem Beschleunigungsvektor abrufen:
Quaternion quaternionFromDirection (Vec3f v) {/ * * Formel: * q = cos (ϑ / 2) + sin (ϑ / 2) · (x · i + y · j + z · k) * wobei (xyz) ein Einheitsvektor ist, der die Achse darstellt, um die * der Körper ist gedreht; ϑ ist der Winkel, um den es gedreht wird. * * Quelle: * https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Using_quaternion_as_rotations * * Die Rotationsachse (x y z) kann berechnet werden, indem das normalisierte * Kreuzprodukt von (0 0 1) und der angegebene Vektor genommen werden. Der Drehwinkel * ϑ kann mit | A × B | ermittelt werden = | A || B | · sin (ϑ). * / // Überprüfen Sie zuerst den Randfall, in dem v == (0 0 z), d. H. Vertikal, wenn (v.x == 0 && v.y == 0) {1, 0, 0, 0} zurückgibt; // Berechne das Kreuzprodukt und seine Norm. Vec3f cross = {v.y, -v.x, 0}; float crossNorm = cross.norm (); cross / = crossNorm; // Berechne den Winkel ϑ. Gleitwinkel = std :: asin (crossNorm / v.norm ()); // Berechne die resultierende Quaternion. return {std :: cos (Winkel / 2), // std :: sin (Winkel / 2) * cross.x, // std :: sin (Winkel / 2) * cross.y, // std :: sin (Winkel / 2) * cross.z, //}; }