使用原始加速度计和磁力计数据计算磁航向

9
我有一个加速度计和一个磁力计,它们分别产生原始的X、Y和Z读数。我需要从中确定物体的磁头方向。
我不太擅长三角学,但我已经制定了一个公式,对设备的旋转反应相当不错,但也会对一些看似无关的移动做出反应,例如将设备倾斜到对其指向没有影响的位置,如平放并“滚动”设备。
我认为我用于计算磁头方向的公式是正确的,但我认为我的俯仰和滚动弧度输入是错误的。
所以我想问的核心问题(除非有人实际上有一个可以完成此操作的公式),就是如何使用加速度计来计算弧度,以获取俯仰和滚动角度。
其次,任何关于磁头公式本身的信息都将是很棒的。

你想计算什么标题,相对于哪个对象?我可以假设你在谈论手机吗? - Seth
3个回答

2
根据您的应用程序所需的准确度,您可能需要解决以下几个问题:
1. 加速度计轴是否已校准?我见过MEMS加速度计其轴不相互垂直,并且每个轴具有明显不同的响应特性(通常X和Y会匹配,而Z会不同)。您需要从设备提供的任何物理读数中合成理想的XYZ轴。 (搜索“加速度计校准”)
2. 磁力计轴是否已校准?与上述问题类似,但难度更大:很难产生均匀校准的磁场。如果使用环境地磁场,则需要仔细控制工作环境和工具的局部磁性。 (搜索“磁力计校准”)
3. 在加速度计和磁力计分别进行校准后,它们的轴需要相对彼此进行校准。由于这两个设备通常焊接在PCB上,因此几乎肯定存在重大的错位。在许多情况下,板子布局和设备参数甚至可能不允许XYZ轴相互对应!这可能是从实验室角度最难的部分,因此我建议您使用其他已经校准了这两种传感器的硬件进行直接比较(例如iPhone或Android手机-但在使用之前请验证设备)。通常,这是通过调整前两个校准矩阵来完成的,直到它们生成正确对齐的向量为止。
4. 仅在您生成相互校准的磁场和加速度计向量后,才能应用其他回答者建议的解决方案。
我只描述了静态解决方案,其中磁力计和加速度计相对于当地的重力和磁场均保持静止。如果您需要在系统快速移动时实时生成响应,则需要考虑每个传感器的时间行为。有两种基本方法可以做到这一点:1)对每个传感器应用时域滤波器,以使它们的输出共享一个公共时间域(通常会添加一些延迟)。2)使用预测建模实时修改传感器输出(延迟较少,但噪声更多)。
我见过Kalman滤波器用于此类应用,但在向量域中应用它们可能需要使用四元数而不是欧拉矩阵。四元数在计算上更容易使用(与矩阵相比需要更少的操作),但我发现它们更难理解和正确使用。
或者,您可以选择完全不同的路径,并使用统计和数据拟合一次完成所有上述工作。考虑以下问题:给定6个输入值(XYZ分别来自未校准的磁力计和加速度计)和对设备的引用(假设它是手持的,并且在外壳上绘制了一个箭头),输出表示指向外壳箭头的磁性方位以及相对于重力矢量的箭头高度(外壳倾斜)。

使用校准过的参考设备(如上所述),将其与待校准的设备配对,并在不同方向下进行数百个数据点的采集。然后使用强大的数学软件包,如Matlab、MathCAD、R或SciPy来设置和解决非线性方程,以创建变换矩阵。


PS:我使用了一个廉价的计算机化望远镜底座来完成这个最后的部分:手动完成实在是不可行的。 - BobC

1

1

你没有考虑到足够的维度。这只是在两个维度上的答案,如果你能找到一种方法来确保“Z”始终与重力对齐,那么它会非常有效。

int heading=180-atan2(mag_datX, mag_datY)/0.0174532925; // 0/359=N, 90=E, 180=S, 270=W 

(如果您直接从设备上阅读,请注意它可能返回X、Z、Y,而不是X、Y、Z!)
然而,这不是一个二维罗盘问题——想象一下您将指针从罗盘中取出,并平衡它,使重力对保持“水平”没有影响,您会发现“北”会稍微朝上或朝下指向——取决于您在地球上的位置(或者,在极地,直接朝上或朝下)。
因此,您需要尝试计算所有3个值的三维向量——这是一个矩阵运算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接