Quaternion umformung

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Quaternion umformung

Beitrag 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
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion umformung

Beitrag von meiwen »

Und hier noch das Bild ;)
Dateianhänge
Unbenannt3.PNG
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Quaternion umformung

Beitrag von dot »

Mir wird aus obiger Beschreibung leider nicht ganz klar, was nun genau dein Problem ist.
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion umformung

Beitrag 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 ;)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Quaternion umformung

Beitrag 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...
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Quaternion umformung

Beitrag 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
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Quaternion umformung

Beitrag 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.
Zuletzt geändert von CodingCat am 26.01.2013, 14:31, insgesamt 2-mal geändert.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Quaternion umformung

Beitrag 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...
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Quaternion umformung

Beitrag von dot »

Ach darum gings, das ist mir nicht aufgefallen...
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Quaternion umformung

Beitrag 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 ;-)
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion umformung

Beitrag 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
Dateianhänge
Unbenannt4.PNG
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Quaternion umformung

Beitrag 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 ;-)).
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Quaternion umformung

Beitrag 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.
Dateianhänge
rotation.png
rotation.png (4.29 KiB) 5324 mal betrachtet
meiwen
Beiträge: 14
Registriert: 23.10.2012, 00:01
Benutzertext: Hola

Re: Quaternion umformung

Beitrag 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 ;)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Quaternion umformung

Beitrag von dot »

Damit spiegelst du deine Rotationsachse um die yz-Ebene. ;)
Antworten