Compensación de inclinación del magnetómetro sin acelerómetro

3

Necesito usar el magnetómetro en un dispositivo para determinar con precisión cuántos grados lo gira el usuario (gira en el plano x-y). No me importa la orientación absoluta, solo el delta angular. Por supuesto, el usuario puede sostener el dispositivo en cualquier orientación. Esencialmente, esto es como un picaporte que no está conectado a nada.

Probé atan2 (x, y) pero el delta anglular resultante varía según la orientación del dispositivo. Algunas investigaciones sugieren que la compensación de inclinación es necesaria, pero todas las soluciones son para corregir brújulas basadas en conocer el vector de gravedad.

En esta aplicación, los datos del acelerómetro, la gravedad y el giro no están disponibles, solo el magnetómetro. Esto significa que el tono y amp; rollo utilizado en soluciones típicas no están disponibles. Sin embargo, no estoy buscando encabezados verdaderos, solo rotación en x-y.

¿Alguien puede explicar la matemática & solución para esto? Me doy cuenta de que esto es estrictamente una pregunta de programación, pero esto es algo que solo una EE sabría.

La aplicación se usa normalmente de modo que el plano x-y rara vez, si alguna vez, es perpendicular al campo de la Tierra, por lo que sqrt (x 2 + y 2) > 0.

El magnetómetro es un MEMS de 3 ejes AK8975 soldado al dispositivo sin disposición de nivelación de tipo cardán. La calibración de hierro duro ya está cuidada. La frecuencia de muestreo es de 40 Hz, mientras que lo más rápido que puede girar su mano hacia atrás & adelante es inferior a 5 Hz. La orientación del magnetómetro es totalmente desconocida ya que el eje del magnetómetro está fijado al dispositivo y el dispositivo puede estar en cualquier orientación. No se sabe nada ni se puede asumir sobre la gravedad ni la orientación o ubicación del dispositivo.

[Más tarde] Hice un experimento donde tomé el dispositivo y lo coloqué en una silla giratoria orientada hacia el Norte, luego la giré en 360. El asiento de la silla está nivelado con el suelo. Aquí está la tabla:

x = azul, y = verde oscuro, z = rojo, sqrt (x ^ 2 + y ^ 2 + z ^ 2) = aqua El eje x es segundos transcurridos, el eje y es uT.

Dos cosas saltan hacia mí:

  1. ¿No debería ser plana la magnitud del color del agua? El canal es 30 contra 45 para la parte plana. De lo contrario, ¿es esto un indicio de que este sensor está mal calibrado? ¿O es esto una indicación de que se necesita compensación de inclinación?
  2. La x & Los picos de Y están ligeramente desplazados y tienen rangos ligeramente diferentes, pero no tanto. Esto, estoy dispuesto a ignorarlo como error, en oposición a la diferencia de 30:45 por la magnitud que parece suficiente para arruinar cualquier cálculo.
  3. La Z es plana como se esperaba
pregunta MilesK

2 respuestas

1

Si la orientación del dispositivo es fija durante la medición, el cálculo es relativamente sencillo, como lo señaló Dave Tweed.

El problema principal es la calibración. Una forma rápida sería establecer en un mínimo aproximado, máximo para cada dirección x, y, z. Esperemos que los ceros se encuentren aproximadamente en los promedios de mínimo y máximo. Es decir, esto dará un \ $ x_ \ min \ $, \ $ x_ \ max \ $ y de manera similar para los otros ejes. De esta estimación \ $ x_ \ text {cero} = {1 \ sobre 2} (x_ \ min + x_ \ max) \ $, y \ $ r_x = {1 \ sobre 2} (x_ \ max-x_ \ min) \ $, etc.

Luego, para una lectura, calcule \ $ x_ \ text {est} = {x_ \ text {meas} -x_ \ text {cero} \ sobre r_x} \ $, etc. Esperamos que esto esté en el rango \ $ \ pm 1 \ $.

Verificaría que \ $ | z_ \ text {est} | \ $ sea (1) no mayor que algún número (\ $ < 1 \ $ aquí) para que obtenga una dirección significativa, y (2) que permanece bastante constante durante la duración de una medición.

Para calcular un ángulo, use \ $ \ text {atan2} (y_ \ text {est}, x_ \ text {est}) \ $ (verifique su API particular). Para calcular la diferencia con otro ángulo (con suerte cerca), solo tenga cuidado con el límite \ $ \ pm \ pi \ $.

Esto es obviamente una descripción general rápida con muchas optimizaciones y controles de integridad omitidos.

    
respondido por el copper.hat
0

Si la orientación es absolutamente desconocida, está intentando resolver un problema 3D con un cálculo 2D. Esto no puede funcionar. Necesitas resolver el problema en 3D.

En lo que respecta a la calibración, la solución @ copper.hat es correcta, pero debe realizar la calibración en 3D, que es mucho más difícil de ejecutar < debe (1: más movimientos) seguir movimientos aleatorios en 3D que cubren la esfera de posibles posiciones, o (2: configuración mecánica compleja) comenzar por definir una dirección preferida que esté alineada con el campo terrestre 3D, luego calibrar 2D alrededor de este eje , luego calibre la tercera dimensión alrededor de un eje perpendicular, o (3: cálculo complejo) seleccione una base ortogonal aleatoria e invierta el cálculo trigonométrico para obtener sus variables de calibración: este es el enfoque más sensible al ruido & gt ;. (1) es lo que hacen los objetos simples de consumo (como el controlador PS3), (2) es lo que se hace en un entorno industrial, (3) es lo que se hace cuando los otros dos no están disponibles.

    
respondido por el MAC

Lea otras preguntas en las etiquetas