磁力计动态校准

电器工程 校准 伊穆 磁学
2022-01-15 19:11:54

我正在研究作为 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 值#_yrollpitch来自板载加速度计和陀螺仪的神秘卡尔曼滤波器输出。这三个传感器位于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 度倾斜(滚动) 文件中以度为单位的角度 45 度滚动的 Yaw 上的 YAW 特性。

偏航 45 度倾斜(倾斜) 文件中以度为单位的角度 45 度俯仰的 Yaw 上的 YAW 特性。

注意:对于最后两张图片:首先保持原位,所有图片都相同(参考txt文件)。然后滚动 45 度,然后使用平面装置(带磁力计)沿磁力计的 Z 轴旋转。

同样,对于最后一张图像,设备已倾斜 45 度,然后沿磁力计的 Z 轴倾斜。

我希望这些将有助于解决我的问题。


新进展如下:

我在标题上做了一些工作。我得到以下输出。 卷 CSV

沥青 CSV

偏航 CSV


2个回答

我喜欢你的图表。它们清楚地表明滚动、俯仰和偏航似乎在起作用。恭喜!这已经比大多数人取得的进步更大。

我猜您提供的代码正在计算“错误”的 MAG_Heading 值,与您预期的 MAG_Heading 值不同。

如果您给我们,我们会更容易帮助您:(这是 “如何以聪明的方式提问”的“描述症状”部分 )

  • AK8975磁力计在某个时间点输出值 m_x、m_y 和 m_z。
  • 同一时刻的俯仰和横滚值
  • 从这些值计算出的据称错误的 MAG_Heading 输出值
  • 您期望正确的 MAG_Heading 是什么

所以我只能推测,也许你遇到了我为自己创造的同样的问题:-)。

  • 你的 sin() 和 cos() 和 atan2() 函数期望什么角度格式?您是否需要在存储格式的音高和滚动格式之间进行某种转换?您是否需要从该格式转换为您需要的 MAG_heading?(布拉德、度数还是弧度?浮点还是定点?)
  • 原始 m_x、m_y、m_z 值中是否存在需要减去的偏移量?
  • 是否所有部分都按照代码假定的方式排列?特别是,俯仰和横滚轴是否与磁力计轴对齐?(m_x 是否应该指向前方,沿横滚轴?m_y 是否应该指向右侧,沿俯仰轴?)
  • 在输入此代码之前,可能需要取反某个传感器值或其他值(可能是 m_z)?
  • 这段代码是否可能被一个中断或另一个破坏其内部值的中断所中断?我似乎记得一个不同的项目,在有人在中断例程中放置“除法”之后,程序中其他任何地方的每个触发函数计算通常都会给出错误的结果。
  • 可能中断触发如此频繁以至于该代码实际上从未完成运行吗?

似乎还有其他人在其他地方讨论非常相似的代码:http: //diydrones.com/forum/topics/heading-from-3d-magnetometerhttp://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-drafthttp://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer等等。

LSM303的应用笔记有一个有用的指南来校准适用于您的问题的倾斜补偿罗盘。它非常详细,否则我会在这里重新编写计算。请注意,加速度计值对于全俯仰、滚动和偏航计算是必需的,因为围绕磁力线轴的旋转不会导致磁力计值发生变化。加速度计的重力也是如此。