2015-03-28 1 views
1

J'utilise la fonction MATLAB angle2dcm qui me donne des résultats différents de ce que je m'attendais. En creusant dans le code (angle2dcm.m) j'ai trouvé la définition de la formation de la matrice de rotation est différente de la norme.Matlab angle2dcm définition différente

Par exemple, la rotation Rx Ry Rz (ordre à-dire 'xyz') est défini comme:

%  [   cy*cz, sz*cx+sy*sx*cz, sz*sx-sy*cx*cz] 
%  [   -cy*sz, cz*cx-sy*sx*sz, cz*sx+sy*cx*sz] 
%  [    sy,   -cy*sx,   cy*cx] 

alors que normalement il devrait être (s'il vous plaît se référer au lien): http://inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/

Est-ce une définition différente de la direction de la matrice de cosinus et de la matrice de rotation? Merci!

Répondre

0

C'est un problème avec les conventions de notation, puisque les deux cas (MATLAB versus le lien que vous avez publié) se réfèrent à des ordres de rotation opposés. Si vous souhaitez utiliser la fonction Matlab et continuer à utiliser la convention à partir du lien que vous avez publié, comme solution de contournement possible, vous pouvez appeler la fonction avec « zyx » et inverser les signes de tous les angles, à savoir

dcm = angle2dcm(-r1, -r2, -r3,'xyz');  *EDITED* 

qui utilise la matrice de rotation suivante (voir documentation Matlab)

  [   cy*cz, sz*cx+sy*sx*cz, sz*sx-sy*cx*cz] 
     [   -cy*sz, cz*cx-sy*sx*sz, cz*sx+sy*cx*sz] 
     [    sy,   -cy*sx,   cy*cx] 

Si cela vous confondez pourrait même tout envelopper dans une fonction d'aide qui fait l'inversion de signe et de l'ordre pour vous, quelque chose comme

function dcm = angle2dcm_mines(r1, r2, r3); 
dcm = angle2dcm(-r1, -r2, -r3,'xyz'); 

Il existe d'autres façons de contourner cela, mais cela devrait fonctionner.

+0

un petit commentaire: l'ordre par défaut pour la fonction Matlab angle2dcm est 'zyx'. Pour inverser l'ordre, 'xyz' peut être utilisé. –

+0

@ linzhang.robot merci pour votre commentaire, j'ai fait un montage. J'espère que ça va maintenant. –

0

Je me bats avec cela depuis un moment maintenant et, grâce à des messages comme celui-ci, j'ai (presque) réussi à m'en débarrasser. voici ma valeur de deux qui, je l'espère, aide et rend quelque chose. C'est une douleur parce qu'il y a 24 ensembles d'options pour l'application des angles euler (terme général, mais il existe diverses variantes, y compris tait-bryant, pitch-yaw-roll, etc.) en fonction de l'ordre dans lequel les rotations sont appliqué, que la dernière rotation soit ou non à peu près du même axe que la première et qu'elle soit intrinsèque ou non (c'est-à-dire que le cadre tourne et que les rotations suivantes soient appliquées) ou extrinsèque (toutes les rotations sont appliquées/cadre du monde). il y a quelques ensembles plus communs tels que (extrinsèque) XYZ et ZXZ.

Il est important de noter que la matrice de rotation (aka direction cosinus) pour XYZ est équivalente à zyx (intrinsèque) et c'est une règle commune (c'est-à-dire changer les première et dernière rotations). en termes de matrice de rotation, cela se manifeste en prenant sa transposition et en changeant le signe des fonctions du péché. MATLAB utilise l'approche de rotation intrinsèque. Notez qu'en termes de rotations individuelles, elles sont appliquées par prémultiplication, la première rotation étant la plus à droite.