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.
Ángulos en grados en un archivo Las características de YAW en Roll.
Ángulos en grados en un archivo Las características de YAW en Pitch.
Ángulos en grados en un archivo Las características del YAW en el propio Yaw.
Ángulos en grados en un archivo Las características YAW en Yaw con 45 grados de balanceo.
Á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. csv