Problema al reconstruir la rotación desde los ángulos de Euler

Tengo una matriz de rotación R:

R=[[-0.22247682, -0.32863132, -0.91788099],
   [-0.01426572, -0.94027818,  0.34010798],
   [-0.9748336 ,  0.08876037,  0.20450194]]

y quiero descomponer esto en tres rotaciones, R Z ( α ) R X ( β ) R Z ( γ ) , donde considero rotaciones en el sentido de las agujas del reloj. La matriz de rotación en términos de estos ángulos de Euler viene dada por

R =

[ porque α porque γ pecado α porque β pecado γ pecado γ porque α pecado α porque β porque γ pecado α pecado β pecado α porque γ + pecado γ porque α porque β pecado α pecado γ + porque α porque β porque γ porque α pecado β pecado β pecado γ pecado β porque γ porque β ]

Entonces, calculo β = arccos ( R 33 ) = 1.36 , α = arcán ( R 13 / R 23 ) = 1.22 , y γ = arcán ( R 31 / R 32 ) = 1.48 . Como doble verificación, reconstruyo la matriz R a partir de estos ángulos de Euler y encuentro lo siguiente:

R'=[[ 0.22247682,  0.32863132, -0.91788099],
    [ 0.01426572,  0.94027818,  0.34010798],
    [ 0.9748336 , -0.08876037,  0.20450194]])

Revisé todo dos veces, pero no puedo encontrar cuál es el problema. ¿Qué me podría estar perdiendo?

Editar: resulta que el problema de transposición se debió a que mi código python tenía algún problema de indexación. Sin embargo, los problemas de la señal aún persisten. Actualicé la matriz R'anterior.

¿Estás seguro de la consistencia de la dirección CW/CCW?
@GCab Creo que sí, derivé la fórmula para verificar dos veces. Pero en cualquier caso, la solución de los ángulos de Euler viene de la matriz que escribí arriba.
R = R T , lo que sugiere que obtuviste algo al revés en tu cálculo.
Usar a t a norte 2 ( y , X ) función en su lugar.
@ja72 ¿Como se define en C/C++? ¿Qué hace diferente al arctan de numpy?
@sodiumnitrate por eso pongo los argumentos. A veces lo es atan2(dx, dy)ya veces atan2(dy, dx).

Respuestas (2)

He confirmado la expresión de la matriz de rotación, pero extraería los ángulos de manera un poco diferente a usted.

  • γ = a t a norte 2 ( R 31 , R 32 ) = 1.4799948857740634
  • β = a t a norte 2 ( R 31 2 + R 32 2 , R 33 ) = 1.3648414591977873
  • α = a t a norte 2 ( R 13 , R 23 ) = 1.9256476493782756

donde atan2(dy,dx)es el arco tangente que cubre todo el círculo unitario.

La reconstrucción es así

R = RZ(1.2159450042115176)*RX(1.3648414591977873)*RZ(-1.4799948857740634)

1) Tu cálculo de los ángulos es correcto, aparte de la indeterminación en los signos.

De porque β puedes deducir ± β . De broncearse α puedes deducir ( α , α π , α + π ) , y lo mismo para γ .

Luego deberá verificar las suposiciones con los otros elementos de la matriz inicial.

Tomando β = 1.36 entonces porque β y pecado β son positivos. De R [ 1 , 3 ] y R [ 2 , 3 ] luego sigue que porque α y pecado α serán ambas negativas: entonces α = 1.22 π .

Para γ = 1.48 los signos de R [ 3 , 1 ] y R [ 3 , 2 ] son correctos

2) Las matrices de rotación elemental, definidas de acuerdo con este artículo de Wikipedia, por lo tanto, pre-multiplicación, en sentido antihorario y derecha en particular, son

R X ( α ) = ( 1 0 0 0 porque α pecado α 0 pecado α porque α ) R y ( β ) = ( porque β 0 pecado β 0 1 0 pecado β 0 porque β ) R z ( γ ) = ( porque γ pecado γ 0 pecado γ porque γ 0 0 0 1 )

3) Aplicando estas matrices y los ángulos corregidos, obtengo que

R z ( α ) R X ( β ) R z ( γ )
devuelve correctamente la matriz inicial.

El resultado que está obteniendo, además de signos, es la transposición de la matriz original, lo que significa que probablemente no esté utilizando las matrices elementales correctas.

Gracias. ¿No debería haber dos casos: { α , α + π } ?
@sodiumnitrate: depende de la convención adoptada para el rango de ángulo: estoy considerando el π < α π . Por cierto, ¿descubriste por qué estás recibiendo transponer?
No debería porque ( α π ) = porque ( α + π ) porque porque ( X ) es 2 π -¿periódico? La transposición fue un error de indexación en mi código python donde estaba asignando los elementos de la matriz.
@sodiumnitrate: por supuesto porque ( α π ) = porque ( α + π ) . Ahora arccos ( α ) es (normalmente) restituido con 0 α π bien ? Si porque ( α ) = 1 / 2 y pecado ( α ) < 0 que angulo tomas 4 / 3 π o 2 / 3 π ? como se dijo anteriormente, estoy siguiendo la convención π < α π