ti-enxame.com

Como calcular o ângulo da matriz de rotação

Estou usando duas imagens do objeto único, o objeto é roated certo grau a partir de sua primeira imagem.

Calculei o POSE de cada imagem e converti o vetor rotacional em Matrix usando Rodergues (). Agora, como faço para calcular e ver quanto é girado a partir de sua primeira posição?

Eu tentei de várias maneiras, mas as respostas não eram próximas

EDIT: Minha câmera está fixa, apenas o objeto está em movimento.

18
N.J

Podemos obter ângulos de Euler da matriz de rotação usando a seguinte fórmula.

Dada uma matriz de rotação 3 × 3

enter image description here

Os 3 ângulos de Euler são

enter image description here

enter image description here

enter image description here

Aqui atan2 é a mesma função tangente ao arco, com verificação de quadrante, normalmente encontrada em C ou Matlab.

Nota: Deve-se tomar cuidado se o ângulo ao redor do eixo y for exatamente +/- 90 °. Nesse caso, todos os elementos na primeira coluna e na última linha, exceto aquele no canto inferior, que é 1 ou -1, serão 0 (cos (1) = 0). Uma solução seria fixar a rotação em torno do eixo x em 180 ° e calcular o ângulo em torno do eixo z de: atan2 (r_12, -r_22).

Consulte também https://www.geometrictools.com/Documentation/EulerAngles.pdf , que inclui implementações para seis ordens diferentes de ângulos de Euler.

38
Krish

E se R é a matriz de rotação (3x3), então o ângulo de rotação será acos ((tr (R) -1)/2), em que tr (R) é o traço da matriz (ou seja, a soma dos elementos diagonais).

Foi isso que você pediu; Eu estimo uma chance de 90% de que não é o que você deseja.

10
Beta

Para sua referência, este código calcula os ângulos de Euler no 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];

Código fornecido por Graham Taylor, Geoff Hinton e Sam Roweis. Para mais informações, consulte aqui

2
Curnane

Seja R1c e R2c as 2 matrizes de rotação que você computou. Eles expressam as rotações do objeto nas poses 1 e 2, respectivamente, para o quadro da câmera (daí o segundo sufixo c). A matriz de rotação que você deseja é da pose 1 à pose 2, ou seja, R12. Para computá-lo, você deve girar, em sua mente, o objeto de pose_1 para a câmera e depois da câmera para pose_2. A última rotação é o inverso da pose_2 para a câmera expressa por R2c, portanto:

R12 = R1c * inv(R2c)

A partir da matriz R12, é possível calcular o ângulo e o eixo de rotação usando a fórmula de Rodiguez.

0
Francesco Callari