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).