我正在研究作为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
,#_y
和#_z
是这实际上是从磁力RAW值的三维向量的分量。滚动和俯仰来自机载加速度计和陀螺仪的神秘卡尔曼滤波器输出。这三个传感器位于ATAVRSBIN1中。在此阶段之前,滚动和俯仰都可以。
现在, 应该已经按照Journal_of_sensors_renaudin等人_2010c.pdf进行了简单的航向计算,MAG_Heading = atan2(-magnetom_y, magnetom_x) ;
并进行了上述补偿。
整体代码仅来自OPEN AHRS。
滚动,俯仰和偏航格式的数据。我只用手转动设备。前三个分别仅集中在Roll,Pitch和Yaw上。其余两个首先使设备沿X(滚动)旋转45度,然后沿磁力计的局部Z旋转。然后重复相同的过程,沿Y(俯仰)旋转约45度,然后沿磁力仪的局部Z旋转。
该图在-180至180度范围内绘制。
文件中以度为单位的角度俯仰上的YAW特性。
文件中以度为单位的角度 以45度滚动的偏航上的偏航特性。
文件中 以度为单位的角度倾斜45度的偏航上的偏航特性。
注意:对于最后两张图片:首先保持在原位,所有位置都相同(请参阅txt文件)。然后滚动45度,然后使用平面设备(带有磁力计)沿磁力计的Z轴旋转。
同样,对于最后一张图像,设备已沿磁力计的Z轴倾斜了45度。
我希望这些将有助于解决我的问题。
最新发展如下:
我在标题上做了一些工作。我得到以下输出。 CSV