web-dev-qa-db-fra.com

Comment calculer l'angle à partir de la matrice de rotation

J'utilise deux images de l'objet unique l'objet est roated certain degré de sa première image.

J'ai calculé le POSE de chaque image et converti le vecteur de rotation en matrice à l'aide de Rodergues (). Maintenant, comment puis-je calculer et voir à quel point il est tourné depuis sa première position?

J'ai essayé de nombreuses façons mais les réponses étaient non étaient proches

EDIT: Ma caméra est fixe, seul l'objet bouge.

23
N.J

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

Étant donné une matrice de rotation 3 × 3

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 d'arc tangente, avec la vérification de quadrant, que vous trouvez 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 ligne, à l'exception de celui du coin inférieur, qui est 1 ou -1, seront 0 (cos (1) = 0). Une solution serait de fixer la rotation autour de l'axe des x à 180 ° et de calculer l'angle autour de l'axe des z à partir de: atan2 (r_12, -r_22).

Voir aussi https://www.geometrictools.com/Documentation/EulerAngles.pdf , qui inclut des implémentations pour six ordres différents d'angles d'Euler.

42
Krish

Si R est la matrice de rotation (3x3), alors 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 une probabilité de 90% que ce n'est pas ce que vous voulez.

11
Beta

Pour votre 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 ici

2
Curnane

Soit R1c et R2c 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 vers le cadre de la caméra (d'où le deuxième suffixe c). La matrice de rotation que vous souhaitez 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 vers la caméra, puis de la caméra vers la pose_2. Cette dernière rotation est l'inverse de la pose_2 à la caméra exprimée par R2c, d'où:

R12 = R1c * inv(R2c)

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

0
Francesco Callari