19 votos

Calibración dinámica del magnetómetro

Estoy trabajando en un Magnetómetro AK8975 que forma parte de una IMU. Que parece ser muy difícil para mí. Este chip da un vector 3D como salida que describe el campo magnético de la tierra en cualquier lugar de la tierra o cerca de ella.

He probado dos tipos de algoritmos de cálculo del rumbo: Uno es simple arctan(-y/x) y otra es la inclinación (pitch) y el balanceo (bank) cancelados matemáticamente como se menciona a continuación. Tanto en la inclinación y los bancos dan salida incorrecta.

Soy capaz de obtener el rumbo correcto respecto a la tierra (utilizando recursos sencillos de estudio abiertos disponibles) cuando se gira manteniendo la horizontal respecto a la planta utilizando cualquiera de los dos algos.

He probado la calibración para errores de hierro blando y duro. Pude trazarlo en 3D y muestra una esfera 3D perfecta. Todavía no funciona en inclinación o declinación.

Cualquier indicación será útil.

El código y sus implementaciones son los siguientes:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading

  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

Dónde magnetom_x , #_y y #_z son componentes de un vector 3D que en realidad son valores RAW del Magnetómetro. rollo y paso proceden de un misterioso filtro Kalman de acelerómetros y giroscopios incorporados. Estos tres sensores están en ATAVRSBIN1 . El balanceo y cabeceo están bien hasta esta etapa.

Ahora un simple cálculo de rúbrica según revista_de_sensores_renaudin et al_2010c.pdf debería haber sido MAG_Heading = atan2(-magnetom_y, magnetom_x) ; y con una compensación como la anterior.

El código general es simplemente de AHRS ABIERTO .


Datos en formato Roll, Pitch y Yaw. He girado el aparato sólo con la mano. Los tres primeros se han concentrado sólo en Roll, Pitch y Yaw, respectivamente. Los otros dos se han girado primero el dispositivo alrededor de 45 grados a lo largo de X (Rolled) y luego girado a lo largo de la Z local del Magnetómetro. Entonces lo mismo se ha repetido con alrededor de 45 grados de rotación a lo largo de Y (pitched) y luego girado a lo largo de la Z local del Magnetómetro.

Los gráficos se trazan dentro del intervalo de -180 a 180 grados.

Roll Ángulos en grados en un archivo Las características de YAW en Roll.

Pitch Ángulos en grados en un archivo Las características de YAW en Pitch.

Yaw Ángulos en grados en un archivo Las características del YAW en el propio Yaw.

Yaw w.r.t 45 degrees inclined (rolled) Ángulos en grados en un archivo Las características YAW en Yaw con 45 grados de balanceo.

Yaw w.r.t 45 degrees banked (pitched) Ángulos en grados en un archivo Las características YAW en Yaw con 45 grados de cabeceo.

Nota: Para las 2 últimas fotos: En primer lugar se mantiene en la posición inicial, que es el mismo para todos (consulte los archivos txt). A continuación, rodó 45 grados a continuación, utilizando el dispositivo plano (con magnetómetro) se ha girado a lo largo del eje Z del magnetómetro.

Del mismo modo, en la última imagen el dispositivo se ha inclinado 45 grados a lo largo del eje Z del magnetómetro.

Espero que esto ayude a resolver mi problema.


Las novedades son las siguientes:

He trabajado un poco en el encabezamiento. Obtuve el siguiente resultado. Roll csv

Pitch csv

Yaw csv


8voto

Jeremy Ruten Puntos 59989

Me gustan sus gráficos. Muestran claramente que el balanceo, el cabeceo y la guiñada parecen funcionar. ¡Felicidades! Eso ya es más progreso del que hace la mayoría de la gente.

Supongo que el código que has presentado está calculando un valor MAG_Heading "erróneo", diferente del valor MAG_Heading que esperabas.

Sería mucho más fácil para nosotros ayudarte si nos dieras: (Esta es la sección "describa los síntomas" de "Cómo hacer preguntas de forma inteligente" )

  • el AK8975 los valores de salida del magnetómetro m_x, m_y y m_z en un momento determinado.
  • Los valores de cabeceo y balanceo en el mismo instante
  • el valor de salida MAG_Heading supuestamente erróneo calculado a partir de esos valores
  • cuál esperabas que fuera el MAG_Heading correcto

Así que no me queda más remedio que especular con la posibilidad de que te estés encontrando con el mismo tipo de problemas que yo me creo :-).

  • ¿Qué formato de ángulo esperan sus funciones sin() y cos() y atan2()? ¿Necesitas hacer algún tipo de conversión entre el formato de cabeceo y balanceo que se almacenan en ese formato? ¿Necesita convertir de ese formato al que necesita MAG_heading? (¿brads, grados o radianes? ¿punto flotante o punto fijo?)
  • ¿Hay algún desplazamiento en los valores brutos m_x, m_y, m_z que haya que restar?
  • ¿Están todas las piezas alineadas de la forma que supone el código? En particular, ¿están los ejes de cabeceo y balanceo alineados con el eje del magnetómetro? (¿Se supone que m_x apunta hacia adelante, a lo largo del eje de balanceo? ¿Se supone que m_y apunta hacia la derecha, a lo largo del eje de cabeceo?)
  • ¿Quizás algún valor del sensor -- quizás m_z -- necesita ser negado antes de alimentar este código?
  • ¿Es posible que este código esté siendo interrumpido por una interrupción u otra que corrompa sus valores internos? Creo recordar un proyecto diferente en el que, después de que alguien pusiera una "división" en una rutina de interrupción, cada cálculo de función trigonométrica en cualquier otra parte del programa daba a menudo un resultado erróneo.
  • ¿Es posible que las interrupciones se disparen tan a menudo que este código nunca termine de ejecutarse?

Parece que hay otras personas discutiendo un código muy similar en otros lugares: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-Nuevo-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; etc.

2voto

meds Puntos 271

En nota de aplicación para el LSM303 tiene una guía útil para calibrar una brújula de inclinación compensada que es aplicable a tu problema. Es bastante detallada, de lo contrario habría reescrito los cálculos aquí. Ten en cuenta que los valores del acelerómetro son necesarios para los cálculos completos de cabeceo, balanceo y guiñada, ya que una rotación alrededor del eje de las líneas del campo magnético no produce ningún cambio en los valores del magnetómetro. Lo mismo ocurre para la gravedad con el acelerómetro.

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