Una forma sencilla de calcular los ángulos de Euler a partir de la matriz de rotación --- ¡ayuda!

Este es un seguimiento de esta pregunta :

tengo la matriz de rotacion

( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 )

Estoy usando una matriz de rotación premultiplicadora (que opera en vectores de columna) para rotaciones intrínsecas (es decir, hago rotaciones sobre los ejes del plano que gira). Y dado que el marco fijo es mi marco de referencia ---

( 1 0 0 0 1 0 0 0 1 )

Mi matriz de rotación no es más que los vectores unitarios de columna de los ejes del marco rotado, es decir

( X 1 X 2 X 3 y 1 y 2 y 3 z 1 z 2 z 3 )

Por lo tanto, tengo los valores de a11,a12,a13,a21,a22,a23,a31,a32,a33 como x1, x2, x3, y1, y2, y3, z1, z2, z3.

Ahora, si considero un conjunto particular de rotación (digamos X primero, luego Y, luego Z), con los ángulos de Tait-Bryan correspondientes --- a, b y c. Mi matriz de rotación será la siguiente. Rx(a)*Ry(b)*Rz(c) ---

( porque ( b ) porque ( C ) porque ( b ) pecado ( C ) pecado ( b ) porque ( a ) pecado ( C ) + porque ( C ) pecado ( a ) pecado ( b ) porque ( a ) porque ( C ) pecado ( a ) pecado ( b ) pecado ( C ) porque ( b ) pecado ( a ) pecado ( a ) pecado ( C ) porque ( a ) porque ( C ) pecado ( b ) porque ( C ) pecado ( a ) + porque ( a ) pecado ( b ) pecado ( C ) porque ( a ) porque ( b ) )

Ahora, si tengo que resolver los ángulos anteriores a, b y c (cabeceo, guiñada y balanceo), básicamente tengo nueve ecuaciones pero tres incógnitas. Las siguientes son las ecuaciones ---

a11 =  cos(b)∗cos(c)
a12 = −cos(b)∗sin(c)
a13 =  sin(b)
a21 = cos(a)∗sin(c)+cos(c)∗sin(a)∗sin(b)
a22 = cos(a)∗cos(c)−sin(a)∗sin(b)∗sin(c)
a23 = −cos(b)∗sin(a)
a31 = sin(a)∗sin(c)−cos(a)∗cos(c)∗sin(b)
a32 = cos(c)∗sin(a)+cos(a)∗sin(b)∗sin(c)
a33 = cos(a)∗cos(b) 

Aquí es donde aprendí sobre esto.

Ahora estoy usando un método de ajuste de curvas de mínimos cuadrados no lineales para resolver el conjunto anterior de ecuaciones sobredeterminadas. Hay dos problemas principales con los que me estoy encontrando.

  1. Los valores finales de a,b,c cambian a medida que cambio los valores iniciales en el algoritmo iterativo. Obtengo resultados diferentes si empiezo desde [50 50 50] y resultados diferentes con [0 0 0].
  2. En segundo lugar, no creo que los valores obtenidos sean correctos; ya que los ángulos de cabeceo, guiñada y balanceo parecen bastante diferentes en el video. Estoy usando el comando lsqcurvefit (haga clic en la pregunta que hice en stackoverflow) en Matlab . (haga clic para ver la documentación)

He estado en este problema de cómo calcular cabeceo, guiñada y balanceo desde hace bastante tiempo. Creo que esta publicación le dará todos los detalles de lo que he probado. Necesito su ayuda para saber si lo que estoy haciendo es el mejor enfoque para abordar mi problema. Si es así, por favor señale lo que está mal en mi método. Si cree que existen otros métodos más simples, hágamelo saber. Estoy seguro de que tiene que haber un método mejor, ya que esto parece algo bastante simple de hacer.

¿Debo cambiar mi algoritmo de Matlab? ¿Alguien conoce alguna caja de herramientas especial de Matlab/Mathematica que calcule la guiñada, cabeceo, balanceo?

¡Gracias!

Respuestas (2)

Usar

a 23 a 33 = porque b pecado a porque a porque b = broncearse a a 13 a 23 2 + a 33 2 = pecado b porque b pecado 2 a + porque 2 a = broncearse b a 12 a 11 = porque b pecado C porque b porque C = broncearse C

Entonces obtienes:

 a = atan2(-a23,a33)
 b = atan2(a13, sqrt(a23^2+a33^2) )
 c = atan2(-a12,a11)

Ahora, si considero un conjunto particular de rotación (digamos X primero, luego Y, luego Z), con los ángulos de Tait-Bryan correspondientes --- a, b y c. Mi matriz de rotación será la siguiente...

Mira esa matriz. es de la forma

porque ( b ) porque ( C ) porque ( b ) pecado ( C ) pecado ( b ) porque ( b ) pecado ( a ) porque ( b ) porque ( a )

Tenga en cuenta que el a 13 elemento depende de b solo: a 13 = pecado ( b ) . Esto te da inmediatamente el ángulo. b : b = arcsen ( a 13 ) . Desde porque b no es negativo para b en [ π / 2 , pag i / 2 ] , el rango de Arcsine(x), los dos argumentos arcotangente se pueden usar para calcular ángulos a y C : a = atan2 ( a 23 , a 33 ) y C = atan2 ( a 12 , a 11 ) .


Actualización: bloqueo de cardán

Lo anterior está incompleto. Suponer que porque b es cero Esto sucede cuando b = ± π 2 , haciendo pecado b = ± 1 . La matriz toma una de las siguientes dos formas en estos casos.

Cuando pecado b = 1 , la matriz se convierte en

0 0 1 pecado ( a C ) porque ( a C ) 0 porque ( a C ) pecado ( a C ) 0

Cuando pecado b = 1 , la matriz se convierte en

0 0 1 pecado ( a + C ) porque ( a + C ) 0 porque ( a + C ) pecado ( a + C ) 0

Tenga en cuenta que en ambos casos, múltiples ( a , C ) los pares producirán la misma matriz. Cuando pecado b = 1 , todo lo que se puede inferir de la matriz es la diferencia a C : broncearse ( a C ) = a 21 a 22 en este caso de gimbal lock. Cuando pecado b = 1 , todo lo que se puede inferir es la suma a + C : broncearse ( a + C ) = a 21 a 22 en este otro caso de gimbal lock. En ambos casos, la capacidad de identificar de forma única a y C está perdido. Una solución es establecer arbitrariamente uno de esos dos ángulos en cero. Es más conveniente configurar C = 0 porque entonces a se puede calcular como a = atan2 ( a 21 , a 22 ) en ambos casos.

El bloqueo del cardán es un problema en más de estos dos valores singulares cuando la matriz se forma utilizando aritmética de precisión finita (por ejemplo, aritmética de precisión simple o doble). Supongamos que la matriz A se forma multiplicando dos matrices de transformación B y C tal que el a 13 elemento de la matriz del producto está cerca de más o menos uno. Los elementos utilizados nominalmente para calcular a y C estará cerca de cero, y estos valores cercanos a cero a menudo serán objeto de una pérdida extrema de precisión. Cálculo de ángulos a y C a través del primer procedimiento producirá valores basura. Es mejor tratar esas matrices de bloqueo cercanas al cardán como si estuvieran bloqueadas por el cardán.