J'utilise deux méthodes pour faire pivoter un point p0
(un vecteur) dans l'espace 3D. J'ai le système de coordonnées du monde (WCS), montré en noir, et le système de coordonnées 1 (CS1), représenté en bleu, qui est défini pour être tourné de 10 degrés autour de l'axe z. Je calcule d'abord le cosinus directionnel entre WCS et CS1, en calculant des produits scalaires. Maintenant, je peux facilement calculer à la fois le quaternion et les angles d'Euler en utilisant dcm2quat
et dcm2angle
. Ensuite, je peux tourner le point p0
en utilisant à la fois quaternion et angles d'Euler.différents résultats utilisant des angles de quaternion et d'Euler
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').';
Mais à la fin, les résultats sont différents:
p1_1 =
0.9848 -0.1736 0
p1_2 =
0.9848 0.1736 0
Je comprends que l'utilisation des angles d'Euler peut entraîner une serrure Cardan et faire l'ambiguïté, mais dans ce cas, le résultat obtenu à l'aide quaternion est incorrect tandis que le résultat obtenu à partir des angles d'Euler est. Qu'est-ce que je rate? L'image suivante représente CS1 (bleu), WCS (noir), p0
(noir), p1_1
(bleu), p1_2
(rouge).