Processing math: 100%

23 votos

Conversión de la matriz de rotación en cuaternión

Utilizamos Quaternion de longitud unitaria para representar las rotaciones. A continuación se obtiene una matriz de rotación general [m00m01m02m10m11m12m20m21m22]3×3 .

¿Cómo puedo calcular con precisión el cuaternión q=q1i+q2j+q3k+q4 para esta matriz Es decir, ¿cómo podemos escribir qi s en términos de mij ¿con exactitud?

16voto

rschwieb Puntos 60669

El eje y el ángulo se codifican directamente en esta matriz.

Calcular el vector propio unitario para el valor propio 1 para esta matriz (¡debe existir!) y llamarla u=(u1,u2,u3) . Lo escribirá como u=u1i+u2j+u2k a partir de ahora. Este es precisamente el eje de rotación que, geométricamente, tienen todas las rotaciones no identitarias.

Se puede recuperar el ángulo a partir de la traza de la matriz: tr(M)=2cos(θ)+1 . Esto es una consecuencia del hecho de que se puede cambiar de base a una base ortonormal que incluya el eje encontrado anteriormente, y la matriz de rotación será la identidad en esa dimensión, y será una rotación plana en las otras dos dimensiones. Es decir, tendrá que ser de la forma

[cos(θ)sin(θ)0sin(θ)cos(θ)0001]

Como la traza es invariante entre cambios de base, puedes ver cómo obtuve mi ecuación.

Una vez que haya resuelto para θ lo usarás para construir tu cuaternión de rotación q=cos(θ/2)+usin(θ/2) .

8voto

SRH Puntos 31

Hay una solución en https://d3cw3dd2w32x2b.cloudfront.net/wp-content/uploads/2015/01/matrix-to-quat.pdf

En resumen, su código final es el siguiente:

if (m22 < 0) {
    if (m00 >m11) {
        t = 1 + m00 -m11 -m22;
        q = Quaternion( t, m01+m10, m20+m02, m12-m21 );
    }
    else {
        t = 1 -m00 + m11 -m22;
        q = Quaternion( m01+m10, t, m12+m21, m20-m02 );
    }
}
else {
    if (m00 < -m11) {
        t = 1 -m00 -m11 + m22;
        q = Quaternion( m20+m02, m12+m21, t, m01-m10 );
    }
    else {
        t = 1 + m00 + m11 + m22;
        q = Quaternion( m12-m21, m20-m02, m01-m10, t );
    }
}
q *= 0.5 / Sqrt(t);

4voto

user12289 Puntos 6

Referencia: Shuster, M. 1993, "Un estudio sobre las representaciones de las actitudes" Journal of the Astronautical Sciences, 41(4):349-517

Véanse las ecuaciones y la discusión en el documento anterior, p463-464.

Se garantiza que uno de los elementos del cuaternión tiene una magnitud de superior a 0,5 y, por tanto, un valor al cuadrado de 0,25. Podemos utilizar esto para determinar el "mejor" conjunto de parámetros a utilizar para calcular el cuaternión a partir de una matriz de rotación

double b1_squared = 0.25 * (1.0 + R11 + R22 + R33);
if (b1_squared >= 0.25)
{
    // Equation (164)
    double b1 = sqrt(b1_squared);

    double over_b1_4 = 0.25 / b1;
    double b2 = (R32 - R23) * over_b1_4;
    double b3 = (R13 - R31) * over_b1_4;
    double b4 = (R21 - R12) * over_b1_4;

    // Return the quaternion
    Eigen::Vector4d q(b1, b2, b3, b4);
    return q;
}

Dejaré como ejercicio al OP completar los otros tres.

Véase también:

  • Farrell, 2008, "Aided Navigation: GPS with High Rate Sensors", McGraw Hill, Apéndice D.

2voto

Joe Gauterin Puntos 9526

Dejemos que AM3×3(R) sea el espacio de 3×3 matrices simétricas reales. Es un tramo de tres matrices

Lx=[000001010],Ly=[001000100],Lz=[010100000] Para cada AA podemos ampliar A como xLx+yLy+zLz y asociado un vector AR3 y un cuaternión ˜AH a ella.

A=xLx+yLy+zLzA=(x,y,z)˜A=xi+yj+zk

Dejemos que Au={AA:|A|=1} . Dada cualquier matriz de rotación MSO(3) podemos encontrar un θ[0,π] y LAu tal que

M=eθL=I3+sinθL+(1cosθ)L2

El θ es el ángulo de rotación asociado a M y L será un vector unitario en la dirección del eje de rotación.

Cuando θ0 ni π podemos extraer L tomando la parte antisimétrica de M y luego "normalizar" el vector correspondiente porque

sinθL=12(MMT)

Para fijar el valor de θ podemos utilizar la relación Tr(M)=1+2cosθ .

Una vez θ y L es conocida, el cuaternión correspondiente a la matriz de rotación M viene dada por

eθ2˜L=cosθ2+sinθ2˜L=1+Tr(M)2[1+~MMT1+Tr(M)]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X