Rotación de los valores de salida de un giroscopio en un marco de referencia relativo a la Tierra

Por alguna razón, parece que me he metido en una gran confusión sobre cómo procesar datos de mi giroscopio de 3 ejes y acelerómetro de 3 ejes para obtener valores de rotación del giroscopio relacionados con el marco de referencia de la tierra. es decir, dado que mi acelerómetro mide la gravedad (asumimos que es estable) a lo largo del marco de referencia de los sensores (x,y,z), ¿cómo ajusto los valores de mi giroscopio, medidos a lo largo del mismo marco de referencia de los sensores (x,y,z) como que en realidad estoy midiendo la rotación sobre el marco de la Tierra x (Norte), y (Oeste) y z (hacia abajo) en dirección?

Parece que no puedo entender el uso de la matriz de rotación. ¿Simplemente empleo una matriz de rotación 3d y multiplico el vector, [ gramo y r o X , gramo y r o y , gramo y r o z ] T , por una matriz de rotación, R? Luego asumo que los ángulos de rotación se derivan de alguna manera de las salidas filtradas del acelerómetro, pero tengo problemas para decidir cuáles deberían ser.

Todavía tengo que encontrar una referencia concisa sobre cómo mover los valores de rotación y aceleración del marco de referencia del sensor al marco de referencia global de la tierra. ¿Quizás alguien pueda ayudar? Gracias

¿Qué quiere decir con "la dirección x (movimiento hacia adelante), y (dirección del puerto) y z (hacia abajo) de la Tierra"? ¿De qué manera avanza la tierra misma? ¿Dónde está la dirección hacia el puerto de la tierra? (¿Estoy seguro si asumo que no está modelando la tierra moviéndose en su órbita?) Esto suena sin sentido. Un sistema de avance/babor/abajo suena más como el marco de un vehículo en movimiento. Esperaría que un marco terrestre tuviera ejes como este/norte/arriba, o norte/este/abajo, etc.
Jeff, tienes razón. Es confuso. Voy a aclarar
Bueno, eso es una mejora, pero ahora (sin tratar de ser un troll, sinceramente) me siento obligado a señalar que Norte/Oeste/Abajo es un sistema de coordenadas para zurdos. La mayoría de las veces, los sistemas con los que se encontrará serán diestros. Usando las direcciones que proporcionó como ejes positivos, estos serían Norte/Oeste/Arriba o Oeste/Norte/Abajo, o incluso Arriba/Norte/Oeste. Sin embargo, creo que los sistemas que involucran al norte y al este son más comunes.

Respuestas (1)

Es posible que su confusión se deba al hecho de que existen múltiples soluciones al problema. Si bien su acelerómetro puede decirle qué camino está hacia arriba, no puede distinguir entre el norte y el oeste. IE Si gira el dispositivo sobre el eje vertical, las salidas de los acelerómetros no cambiarán.

¿Cómo puedes distinguir entre el norte y el oeste? La mejor manera es probablemente agregar una brújula digital a la mezcla. Alternativamente, es posible que no le interese saber la diferencia entre el norte real y el oeste real. Es posible que solo desee dos ejes horizontales ortogonales. Asumiré lo último.

Defina nuestros marcos primero. El marco del dispositivo es (X, Y, Z). El marco de la tierra es (V, H1, H2).

Supongamos que las lecturas de su acelerómetro (Ax, Ay, Az) están en el rango -1 .. +1, donde +1 significa directamente hacia arriba. Inmediatamente sabes en qué dirección está arriba: es simplemente (Ax, Ay, Az). Pero, ¿cómo obtenemos un eje horizontal? Hay una función llamada Cross Product , que toma dos vectores como entradas y devuelve otro vector en ángulo recto con ambos. Por lo tanto, podemos encontrar fácilmente un vector en ángulo recto con Up. Cª:

Vector3D V  = (Ax, Ay, Az);
Vector3D H1 = RANDOM_VECTOR;

Vector3D H2 = CrossProduct(V, H1);
H1 = CrossProduct(V, H2);

Normalise(H1);
Normalise(H2);

Entonces, ahora tenemos un vector vertical V y dos vectores horizontales H1 y H2 . Ahora solo necesitamos rotar las lecturas del giroscopio en el mismo cuadro.

Llamemos a las lecturas del giroscopio (Gx, Gy, Gz). Vamos a convertirlos en coordenadas de rotación del sistema terrestre (GV, GH1, GH2). Todo lo que tiene que hacer es pensar en las lecturas del giroscopio como un solo vector 3D. Hacia dónde apunta en el marco del dispositivo. ¿Hacia dónde apunta en el marco de la Tierra?

La respuesta es simplemente:

GV  = (Gx*V.x)  + (Gy*V.y)  + (Gz*V.z);
GH1 = (Gx*H1.x) + (Gy*H1.y) + (Gz*H1.z);
GH2 = (Gx*H2.x) + (Gy*H2.y) + (Gz*H2.z);

(Espero que sea correcto)...

¡Gracias Rocketmagnet! Eso ayuda. Déjame ver si tengo esto: Efectivamente estás creando una matriz M, [Vx Vy Vz; H1.x H1.y H1.z; H2.x H2.y H2.z] y multiplicándolo por el vector giroscópico, [Gx Gy Gz]^T, lo que le da el vector giroscópico al que se hace referencia en el NUEVO marco de coordenadas, [GV GH1 GH2]? El vector vertical, V, se da porque tenemos un acelerómetro que genera el vector de gravedad (negativo). Los otros dos vectores son normales al vector de gravedad y, por lo tanto, definen el marco de coordenadas de la "tierra".
@gallamine: Sí, así es. Espero que el ejemplo de código haya sido claro. Si no, házmelo saber y trataré de aclararlo.
¿Supongo que los componentes .x, .y y .z son los componentes 1, 2 y 3 de los diferentes vectores? Conceptualmente, esto parece tan fácil. ¿Por qué optaría por hacer una matriz de rotación complicada en lugar de solo proyectar los vectores?
@gallamine: bueno, ambas cosas son matemáticamente idénticas y ninguna es más compleja.
Buena respuesta. Pero tengo algunas preguntas. ¿Cuál debería ser el vector aleatorio en este caso? ¿importa? ¿Y esto funcionó como se esperaba?
@KevinPeter: debe ser un vector que no sea paralelo a V. Cuanto más perpendicular a V, mejor. Existe una pequeña posibilidad de que RANDOM_VECTOR esté muy cerca de V. Tal vez podría agregar una prueba (producto escalar) para medir qué tan paralelos son y elegir otro vector si está demasiado cerca.
¡Tengo el mismo problema, pero no creo que esta respuesta funcione! La razón es que se supone que el vector giroscópico está siempre en el mismo marco, pero las rotaciones son relativas al marco actual que cambia constantemente. En otras palabras, el giroscopio obtiene ángulos delta de Euler