Calibrador dinámico del magnetómetro

19

Estoy trabajando en un Magnetómetro AK8975 como parte de una IMU. Lo que parece ser muy complicado para mí. Este chip proporciona un vector 3D como salida que describe el campo magnético de la Tierra en cualquier lugar de la Tierra o cerca de él.

Probé dos tipos de algoritmos de cálculo de encabezado: Uno es arctan(-y/x) simple y otro es matemática cancelada con inclinación (pitch) y banco (roll) como se menciona a continuación. Tanto en la inclinación como en los bancos dan resultados erróneos.

Soy capaz de obtener el rumbo correcto en la tierra (usando los recursos de estudio abierto disponibles simples) cuando se gira manteniéndolo horizontalmente en la planta utilizando cualquiera de los dos algos.

Probé 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 puntero será útil.

El código y sus implementaciones son las 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) ;

}

Donde magnetom_x , #_y y #_z son componentes de un vector 3D que en realidad son valores RAW del Magnetómetro. roll y pitch provienen de una misteriosa salida de filtro Kalman desde el acelerómetro y giroscopio a bordo. Estos tres sensores están en ATAVRSBIN1 . El balanceo y el tono están bien hasta esta etapa.

Ahora, un cálculo de encabezado simple según journal_of_sensors_renaudin et al_2010c.pdf debería haber sido MAG_Heading = atan2(-magnetom_y, magnetom_x) ; y con la compensación como se indica arriba.

El código general es simplemente de OPEN AHRS .

Datos en formato Roll, Pitch y Yaw. Gire el dispositivo solo por mi mano. Los tres primeros se han concentrado en solo Roll, Pitch y Yaw respectivamente. El resto dos primero hacen girar el dispositivo alrededor de 45 grados a lo largo de X (rodado), luego se rotan a lo largo de la Z local del magnetómetro. Luego, se repite lo mismo con una rotación de alrededor de 45 grados a lo largo de Y (girado), luego se gira a lo largo de la Z local del magnetómetro.

Los gráficos trazados dentro del rango de -180 a 180 grados.

Ángulos en grados en un archivo Las características YAW en el rollo.

Ángulos en grados en un archivo Las características YAW en el tono.

Ángulos en grados en un archivo Las características YAW en Yaw en sí.

Ángulos en grados en un archivo Las características YAW en Yaw con 45 grados enrollados.

Ángulos en grados en un archivo Las características YAW en Yaw con 45 grados de inclinación.

Nota: Para las 2 últimas fotos: Primero se mantiene en la posición inicial, que es igual para todos (consulte los archivos txt). Luego rodó 45 grados y luego se usó el dispositivo plano (con magnetómetro) a lo largo del eje Z del magnetómetro.

De manera similar, para la última imagen, el dispositivo ha sido inclinado 45 grados y luego a lo largo del eje Z del magnetómetro.

Espero que esto ayude a resolver mi problema.

Los nuevos desarrollos son los siguientes:

He trabajado un poco en el título. Tengo la siguiente salida. csv

csv

csv

pregunta Rick2047

2 respuestas

8

Me gustan tus gráficos. Muestran claramente que el balanceo, el lanzamiento y la guiñada parecen estar funcionando. ¡Felicidades! Eso ya es más progreso que la mayoría de las personas.

Supongo que el código que presentaste está calculando el valor MAG_Heading "incorrecto", diferente del valor MAG_Heading que esperabas.

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

  • los valores de salida del magnetómetro AK8975 m_x, m_y y m_z en algún punto en el tiempo.
  • Los valores de cabeceo y balanceo en el mismo instante
  • el valor de salida MAG_Heading supuestamente incorrecto calculado a partir de esos valores
  • lo que esperabas que fuera el MAG_Heading correcto

Por lo tanto, debo dejar de especular que quizás te encuentres con el mismo tipo de problemas que yo creo :-).

  • ¿Qué formato de ángulo esperan las funciones sin () y cos () y atan2 ()? ¿Necesita hacer algún tipo de conversión entre el formato de pitch y roll se almacenan en ese formato? ¿Necesita convertir de ese formato a lo que necesita MAG_heading? (¿brads, grados o radianes? ¿punto flotante o punto fijo?)
  • ¿Hay un desplazamiento en los valores m_x, m_y, m_z sin procesar que se deben restar?
  • ¿Están todas las partes alineadas de la manera asumida por el código? En particular, ¿el eje de cabeceo y balanceo está alineado 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 inclinación?)
  • Tal vez sea necesario negar algún valor del sensor u otro, tal vez m_z, antes de ingresar este código.
  • ¿Es posible que este código esté interrumpido por una interrupción u otra que dañe sus valores internos? Me parece recordar un proyecto diferente que, después de que alguien puso una "división" en una rutina de interrupción, cada cálculo de la función de disparo en cualquier otra parte del programa a menudo da un resultado incorrecto.
  • ¿Es posible que las interrupciones se disparen tan a menudo que este código nunca termina de ejecutarse?

Parece que hay otras personas discutiendo códigos muy similares en otros lugares: enlace ; enlace ; enlace !!! ; enlace ; enlace ; etc.

    
respondido por el davidcary
1

La nota de aplicación para el LSM303 tiene una guía útil para calibrar un Brújula con compensación de inclinación que es aplicable a su problema. Es bastante detallado, de lo contrario habría reescrito los cálculos aquí. Tenga en cuenta que los valores del acelerómetro son necesarios para los cálculos de paso completo, balanceo y giro, ya que una rotación alrededor del eje de las líneas del campo magnético no produce cambios en los valores del magnetómetro. Igualmente para la gravedad con el acelerómetro.

    
respondido por el geometrikal

Lea otras preguntas en las etiquetas