2016-08-03 4 views
3

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

Répondre

0

en Matlab:

Si je cosinus directionnel ou le quaternion afin de faire tourner le point, je suis en rotation en fait le cadre de référence:

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

    0.9848 -0.1736   0 

équivalent à:

p1_1 = quatrotate(q1,p0); 
p1_1 = 

    0.9848 -0.1736   0 

D'autre part, en utilisant des angles d'Euler et matrices de rotation, I peuvent tourner d'un point (un vecteur) w.r.t un système de coordonnées:

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

    0.9848 0.1736   0 

Conclusion: Utilisation de quaternion ou de la matrice de cosinus de direction, on fait tourner le système de coordonnées tandis que le point (vector) reste fixe. Considérant que, en utilisant des matrices de rotation, nous sommes capables de faire tourner un vecteur avec un système de coordonnées.