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

时间:2010-06-25 19:47:02

标签: accelerometer trigonometry compass-geolocation magnetometer

我有一个加速计和磁力计,每个都产生原始的X,Y和Z读数。由此我需要确定物体的磁航向。

我在触发器上的表现并不是很好,但是我已经把一个对设备的旋转做出很好反应的公式放在一起,但也响应了人们认为不相关的运动,例如对设备进行倾斜以这种方式对其指向的方向没有影响。如平放和“滚动”设备。

我认为我计算磁航向的公式很好,但我认为输入的俯仰和滚动弧度是错误的。

所以我猜我问题的核心(除非有人实际上有一个公式可以做到这一点),你是如何用弧度计算角度的,使用加速度计进行俯仰和滚动。

其次,标题公式本身的任何信息都会很棒。

3 个答案:

答案 0 :(得分:2)

根据应用程序所需的准确性,您可能需要解决几个问题:

  1. 加速度计轴是否已校准?我已经看到MEMs加速度计的轴不是相互垂直的,并且每个轴的响应特性明显不同(通常X和Y匹配,Z会不同)。您需要从设备提供的任何物理读数中合成理想的XYZ轴。 (谷歌“加速计校准”。)

  2. 磁力计轴是否已校准?除了更难以检查之外,与上述类似的问题:产生均匀校准的磁场非常困难。如果使用环境地磁场,则需要仔细控制工作环境和工具的局部磁性。 (Google'磁力计校准'。)

  3. 在单独校准加速度计和磁力计后,需要相对于彼此校准它们的轴。由于这两种器件通常都焊接到PCB上,因此几乎可以保证显着的不对准。在许多情况下,电路板布局和器件参数甚至可能不允许XYZ轴相互对应!从实验室的角度来看,这可能是最困难的部分,因此我建议您使用具有两种传感器并且已经过校准的其他硬件(例如iPhone或Android手机)进行直接比较,但之前要验证设备使用)。通常,这是通过调整先前的两个校准矩阵直到它们生成相对于彼此正确对齐的向量来实现的。

  4. 只有在生成相互校准的磁力和加速度计矢量后,才能应用其他受访者建议的解决方案。

  5. 我只描述了静态解决方案,其中磁力计和加速度计相对于局部重力和磁场都是静止的。如果您需要在系统快速移动时实时生成响应,则需要考虑每个传感器的时间行为。有两种基本方法可以做到这一点:1)对每个传感器应用时域滤波器,使其输出共享一个公共时域(通常会增加一些延迟)。 2)使用预测建模实时修改传感器输出(延迟较少,但噪声较大)。

    我已经看到用于此类应用的卡尔曼滤波器,但在矢量域中应用它们可能需要使用四元数而不是欧拉矩阵。四元数更易于计算使用(与矩阵相比所需的操作更少),但我发现它们更难以理解和正确使用。

    或者,您可以选择完全不同的路径,并使用统计数据和数据拟合来完成上述所有工作。考虑如下问题:给定6个输入值(XYZ,每个来自未校准的磁力计和加速度计)和对设备的参考(假设它是手持的,并且在壳体上有一个箭头),输出一个角度代表表壳上箭头指向的磁力轴承,以及箭头相对于重力矢量的高度(表壳倾斜)。

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

答案 1 :(得分:0)

我会指向Euler AnglesRoll Pich Yaw

答案 2 :(得分:0)

您没有考虑足够的维度。这仅是二维的答案,如果您能找到一种方法来确保“ 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!)

但是-这不是2D指南针问题-想象您从指南针中拔出了 针,对其进行了平衡,这样重力就不会使其保持“水平”,并且您会发现“北”会指向上方或下方-根据您在地球上的位置而定(或者,如果在两极,则直接向上或向下!)。

因此,您需要尝试从所有3个值中计算3维向量-这是一个矩阵运算。