我正在研究作为 IMU 一部分的磁力计 AK8975。这对我来说似乎很棘手。该芯片提供一个 3D 矢量作为输出,描述地球上任何地方或附近的地球磁场。
我尝试了两种航向计算算法:一种很简单arctan(-y/x)
,另一种是倾斜(俯仰)和坡度(滚动)取消数学,如下所述。倾斜和坡度都给出错误的输出。
当使用两种算法中的任何一种在地面平面上保持水平旋转时,我能够获得正确的地球航向(使用简单的可用开放研究资源)。
我尝试校准软铁和硬铁错误。我可以在 3D 中绘制它并显示一个完美的 3D 球体。仍然不适用于倾斜或偏角。
任何指针都会有所帮助。
代码及其实现如下:
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) ;
}
其中magnetom_x
和是 3D 矢量的组成部分,它们实际上是来自磁力计的 RAW 值#_y
。roll和pitch来自板载加速度计和陀螺仪的神秘卡尔曼滤波器输出。这三个传感器位于ATAVRSBIN1中。直到这个阶段,滚动和俯仰都可以。#_z
现在根据journal_of_sensors_renaudin et al_2010c.pdf进行简单的航向计算 应该已经MAG_Heading = atan2(-magnetom_y, magnetom_x) ;
和补偿如上。
整体代码仅来自OPEN AHRS。
Roll、Pitch 和 Yaw 格式的数据。我只用手旋转了设备。前三个分别只集中在 Roll、Pitch 和 Yaw 上。其余两个首先将设备沿 X(滚动)旋转 45 度,然后沿磁力计的局部 Z 旋转。然后沿 Y(倾斜)旋转约 45 度重复相同的操作,然后沿磁力计的局部 Z 旋转。
图表绘制在 -180 到 180 度的范围内。
文件中以度为单位的角度Roll 上的 YAW 特性。
文件中以度为单位的角度Pitch 上的 YAW 特性。
文件中以度为单位的角度Yaw 本身的 YAW 特性。
文件中以度为单位的角度 45 度滚动的 Yaw 上的 YAW 特性。
文件中以度为单位的角度 45 度俯仰的 Yaw 上的 YAW 特性。
注意:对于最后两张图片:首先保持原位,所有图片都相同(参考txt文件)。然后滚动 45 度,然后使用平面装置(带磁力计)沿磁力计的 Z 轴旋转。
同样,对于最后一张图像,设备已倾斜 45 度,然后沿磁力计的 Z 轴倾斜。
我希望这些将有助于解决我的问题。
新进展如下:
我在标题上做了一些工作。我得到以下输出。 CSV