Seite 1 von 1

Quaternion umformung

Verfasst: 26.01.2013, 13:28
von meiwen
Hi,

ich muss gerade einen Quellcode nach vollziehen. Dabei werden Rotationen mit Quaternionen beschrieben.
Die Rotationen werden von einem Hardwaregerät gemessen, anschließend wird ein virtueller Körper damit bewegt.
Das Problem an der Geschichte ist, die Koordinatensysteme sind unterschiedlich. Ich habe eine Zeichnung angehängt in dem Beide Koordinatensysteme eingezeichnet sind.

Der virtuelle Körper liegt ursprünglich auf der X-Achse des 2ten Koordinatensystems.

Im Code wird folgende Umformung gemacht um die Rotation abzubilden:

Code: Alles auswählen

	q2.r = q1.r;
		q2.x = q1.y;
		q2.y = q1.z;
		q2.z = q1.x;
q2 = q3 * q2;
Dabei ist q1 die Quaternion aus dem Inputkoordinatensystem, q2 die Quaternion welche schlußendlich die Rotation ausführen soll, q3 eine Quaternion die eine Drehung um -90° um die X-Achse ausführt. Bei der Quaternion wird von folgender Darstellung ausgegangen:
Quat ( r,x,y,z) wobei x,y,z den Imaginärteil beschreiben.

Das scheint dabei eine Art Transformation vom Inputkoordinatensystem zum 2ten System zu sein. Der Code funktioniert und der Körper vollzieht die Bewegungen korrekt, allerdings verstehe ich nicht wie die Transformation hier funktioniert??

Cheers Meiwen

Re: Quaternion umformung

Verfasst: 26.01.2013, 13:29
von meiwen
Und hier noch das Bild ;)

Re: Quaternion umformung

Verfasst: 26.01.2013, 13:45
von dot
Mir wird aus obiger Beschreibung leider nicht ganz klar, was nun genau dein Problem ist.

Re: Quaternion umformung

Verfasst: 26.01.2013, 13:49
von meiwen
Mein erstes Problem liegt an der Stelle:
q2.r = q1.r;
q2.x = q1.y;
q2.y = q1.z;
q2.z = q1.x;

Was genau passiert mit meiner Quaternion wenn einfach Werte getauscht werden. Ist das überhaupt eine legitime Vorgehensweise?
Ich glaube wenn ich das verstanden habe, ist mir vermutlich schon mal ein großes Stück weiter geholfen.
Es ist eine sehr verwirrende Problemkonstellation. Also zumindest für mir ;)

Re: Quaternion umformung

Verfasst: 26.01.2013, 13:51
von dot
Wo werden da Werte getauscht!? Mir sieht das einfach danach aus, als würden q2 die Werte von q1 zugewiesen. q2 ist danach eben die selbe Quaternion wie q1...

Re: Quaternion umformung

Verfasst: 26.01.2013, 14:25
von Stephan Theisgen
Nur gerade ganz kurz, da ich nicht mehr Zeit habe...

Erinnere Dich an die Representation einer Drehung als Drehwinkel um eine Drehachse. Damit lässt sich jede Drehung beschreiben. Auf Wikipedia findest Du die Übersetzung dieser Darstellung in einen Quaternion, wobei die Imaginärteile die Drehachse enthalten. Tauschst Du also die x,y,z-Werte der Quaternionen, dann machst Du den Übergang vom einen in das andere Koordinatensystem.

Stell Dir vor Du willst um den Vektor (0, 1, 0) im ersten System, also um die grüne Y-Achse drehen, jetzt willst Du das im zweiten System ausdrücken, dann muss nach Deiner Zuweisung der Rotationsvektor (0, 0, 1) Drehung um die blaue Z-Achse resultieren, genau das passiert:

q1.x = q2.z; q1.y = q2.x; q1.z = q2.y; hier wird y -> z zugewiesen, die anderen Zuweisungen spielen in diesem Spezialfall keine Rolle.

Du kannst Dir auch folgendes vorstellen: Dreh das untere Bild unten um 90° dann schreib Dir die Achsenbezeichnungn dran, dann siehst Du das y(grün) mit z(blau) gleich zusetzen ist und dass x(rot) mit y(grün) und z(blau) mit x(rot) gleich zu setzten sind, da bekommst Du genau die Formeln von oben. Irgendwo steckt jetzt bei Dir noch die Rotation um 90° drin in dem Code... Keine Ahnung wo, dass kann ich jetzt so schnell nicht erfassen...

Hoffe das hilft schonmal weiter

Re: Quaternion umformung

Verfasst: 26.01.2013, 14:26
von CodingCat
x, y und z einer Quaternion entsprechen einfach der skalierten Rotationsachse, insofern bedeutet deren Vertauschung für die Rotation dasselbe, wie wenn du dieselbe Vertauschung am Vektor der Rotationsachse vornimmst. Auf den ersten Blick scheinen mir deine beiden Koordinatensysteme in der Zeichnung jedoch nicht zu dieser Vertauschung zu passen.

Oh, Stephan war schneller. Und er hat Recht (im Post untendrunter), da q3 im zweiten Codesnippet gefehlt hat, habe ich diese ebenfalls überlesen.

Re: Quaternion umformung

Verfasst: 26.01.2013, 14:27
von Stephan Theisgen
-90° um die X-Achse ausführt
Ah, das hatte ich in der Schnelle überlesen, das sollte dann die fehlende Rotation um 90° sein...

Re: Quaternion umformung

Verfasst: 26.01.2013, 14:38
von dot
Ach darum gings, das ist mir nicht aufgefallen...

Re: Quaternion umformung

Verfasst: 26.01.2013, 14:51
von Stephan Theisgen
dot hat geschrieben:Ach darum gings, das ist mir nicht aufgefallen...
Wenn Ihr wüßtet, wie häufig sowas mir schon schlaflose Nächte beschert hat. Ich habe dann den Quellcode tausendmal gelesen und war der festen Überzeugung alle Zuweisungen stimmen...Menschen sind zum Glück (oder leider) fehlertollerant ;-)

Re: Quaternion umformung

Verfasst: 26.01.2013, 17:27
von meiwen
Hey,

vielen Dank für die hilfreichen Antworten. Damit komme ich dem Verständnis schon etwas näher. Um das Ganze aber wirklich zu verstehen würde ich gerne selbst die Umformung des Koordinatensystems machen.
Laut meinem aktuellen Verständnis sollte das nämlich auch einfacher gehen.
Ich würde die Umformung wie im Anhang aufgezeichnet machen:
x = -x
y = z
z = y
Wenn die Achsen
x = Rot
y = Grün
z = Blau
sind.
Passt aber leider nicht :(
Irgendwas mache ich da schon wieder falsch...
Wenn es nicht zu viel Arbeit ist, was wäre den eurer Meinung nach die schnellste/ einfachste / performanteste Lösung?

Cheers Meiwen

Re: Quaternion umformung

Verfasst: 26.01.2013, 18:25
von Stephan Theisgen
Hi!

Nein, nein, nicht einfach x zu -x machen. Das ist keine Drehung, das ist eine Spiegelung! Wenn Du das machst, änderst Du das Koordinatensystem von linkshändisch zu rechtshändig oder umgekehrt. Dann musst Du ggf. die Quaternionen-Multiplikation umdrehen, den Drehwinkel spiegeln, oder andere komische Sachen machen! Das funktioniert vielleicht, aber das überblicke ich dann auch nicht mehr so einfach.

Am leichtesten ist, Du zeigst mal den -90°-x-Drehungsquaternion, zusammen mit der Quaternionenmultiplikation sollte das vereinfachte Formeln geben...
Einfach mal alles konsequent durch aufschreiben und dann vereinfachen. In der Mathematik lässt sich nicht schummeln (naja vielleicht manchmal, aber nur sehr schwer ;-)).

Re: Quaternion umformung

Verfasst: 26.01.2013, 18:46
von Stephan Theisgen
Also hier das ganze mal visualisiert, ohne irgendwelche Spiegelungen, die brauchst Du nicht, da beide System einfach durch Drehung ineinander überführbar sind:

(siehe Anhang)

Wenn Du jetzt den Quaternion für die erste Rotation 180° um Z und dann den für die zweite, also -90° um X aufschreibst und miteinander multiplizierst, dann erhältst Du den Quaternion für die Drehung zum neuen System (nennen wir in q). Dieser hat eine Menge 0en und 1en (weil die Rotationen alle 180° oder 90° und nur um Koordinatenachsen sind), so daß Du insgesamt eine recht einfach Gleichung rausbekommst. Für die Umrechnung eines Quaternions p im einen System in einen Quaternion s im neuen System haben wir s = q*p oder umgekehrt. Wenn Du dass dann einfach ausschreibst, hast Du Deine Gleichungen für oben, für den Code, die sollten ja wie o.g. recht einfach und performant aussehen.

Re: Quaternion umformung

Verfasst: 03.02.2013, 19:09
von meiwen
Hi,

also ich hab jetzt alles versucht, inklusive der Lösung von Stephan, aber ich komme ohne Spiegelung nicht zu einer Umformung. Ich habe heute schon wieder einen halbenTag darauf verwendet es nach zu vollziehen. Was mir vermutlich schon sehr helfen würde, wäre zu verstehen was passiert wenn ich folgendes mache:
Ich habe eine Quaternion.
Q(w,x,y,z) und negiere meinen x Wert:
Q.w = Q.w
Q.x = -Q.x
Q.y = Q.y
Q.z = Q.z
Ich wäre echt dankbar wenn jemand dazu eine Lösung hätte. Bin langsam am durchdrehen mit diesen Drehungen hier ;)

Re: Quaternion umformung

Verfasst: 03.02.2013, 19:32
von dot
Damit spiegelst du deine Rotationsachse um die yz-Ebene. ;)