WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Vektorrotation mit Quaternionen

 

clarke
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 18:09     Titel: Vektorrotation mit Quaternionen
  Antworten mit Zitat      
Hallo zusammen,

ich befasse mich gerade mit dem Thema Quaternionen, die als Rotation für einen Vektor [x y z] dienen soll. Die Rotation mittels q eines Vektors p funktioniert über q*p*q^-1

Beispielwerte sind aus dieser Quelle (S. 7) entnommen.

Code:
q = [cosd(30) 0 0 -1];
p = 0;
p(2:4) = [0 2 6];

% Multiplikation q*p
t(1) = q(1)*p(1) - q(2)*p(2) - q(3)*p(3) - q(4)*p(4);
t(2) = q(1)*p(2) + q(2)*p(1) + q(3)*p(4) - q(4)*p(3);
t(3) = q(1)*p(3) - q(2)*p(4) + q(3)*p(1) + q(4)*p(2);
t(4) = q(1)*p(4) + q(2)*p(3) - q(3)*p(2) + q(4)*p(1);

% Inverse von q
norm_q = q(1)^2 + q(2)^2 + q(3)^2 + q(4)^2;
q_inv = q/norm_q;

% Multiplikation t*q_inv
s(1) = q_inv(1)*t(1) - q_inv(2)*t(2) - q_inv(3)*t(3) - q_inv(4)*t(4);
s(2) = q_inv(1)*t(2) + q_inv(2)*t(1) + q_inv(3)*t(4) - q_inv(4)*t(3);
s(3) = q_inv(1)*t(3) - q_inv(2)*t(4) + q_inv(3)*t(1) + q_inv(4)*t(2);
s(4) = q_inv(1)*t(4) + q_inv(2)*t(3) - q_inv(3)*t(2) + q_inv(4)*t(1);


1.) Der Vektor p muss ja noch um eine Dimension erhöht werden, ist es richtig die 0 an die Stelle p(1) zu schreiben?

2.) Mein Endergebnis lautet
Code:
s =

    5.9385    1.9795   -0.2857   -0.8571


Muss ich mit dem Realteil (5.93) noch irgendetwas tun oder vernachlässigt man diesen einfach und ( 1.9 -0.2 -0.8 ) ist der resultierende Vektor?

3.) Laut Beispiel müsste der finale Vektor s = [1.73 1 6] lauten, wo liegt denn hier mein Fehler? Ich habe als Zwischenergebis t:
Code:
t =

    6.0000    2.0000    1.7321    5.1962

wobei dies ja nur die Multiplikation von q*p ist, sowie die Reihenfolge vertauscht.

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.10.2015, 19:32     Titel:
  Antworten mit Zitat      
sooo ich hab mir das mal angeguckt.
also die rechnen nicht mit [cos30 0 0 -1] sondern mit [cos30 0 0 -0.5] der ist dann auch normiert. die 001 ist wahrscheinlich der vektor n und die haben das sin30 vergessen.... in dem paper fehlen öfter mal dinge. sin30 ist dann 0.5 darum ist das inverse weg. wenn man dann noch in deinem 2. teil die einträge richtig vertauscht und nicht falschrum kommt das ergebniss auch raus
Code:
q = [cosd(30) 0 0 -0.5];
p = 0;
p(2:4) = [0 2 6];

% Multiplikation q*p
t(1) = q(1)*p(1) - q(2)*p(2) - q(3)*p(3) - q(4)*p(4);
t(2) = q(1)*p(2) + q(2)*p(1) + q(3)*p(4) - q(4)*p(3);
t(3) = q(1)*p(3) - q(2)*p(4) + q(3)*p(1) + q(4)*p(2);
t(4) = q(1)*p(4) + q(2)*p(3) - q(3)*p(2) + q(4)*p(1);

% Inverse von q
norm_q = q(1)^2 + q(2)^2 + q(3)^2 + q(4)^2;
q_inv = [cosd(30) 0 0 0.5]/norm_q;

% Multiplikation t*q_inv

s(1) = t(1)*q_inv(1) - t(2)*q_inv(2) - t(3)*q_inv(3) - t(4)*q_inv(4);
s(2) = t(1)*q_inv(2) + t(2)*q_inv(1) + t(3)*q_inv(4) - t(4)*q_inv(3);
s(3) = t(1)*q_inv(3) - t(2)*q_inv(4) + t(3)*q_inv(1) + t(4)*q_inv(2);
s(4) = t(1)*q_inv(4) + t(2)*q_inv(3) - t(3)*q_inv(2) + t(4)*q_inv(1);

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 11:20     Titel:
  Antworten mit Zitat      
Hallo Winkow,

vielen Dank erstmal für deine Mühe.

Ich verstehe jedoch nicht, wieso sich jetzt bei q_inv(4) das Vorzeichen ändert. Kannst du deine Erklärung nochmal anders formulieren?

Weiterhin:

Winkow hat Folgendes geschrieben:
wenn man dann noch in deinem 2. teil die einträge richtig vertauscht und nicht falschrum kommt das ergebniss auch raus


wow, Respekt für dein Auge, dass du das so erkannt hast Wink

Ich habe auch noch eine anschließende Frage:
ich habe ja oben bei der Multiplikation von t = q*p die jeweils einzelnen Koeffizienten der Vektoren multipliziert. Wenn sich mein p aber nicht nur aus [0 X Y Z] zusammensetzt, sondern aus [0 (X-XM)^2/a^2 (Y-YM)^2/b^2 (Z-ZM)^2/c^2] dann wird doch beispielhaft für den ersten Wert von t statt
Code:
t(1) = q(1)*p(1) - q(2)*p(2) - q(3)*p(3) - q(4)*p(4);

das hier berechnet:
Code:
t(1) = q(1)*(p(1) - q(2)*(p(2)-XM)^2/a^2 - q(3)*(p(3)-YM)^2/b^2 - q(4)*(p(4)-ZM)^2/c^2;


oder?

(Kurze Hintergrundinfo: ich möchte nicht nur Koordinaten um einen Quaternion rotieren, sondern ein Ellipsoid mit der allg. Gleichung (X-XM)^2/a^2 ...)

Beste Grüße

Zuletzt bearbeitet von clarke am 06.10.2015, 11:27, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.10.2015, 11:22     Titel:
  Antworten mit Zitat      
Zitat:
Ich verstehe jedoch nicht, wieso sich jetzt bei q_inv(4) das Vorzeichen ändert.
weil das so in dem paper steht? 1.1.4
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 11:28     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
Zitat:
Ich verstehe jedoch nicht, wieso sich jetzt bei q_inv(4) das Vorzeichen ändert.
weil das so in dem paper steht? 1.1.4


Korrekt, ich danke dir Smile.

Ich hab meinen vorherigen Beitrag nochmal mit einer weiteren Rückfrage editiert, würdest du dir die Formel auch einmal fix ansehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.10.2015, 12:05     Titel:
  Antworten mit Zitat      
probier es doch aus.bau dir doch was zusammen wo du das ergebniss kennst nach der rotation.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 13:25     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
probier es doch aus.bau dir doch was zusammen wo du das ergebniss kennst nach der rotation.


Ja, das habe ich probiert. Ich habe einen Punkt genommen, der auf meinem Ellipsoid (Ursprung in -1,-1,-1 und Halbachsen 50,25,10) liegt und diesen mittels Euler Winkeln (alpha = 12°, beta = 40° und gamma = 81°) gedreht.
Die Werte lauten demnach
Code:

input = [-1 -1 -1 50 25 10 5 12*pi/180 40*pi/180 81*pi/180];

% functionsaufruf
xc      = Input(1);
yc      = Input(2);
zc      = Input(3);
xr      = Input(4);
yr      = Input(5);
zr      = Input(6);
n       = Input(7);
alpha   = Input(8);
beta    = Input(9);
gamma   = Input(10);

% Berechnung Ellipsoid
[x,y,z] = ellipsoid(xc,yc,zc,xr,yr,zr,n);

% Umformatierung der Matrizen
laenge = size(x,1) * size(x,2);
X = reshape(x,laenge,1);
Y = reshape(y,laenge,1);
Z = reshape(z,laenge,1);

% Punktwolke (ohne Rot)
P = [X Y Z];

% Drehung
Rx = [1 0 0; 0 cos(alpha) sin(alpha); 0 -sin(alpha) cos(alpha)];
Ry = [cos(beta) 0 -sin(beta); 0 1 0; sin(beta) 0 cos(beta)];
Rz = [cos(gamma) sin(gamma) 0; -sin(gamma) cos(gamma) 0; 0 0 1];

% Punktwolke (mit Rot)
P_rot = (Rz * Ry * Rx * P')';


P(2,:)


  -30.3893   -1.0000   -9.0902

P_rot(2,:)

   -5.6013   17.0312  -26.1859


Der Quaternion für die Winkel (12,40,81) lautet
Code:
q = 0.2956    0.1949    0.6341    0.6874


Also wenn ich jetzt die Rotation laut deines Codes von oben q*p*q^-1 durchführe, müsste für p = (-30.8 -1 -9.1) der Vektor (-5.6 17.0 -26.2) herauskommen.

Um die Parameter der Halbachsen (a,b,c) und die Ursprungsverschiebung (XM,YM,ZM) in die Berechnung einzufügen, habe ich es jetzt auf mehreren Wegen probiert. Die Einbindung von XM,YM,ZM ist noch denkbar für mich, nur wie die Parameter der Halbachsen dort mit hineinkommen, ist für mich schwer vorstellbar.

Versuch1: (Halbachse a wird für als Quotient des gesamtes Terms für t(2) genommen)
Code:
t(1) = (q(1)*p(1) - (q(2)*(p(2) - XM)^2) - (q(3)*(p(3) - YM)^2) - (q(4)*(p(4) - ZM)^2));
t(2) = (((q(1)*(p(2) - XM)^2) + (q(3)*(p(4) - ZM)^2) - (q(4)*(p(3) - YM)^2) + q(2)*p(1))/a^2 );
t(3) = (((q(1)*(p(3) - YM)^2) - (q(2)*(p(4) - ZM)^2) + (q(4)*(p(2) - XM)^2) + q(3)*p(1))/b^2 );
t(4) = (((q(1)*(p(4) - ZM)^2) + (q(2)*(p(3) - YM)^2) - (q(3)*(p(2) - XM)^2) + q(4)*p(1))/c^2 );

OUTPUT = 42.0571  152.0088  161.6368


Versuch2: (Halbachse a wird bei jedem entsprechenden Term von p(2)-XM drunter gesetzt.
Code:
t(1) = (q(1)*p(1) - (q(2)*((p(2) - XM)^2)/a^2) - (q(3)*((p(3) - YM)^2)/b^2) - (q(4)*((p(4) - ZM)^2)/c^2));
t(2) = ((q(1)*((p(2) - XM)^2)/a^2) + q(2)*p(1) + (q(3)*((p(4) - ZM)^2)/c^2) - (q(4)*((p(3) - YM)^2)/b^2));
t(3) = ((q(1)*((p(3) - YM)^2)/b^2) - (q(2)*((p(4) - ZM)^2)/c^2) + q(3)*p(1) + (q(4)*((p(2) - XM)^2)/a^2));
t(4) = ((q(1)*((p(4) - ZM)^2)/c^2) + (q(2)*((p(3) - YM)^2)/b^2) - (q(3)*((p(2) - XM)^2)/a^2) + q(4)*p(1));

OUTPUT =    0.2541    0.8666    0.0611


Die Berechnung von q_inv, s etc. erfolgt analog zu oben - dort müssen die Parameter ja nicht mehr berücksichtigt werden.

Ich habe als "Inspiration" diese Dissertation (S.82), wo die Rotation mittels Euler Winkeln geschieht und dabei auch nur um eine der Achsen (um Z). Gerade mit der vierten Dimension der Quaternionen kann ich die Einbindung der Halbachsenparameter nicht übertragen auf mein aktuelles Problem.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.