2014-01-28 15 views

Antwort

17

wie sehen, wie ich konnte nicht eine vorkompilierte Funktion finden, das dies tut, baute ich ein und hier ist es, falls jemand diese Frage in Zukunft findet

Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ()); 
Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY()); 
Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX()); 

Eigen::Quaternion<double> q = rollAngle * yawAngle * pitchAngle; 

Eigen::Matrix3d rotationMatrix = q.matrix(); 
+1

Schöne Antwort, aber wie @narcispr sagte, hängt die Achse davon ab, welche Anwendung Sie haben. Könnten Sie bitte in Ihrer Antwort angeben, dass Ihr Ziel Flugzeuganwendungen sind, um Verwirrung zu vermeiden? –

5

Alles, was Sie zum Erstellen einer Rotationsmatrix benötigen, ist die Tonhöhe, Gieren, Rollen und die Fähigkeit, Matrixmultiplikation durchzuführen.

Zuerst erstellen Sie drei Rotationsmatrizen, eine für jede Rotationsachse (dh eine für die Teilung, eine für das Gieren, eine für die Rotation). Diese Matrizen werden die Werte haben:

Pitch Matrix:

1, 0, 0, 0, 
0, cos(pitch), sin(pitch), 0, 
0, -sin(pitch), cos(pitch), 0, 
0, 0, 0, 1 

Yaw Matrix:

cos(yaw), 0, -sin(yaw), 0, 
0, 1, 0, 0, 
sin(yaw), 0, cos(yaw), 0, 
0, 0, 0, 1 

Roll-Matrix:

cos(roll), sin(roll), 0, 0, 
-sin(roll), cos(roll), 0, 0, 
0, 0, 1, 0, 
0, 0, 0, 1 

Als nächstes multiplizieren alles zusammen. Die Reihenfolge hier ist wichtig. Bei normalen Rotationen möchten Sie zuerst die Roll-Matrix mit der Yaw-Matrix multiplizieren und dann das Produkt mit der Pitch-Matrix multiplizieren. Wenn Sie jedoch versuchen, eine Drehung rückgängig zu machen, sollten Sie die Multiplikationen in umgekehrter Reihenfolge ausführen (zusätzlich zu den Winkeln mit entgegengesetzten Werten).

+0

Danke für die Antwort, ich wusste schon davon, aber ich hatte gehofft, dass die Bibliothek eine vorgefertigte Funktion hat, die das tut. – Caesar

+0

@MohammedMajeed Ich glaube nicht, dass es eine eingebaute Funktion gibt, aber siehe http://Stackoverflow.com/a/15043888/1530508 für eine sehr präzise Technik mit Quaternionen. – ApproachingDarknessFish

+0

Dies ist [dort] dokumentiert (http://eigen.tuxfamily.org/dox/group__TutorialGeometry.html#title3) – ggael

7

Wie kann ich eine Rotation erstellen Matrix mit Pitch, Gieren, Rollen mit Eigenbibliothek?

Es gibt 48 Möglichkeiten, dies zu tun. Welchen willst du? Hier sind die Faktoren:

  • extrinsischen Verus intrinsisch.
    Sind die Drehungen um die Achsen des festen Systems (extrinsisch) oder sind sie um die rotierten Achsen (intrinsisch)?

  • Rotation versus Transformation.
    Möchten Sie die Matrix darstellen, die ein Objekt physisch dreht, oder möchten Sie die Matrix darstellen, die Vektoren von einem Referenzrahmen in einen anderen transformiert?

  • Astronomische Sequenzen.
    Es gibt sechs grundlegende astronomische Sequenzen. Die kanonische Euler-Sequenz beinhaltet eine Rotation um die z-Achse, gefolgt von einer Rotation um die (gedrehte) x-Achse gefolgt von einer dritten Rotation um die (wieder rotierte) z-Achse. Es gibt fünf weitere diese astronomischen-style-Sequenzen (x-y-x, x-z-x, y-x-y, y-z-y und z-y-z) zusätzlich zu dieser kanonischen z-x-z Sequenz.

  • Luft- und Raumfahrtsequenzen.
    Um die Verwirrung zu verstärken, gibt es sechs grundlegende Aerospace-Sequenzen. Zum Beispiel eine Nick-Gier-Roll-Sequenz gegenüber einer Roll-Pitch-Gier-Sequenz.Während sich die Astronomiegemeinde ziemlich weitgehend auf eine Sequenz festgelegt hat, kann das Gleiche nicht von der Luft- und Raumfahrtgemeinschaft gesagt werden. Irgendwo auf dem Weg finden Sie Leute, die jede der sechs möglichen Sequenzen benutzen. Die sechs Sequenzen, die in dieser Gruppe sind x-y-z, x-z-y, y-z-x, y-x-z, z-x-y und z-y-x.
5

Caesar Antwort ist in Ordnung, aber wie David Hammen sagt, hängt es von Ihrer Anwendung ab. Für mich (unter Wasser oder UAVs Feld) die Gewinnkombination ist:

Eigen::Quaterniond 
euler2Quaternion(const double roll, 
        const double pitch, 
        const double yaw) 
{ 
    Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX()); 
    Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY()); 
    Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitZ()); 

    Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle; 
    return q; 
} 
+0

In den Hauptachsen der Flugzeuge ist Rolle Z, Pitch X und Yaw Y. Ist der Standard unter Wasser anders? http://en.wikipedia.org/wiki/Aircraft_principal_axes – Caesar

+0

@Caesar In meinem Fall habe ich eine Marienkäfer-Panorama-Kamera und die Achse sind die gleichen wie in dieser Antwort. –

Verwandte Themen