Kann ich Quaternionen verwenden, um einen Hubschrauber zu steuern?

9

Ich versuche, eine vereinfachte Hubschraubersimulation (im Moment ist es ein Würfel) in 3D zu erstellen, und ich habe einige Probleme mit der Rotation. Ein Hubschrauber kann sich entlang der drei Achsen drehen:

  • Mit dem hinteren Propeller auf sich selbst drehen: Drehung der y-Achse
  • Neigen Sie nach links und rechts, um nach links oder rechts zu gehen: Drehung der z-Achse
  • Kippen Sie nach oben und unten, um vorwärts oder rückwärts zu gehen: Drehung der x-Achse

Ich muss in der Lage sein, jede Achse einzeln zu steuern. Bisher habe ich versucht, Eulerwinkel zu verwenden, aber unabhängig von der Reihenfolge der Drehung stoße ich entweder auf ein kardanisches Schloss oder auf einige Achsen, die "Orte wechseln".

Ich muss anscheinend Quaternionen verwenden, aber ich weiß nicht, wie ich jede einzelne Achse steuern soll, da Quaternionen eine Richtung und einen Winkel verwenden. Soll ich drei Quaternionen erstellen und diese miteinander multiplizieren? Würde ich nicht die gleichen Probleme haben?

Das Seltsame ist, wenn ich mit meinem Finger die drei Achsen meines Hubschraubers darstelle (Daumen hoch = y, Index = z, Mitte = x), scheine ich nicht auf diese Probleme zu stoßen. Warum?

subb
quelle
Wenn Sie Zugriff auf ein Szenendiagramm haben, besteht eine praktikable Alternative darin, verschachtelte Container für jede Achse zu haben, die Sie dann einzeln drehen.
Bummzack
@ Bummzack, ja, ich habe darüber nachgedacht. Ist es jedoch nicht dasselbe wie drei Rotationsmatrizen in einer bestimmten Reihenfolge zu verketten?
Subb
Du hast Recht @Subb, versuche nicht, Rotationen für jede Achse separat zu speichern, es wird die gleichen Probleme wie bei Euler-Winkeln haben, egal was du dafür verwendest, auch Matrizen und Quaternionen leiden dann unter Gimbal Lock.
Maik Semder
@Maik Semder, wie kann ich dann die Neigung / das Gieren / Rollen meines Hubschraubers steuern?
Subb
@Subb @ Flip's und meine Antwort haben dir im Grunde gesagt, wie es geht.
Maik Semder

Antworten:

4

Sie sollten entweder eine Matrix oder eine Quaternion verwenden können, um die aktuelle Ausrichtung Ihres Hubschraubers zu speichern. Das Problem, auf das Sie stoßen, ist, wie Sie Änderungen in Pitch / Yaw / Roll auf den Hubschrauber anwenden.

Ich denke, Sie möchten in jedem Frame Pitch / Yaw / Roll auf den Hubschrauber im lokalen Raum anwenden. Sie können dies tun, indem Sie die Änderung von Nick / Gieren / Rollen für diesen Rahmen übernehmen und eine Rotationsmatrix erstellen (Sie können dies mit Eulerwinkeln tun). Anschließend drehen Sie die vorherige Ausrichtung des Hubschraubers um diese Matrix (wobei die vorherige Ausrichtung entweder als Matrix oder als Quaternion dargestellt wird). Sie erhalten die Orientierung für den neuen Rahmen.

Die Darstellung der Ausrichtung des Hubschraubers als Quaternion hat den Vorteil, dass die Interpolation zwischen Quaternionen viel einfacher ist als die Interpolation zwischen Matrizen. Wenn Sie also in Zukunft eine aktuelle Ausrichtung haben und die Rotation pro Frame herausfinden möchten, die Sie zu einem gewünschten Zeitpunkt zu einer neuen Ausrichtung bringt, ist die Quaternionendarstellung möglicherweise freundlicher für Sie.

Flip
quelle
So habe ich es gemacht, inkrementelle Aktualisierungen auf die Matrix anzuwenden, die die lokale -> Welttransformation darstellt. Denken Sie daran, die Matrix zu normalisieren. Nach einigen hundert Frames werden gerundete Artefakte angezeigt, wenn Sie dies nicht tun.
Patrick Hughes
Um die letzte Frage zu beantworten, warum das Problem der kardanischen Verriegelung nicht mit Ihrer Hand zur Darstellung von x / y / z-Achsen auftritt, wenden Sie wahrscheinlich die Werte für Neigung, Gieren und Rollen auf den lokalen Rahmen der Hand an Referenz. Die Konstruktion einer Rotationsmatrix mit Eulerwinkeln beginnt mit der Rotation um das x der Welt, dann mit dem resultierenden y und dann mit dem resultierenden z (die tatsächliche Reihenfolge von x / y / z kann sich in der Reihenfolge unterscheiden). Versuchen Sie, die Rotationen auf diese Weise anzuwenden, und Sie werden möglicherweise sehen, wie die Kardanverriegelung angezeigt wird.
Flip
3

Grundsätzlich können Sie jede andere Darstellung von Rotationen verwenden, außer Euler-Winkel. Matrizen, Quaternionen und sogar Achsenwinkel machen, was Sie wollen.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Sie haben Recht, Sie würden mit den gleichen Problemen enden. Der Schlüssel besteht darin, die aktuelle Ausrichtung (Matrix, Quaternion) Ihres Objekts zu speichern und beim Ändern der Ausrichtung nur ein Delta anzuwenden .

Wenn Sie 10 Grad um y drehen möchten, erstellen Sie einfach eine Delta- Matrix / Quaternion dafür und multiplizieren Sie diese mit Ihrer aktuellen Ausrichtung (wenn Sie die Post-Multiplikation für Matrizen verwenden). Wenn Sie es umgekehrt multiplizieren, dreht es das System um die y-Achse der Welt und nicht um die y-Achse des Objekts.

Ich finde diese Ressource sehr nützlich, sie kommt auch mit Quellcode und erklärt die Theorie sehr gut.

Maik Semder
quelle
-1

Das Problem, von dem ich denke, dass Sie es sehen, ist ein Unterschied in der Achsendrehung und den Geschwindigkeitsvektoren (und auch, dass Ihnen eine Richtung fehlt). Wenn sich ein Hubschrauber nach vorne neigt, um sich vorwärts zu bewegen, drückt der Antrieb der Hubschrauberblätter die Luft in einem senkrechten Winkel zu dem, was Sie als X-Achse bezeichnet haben, sowohl nach unten als auch nach hinten.

Sie haben einen vierten Freiheitsgrad, den Sie verpasst haben: Die Geschwindigkeit der Blätter steuert das Luftvolumen, das gedrückt wird, und auch den Auftrieb, den der Hubschrauber erzeugt.

Trotzdem steuern Ihre "Neigung nach links und rechts" und "Neigung nach oben und unten" im Allgemeinen den Hubschrauber in einem bestimmten Flugzeug. Das heißt, ein Hubschrauber sollte nicht nach unten fliegen, wenn er vorwärts, rückwärts oder zur Seite kippt - aber der Auftrieb muss sich möglicherweise ändern, und die Geschwindigkeit wird von der "gegenüberliegenden" Seite des durch gebildeten rechtwinkligen Dreiecks gesteuert Verbinden Sie den Hubschrauber mit einer geraden Linie nach unten (Schwerkraft) und der Hypotenuse (Lift) mit dem Boden. Das sollte Ihren Geschwindigkeitsvektor zur Verwendung geben.

Sie sollten in der Lage sein, Quaternionen zu verwenden, aber Ihre Quaternionswerte nicht auf der Neigung des Hubschraubers selbst basieren - versuchen Sie stattdessen, die vom Hubschrauber erzeugten Bewegungskräfte zu verwenden.

rauben
quelle
Das beantwortet die Frage allerdings nicht wirklich. Fügen Sie einfach mehr Denkanstöße hinzu.
Bummzack
Derzeit verwende ich die Drehung des Hubschraubers, um den Auftriebskraftvektor zu transformieren, der im Hubschrauberraum nach oben zeigt. Meinen Sie damit, dass ich das Gegenteil tun sollte, dh den Vektor direkt modifizieren und in der Folge den Hubschrauber drehen sollte?
Subb
Ich denke, Sie sollten beides tun, was Sie jetzt tun, und dann die daraus resultierenden Rotationsänderungen am Hubschrauber basierend auf der Normalität der Blätter vornehmen. Dh du hast 2 Umdrehungen; eine auf die Blätter und eine zweite auf die tatsächliche Drehung des Hubschraubers. Offensichtlich alle in Quaternions gespeichert.
verzögert