2016-08-03 40 views
3

Ich verwende zwei Methoden, um einen Punkt p0 (ein Vektor) im 3D-Raum zu drehen. Ich habe das Weltkoordinatensystem (WCS) in Schwarz und das Koordinatensystem 1 (CS1) in blau, das um 10 Grad um die z-Achse gedreht ist. Ich berechne zuerst den Richtungskosinus zwischen WCS und CS1, indem ich Skalarprodukte berechne. Jetzt kann ich sowohl die Quaternion- als auch die Euler-Winkel unter Verwendung von dcm2quat und dcm2angle einfach berechnen. Dann kann ich den Punkt p0 mit Quaternion- und Euler-Winkeln drehen.verschiedene Ergebnisse mit Quaternion und Euler-Winkel

p0 = [1 0 0]; % point in world CS 
ijk = [1 0 0;0 1 0;0 0 1]; 
uvw1 = [0.9848 0.1736 0;-0.1736 0.9848 0;0 0 1.0000]; % CS1 
DC01 = [dot(uvw1(1,:),ijk(1,:)) dot(uvw1(1,:),ijk(2,:)) dot(uvw1(1,:),ijk(3,:)) 
     dot(uvw1(2,:),ijk(1,:)) dot(uvw1(2,:),ijk(2,:)) dot(uvw1(2,:),ijk(3,:)) 
     dot(uvw1(3,:),ijk(1,:)) dot(uvw1(3,:),ijk(2,:)) dot(uvw1(3,:),ijk(3,:))]; 

[rz, ry, rx] = dcm2angle(DC01,'ZYX'); 
q1 = dcm2quat(DC01); 

p1_1 = quatrotate(q1,p0); 
p1_2 = (rotz(rz*180/pi)*roty(ry*180/pi)*rotx(rx*180/pi)*p0').'; 

Aber am Ende der Ergebnisse sind unterschiedlich:

p1_1 = 
    0.9848 -0.1736   0 
p1_2 = 
    0.9848 0.1736   0 

Ich verstehe, dass Euler-Winkel mit in Gimbal Lock führen kann und Mehrdeutigkeit machen, aber in diesem Fall ist das Ergebnis quaternion unter Verwendung ist nicht korrekt während das aus den Euler-Winkeln erhaltene Ergebnis ist. Was vermisse ich? Das folgende Bild zeigt CS1 (blau), WCS (schwarz), p0 (schwarz), p1_1 (blau), p1_2 (rot).

Antwort

0

In MATLAB:

Wenn I direktionale Kosinus oder Quaternion, um den Punkt zu drehen, zu verwenden, am rotierenden I tatsächlich den Referenzrahmen:

pdc = (DC01*p0')' % rotation using directional cosine matrix 
pdc = 

    0.9848 -0.1736   0 

äquivalent zu:

p1_1 = quatrotate(q1,p0); 
p1_1 = 

    0.9848 -0.1736   0 

Auf der anderen Seite, mit Euler-Winkel und Rotationsmatrizen, kann ich einen Punkt (ein Vektor) w.r.t einem Koordinatensystem drehen:

p1_2 = (rotz(rz*180/pi)*roty(ry*180/pi)*rotx(rx*180/pi)*p0').'; 
p1_2 = 

    0.9848 0.1736   0 

Fazit: Quaternion oder direktionale Kosinus-Matrix, drehen wir die Koordinatensysteme während der Punkt (Vektor) fixiert bleibt. Mit Rotationsmatrizen können wir einen Vektor in ein Koordinatensystem drehen.