2013-02-22 1 views
11

J'utilise deux images de l'objet unique, l'objet est tourné à certains degrés de sa première image.Comment calculer l'angle à partir de la matrice de rotation

J'ai calculé le POSE de chaque image et converti le vecteur rotationnel en matrice en utilisant Rodergues(). Maintenant, comment puis-je calculer et voir combien il est tourné de sa première position?

J'ai essayé plusieurs façons, mais les réponses ne se rapprochaient était

EDIT: Mon appareil photo est fixé que l'objet est en mouvement.

Répondre

26

Nous pouvons obtenir des angles de euler à partir de la matrice de rotation en utilisant la formule suivante.

Etant donné une matrice 3 × 3 de rotation

enter image description here

Les 3 angles d'Euler sont

enter image description here

enter image description here

enter image description here

Ici, atan2 est la même fonction de tangente d'arc, avec la vérification de quadrant, vous trouverez généralement dans C ou Matlab.

Remarque: Des précautions doivent être prises si l'angle autour de l'axe y est exactement de +/- 90 °. Dans ce cas, tous les éléments de la première colonne et de la dernière rangée, sauf celui du coin inférieur, qui est soit 1 soit -1, seront 0 (cos (1) = 0). Une solution consisterait à fixer la rotation autour de l'axe des x à 180 ° et à calculer l'angle autour de l'axe z à partir de: atan2 (r_12, -r_22).

Voir aussi http://www.soi.city.ac.uk/~sbbh653/publications/euler.pdf

+1

Merci beaucoup pour votre aide .. +1 –

+0

Existe-t-il également un moyen de déterminer dans quel ordre ces rotations doivent être appliquées pour réaliser cette matrice? –

7

Si R est le (3x3) matrice de rotation, l'angle de rotation sera acos ((tr (R) -1)/2), où tr (R) est la trace de la matrice (c'est-à-dire la somme des éléments diagonaux).

C'est ce que vous avez demandé; J'estime qu'il y a 90% de chances que ce ne soit pas ce que vous voulez.

+0

cela donne exactement une valeur scalaire correspondant à l'angle de rotation le long de ** quel axe **? –

+1

@SaravanabalagiRamachandran: Le vecteur propre de la matrice, bien sûr. Il suffit de résoudre (** R ** - ** I **) X = 0 pour X (où X et 0 sont des vecteurs). – Beta

0

Laissez R1c ​​et R2c être les 2 matrices de rotation que vous avez calculées. Ceux-ci expriment les rotations de l'objet dans les poses 1 et 2 respectivement au cadre de la caméra (d'où le second suffixe c). La matrice de rotation que vous voulez est de la pose 1 à la pose 2, c'est-à-dire R12. Pour le calculer, vous devez faire pivoter, dans votre esprit, l'objet de pose_1-à-caméra, puis de la caméra-à-pose_2. La dernière rotation est l'inverse de la pose_2 à la caméra espressed R2c, d'où:

R12 = R1c * inv(R2c)

de la matrice R12 vous pouvez calculer l'angle et de l'axe de rotation en utilisant la formule de Rodiguez.

1

À titre de référence, ce code calcule les angles d'Euler dans Matlab:

function Eul = RotMat2Euler(R) 

if R(1,3) == 1 | R(1,3) == -1 
    %special case 
    E3 = 0; %set arbitrarily 
    dlta = atan2(R(1,2),R(1,3)); 
    if R(1,3) == -1 
    E2 = pi/2; 
    E1 = E3 + dlta; 
    else 
    E2 = -pi/2; 
    E1 = -E3 + dlta; 
    end 
else 
    E2 = - asin(R(1,3)); 
    E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2)); 
    E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2)); 
end 

Eul = [E1 E2 E3]; 

code fourni par Graham Taylor, Geoff Hinton et Sam Roweis.Pour plus d'informations, voir here

Questions connexes