Konventionen für Eulersche Winkel.

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Konventionen für Eulersche Winkel.

Post by shoogen »

Wenn ich mich richtig an meine Schulmathematik erinnere, dann werden Transformationsmatrizen von rechts nach links abgearbeitet. Was FreeCAD angeht komme ich damit auch ganz gut klar. Nur bei Eulerschen Winkeln bin ich bisher gescheitert.
Ich bin inzwischen der Überzeugung das es sich um einen Bug in FreeCAD handeln muss.
Aus src/Base/Rotation.cp (Zeilennummern gemäß git commit eed06ccc)

Code: Select all

(WM 2009-10-10 23:46:49  380)     // taken from http://www.resonancepub.com/quaterni.htm
(WM 2009-10-10 23:46:49  381)     // The Euler angles (yaw,pitch,roll) are in ZY'X''-notation
(WM 2009-10-10 23:46:49  398)     // see also http://willperone.net/Code/quaternion.php
Die Links sind leider inzwischen tot. So dass ich die Formeln nicht nachvollziehen kann.
Aber ein Test bringt nicht das gewünschte (ZY'X'') Ergebnis

Code: Select all

>>> r=FreeCAD.Rotation(FreeCAD.Vector(1,0,0),5).multiply(FreeCAD.Rotation(FreeCAD.Vector(0,1,0),26).multiply(FreeCAD.Rotation(FreeCAD.Vector(0,0,1),13)))
>>> r.toEuler()
(16.61487432199235, 23.94782433334272, 11.560996572791797)
Stattdessen scheint die Ausführungsreihenfolge genau umgehrt zu sein (XY'Z'')

Code: Select all

>>> r=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),3).multiply(FreeCAD.Rotation(FreeCAD.Vector(0,1,0),26).multiply(FreeCAD.Rotation(FreeCAD.Vector(1,0,0),5)))
>>> r.toEuler()
(2.999999999999999, 26.000000000000007, 4.999999999999999)
Also entweder ich multipliziere falsch, oder die Dokumentation/der Kommentar ist falsch (wobei (XY'Z'') mir wenig verbreitet erscheint), oder die Formeln sind falsch (z.B. weil sie für die inverse Transformation gedacht waren).
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: Koventionen für Eulersche Winkel.

Post by wmayer »

Letztlich ist es egal, für welche Notation man sich entscheidet, es findet sich immer ein Beispiel, warum gerade die Implementierte nicht geeignet ist.
Ich bin inzwischen der Überzeugung das es sich um einen Bug in FreeCAD handeln muss.
Nein, es ist schon richtig, denn:

Hat man die (lineare) Abbildungen A, B und C und führt diese nacheinander in dieser Reihenfolge aus, dann schreibt man tatsächlich: A o B o C, d.h. man schreibt und liest von links nach rechts. "o" heißt hier "verknüpft mit".
Die Matrizen M, mit denen man die obigen Abbildungen beschreibt, werden allerdings von rechts nach links multipliziert. Also wenn man die zugehörige Matrix Md zur Gesamtabbildung D berechnet, so gilt:
Md = Mc * Mb * Ma

Wenn man die Beschreibungen zu den einzelnen Notationen in der Wikipedia durchliest, dann wird es dort genauso gehandhabt. Allerdings werden die Verknüpfungen so geschrieben: z.B. (z,x',z'')
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Koventionen für Eulersche Winkel.

Post by shoogen »

Hallo Werner, danke für die Erklärung zwischen der Reihenfolge von Verknüpfung und Matrixmultiplikation.
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Koventionen für Eulersche Winkel.

Post by shoogen »

Die OCCT doku sagt:
Two specific values provided for most frequently used conventions: proper Euler angles (intrinsic ZXZ) and yaw-pitch-roll (intrinsic ZYX).

Code: Select all

>>> FreeCAD.Rotation(13,26,5).Q # x,y,z,w
(0.01678727491603545, 0.22810360716364161, 0.1004476870733395, 0.9682960259969289)

Code: Select all

    q.Set(0.01678727491603545, 0.22810360716364161, 0.1004476870733395, 0.9682960259969289); // x,y,z,w
    q.GetEulerAngles(gp_Intrinsic_ZYX, alpha,beta, gamma);
    std::cout << "Intrinsic: " << alpha / M_PI * 180.0 << "," <<  beta / M_PI * 180.0
              << "," << gamma / M_PI * 180.0 << std::endl;
Intrinsic: -0.851967,26.4308,12.045
Zum Vergleich

Code: Select all

>>> FreeCAD.Rotation(FreeCAD.Vector(1,0,0),5).multiply(FreeCAD.Rotation(FreeCAD.Vector(0,1,0),26).multiply(FreeCAD.Rotation(FreeCAD.Vector(0,0,1),13)))
Rotation (0.06766916507860499, 0.21848101129786085, 0.11994599260380681, 0.9660744746954637)

Code: Select all

    q.Set(0.06766916507860499, 0.21848101129786085, 0.11994599260380681, 0.9660744746954637);
    q.GetEulerAngles(gp_Intrinsic_ZYX, alpha,beta, gamma);
    std::cout << "Intrinsic: " << alpha / M_PI * 180.0 << "," <<  beta / M_PI * 180.0
              << "," << gamma / M_PI * 180.0 << std::endl;
    q.GetEulerAngles(gp_Extrinsic_ZYX, alpha,beta,gamma);
    std::cout << "Extrinsic: " << alpha / M_PI * 180.0 << "," <<  beta / M_PI * 180.0
              << "," << gamma / M_PI * 180.0 << std::endl;
Intrinsic: 5,26,13
Extrinsic: 13,26,5
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Koventionen für Eulersche Winkel.

Post by shoogen »

wmayer wrote:Nein, es ist schon richtig
I'm not convinced. issue #2007
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: Koventionen für Eulersche Winkel.

Post by wmayer »

You are not convinced == bug :?:
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Koventionen für Eulersche Winkel.

Post by shoogen »

Du kannst dem Kommentar in Quelltext ja von Z'Y'X'' nach XY'Z'' ändern. Dann ist das zwar nicht wirklich Yaw-pitch-roll, aber da die Funktionen nur in c++ so heißen und in python nur "Euler" ist das streng genommen nicht falsch. (Auch wenn ich heute auf eine Definition gestoßen bin die sagt, dass die Tait–Bryan Fälle keine "echten" Euler Konventionen sind)

EDIT: Beispiel für Literatur, die yaw,pitch,roll verspricht, aber die Euler Konvention nicht benennt. http://planning.cs.uiuc.edu/node103.html
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: Koventionen für Eulersche Winkel.

Post by wmayer »

OK, ich bin mal die ganzen Beispiele durchgegangen und sehe jetzt, auf was Du hinaus wolltest.
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Koventionen für Eulersche Winkel.

Post by shoogen »

wmayer wrote:und sehe jetzt, auf was Du hinaus wolltest.
Prima. Ich sehe ein, dass es vermutlich mehr schaden würde als nutzen, die Rotation.__repr__ methode zu verändern. Wenn wir an allen stellen auf die jetzt verwendet Konvention hinweisen, können wir meiner Meinung nach das Ticket schließen. Ich hab da auch schon ein Branch vorbereitet. https://github.com/FreeCAD/FreeCAD_sf_m ... ocfix-2007 Da die Änderung in placement.ui die Übersetzungen nutzlos macht, wäre es wohl sinnvoller, das erst nach der 0.15 release zu mergen.

Langfristig könnte ich mir vorstellen sowohl im Placement Dialog als auch in Python die (ZY'X'') und (ZX'Z'') Konventionen hinzuzufügen. Aber das wäre dann ein Feature ;)
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: Konventionen für Eulersche Winkel.

Post by wmayer »

Langfristig könnte ich mir vorstellen sowohl im Placement Dialog als auch in Python die (ZY'X'') und (ZX'Z'') Konventionen hinzuzufügen. Aber das wäre dann ein Feature
Ich habe mal in einem lokalen Branch die ZY'X''-Konvention implementiert.

Am besten fügt man der Rotation-Klasse ein enum mit den gängigsten Konvention hinzu. Die Methoden getYawPitchRoll/setYawPitchRoll könnte man in get[Euler]Angles()/set[Euler]Angles() umbenennen und als Argument gibt man einen Wert des enums an, um dann die Winkel in der gewünschten Konvention zu setzen/abfragen. Somit hat man größtmögliche Flexibilität.
Post Reply