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.
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.