磁力计动态校准


19

我正在研究作为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度范围内绘制。

滚 文件中角度(度) Roll上的YAW特性。

沥青 文件中以度为单位的角度俯仰上的YAW特性。

偏航 文件中角度(度)偏航本身的偏航特性。

偏航45度倾斜(滚动) 文件中以度为单位的角度 以45度滚动的偏航上的偏航特性。

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

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

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

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


最新发展如下:

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

沥青 CSV

偏航 CSV



还没有答案!

4
我认为,如果您显示要实现的数学知识和用于实现它的代码,将会得到更多的响应。除了“它不起作用,帮助”之外,我们别无他法-这就是您的问题的理解方式。抱歉!
马丁·汤普森

磁力计的使用是一个非常专业的领域,很少有人会拥有专业知识。反复阅读您的问题,我仍然不确定到底出了什么问题。您说它给出了“错误的输出”,但这是非常模糊的。也许一些数值例子?
詹森·R

1
这是一个有关如何解释传感器输出或如何从传感器提供的x,y,z矢量计算出导航有用度量的问题吗?您的测量值是否可以与同一传感器的另一个实例重复进行?
vicatcu,2011年

1
@Rahul-我感到惊讶的是,它没有得到更多的关注!
凯文·维米尔

Answers:


8

我喜欢你的图表。它们清楚地表明滚动,俯仰和偏航似乎有效。恭喜你!这已经比大多数人进步得多。

我猜您提供的代码正在计算“错误的” 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-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-磁力计;等等


我现在看到了..我会回来的。
Rick2047

\ 1 /我正在为[滚动,俯仰,偏航和(Mx,My,Mz)]创建一个csv文件。\ 2 /我希望至少在两个连续的象限之前,MAG_Heading不会随着滚动和俯仰的变化而变化。航向意味着,如果航向NE,则它应一直指向NE,直到它在向上或向下旋转方向上与水平线成90度角倾斜为止,并且在倾斜或组合的情况下应相同。
Rick2047

\ 3 /所有内部计算均以弧度为单位,并且所有余弦函数仅期望弧度。为了显示,仅复制值并将其转换为度。\ 4 /浮点数。\ 5 /所有传感器都已对齐,并且所有可能的相关组合都已使用SENSOR_SIGN [9]进行了对齐。\ 6 /我正在轮询中执行此操作,因此此处不会出现基于中断的所有问题。
Rick2047

对于我的观点\ 1 /,对于所有图形,我还附加了相应的csv文件。或者您要求其他东西。感谢您的良好回应。:)我将在我的努力和时间允许的范围内实施“如何聪明地问问题”。:)
Rick2047

\ 1 /我将改为[滚动,俯仰,偏航和(Mx,My,Mz)(航向,偏角)]工作。
Rick2047

1

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


该链接在同一等式中显示不同的符号。我会尝试所有其他组合。
Rick2047
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.