8

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

我不太擅长三角,但我整理了一个公式,它确实对设备的旋转做出了很好的反应,但也对人们认为不相关的运动做出了反应,例如将设备倾斜成这样的角度对指向的方向没有影响的方式。例如将其平放并“滚动”设备。

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

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

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

4

3 回答 3

2

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

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

  2. 磁力计轴是否已校准?与上述类似的问题,除了更难检查:很难产生均匀的校准磁场。如果您使用环境地磁场,则需要仔细控制工作环境和工具的局部磁场。(谷歌“磁力计校准”。)

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

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

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

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

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

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

于 2010-08-30T06:14:59.500 回答
1

我会指出Euler AnglesRoll Pich Yaw

于 2010-08-18T17:22:29.073 回答
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!)

然而——这不是一个 2D 罗盘问题——想象你把针罗盘中拿出来,平衡它,这样重力就不会影响它保持“水平”,你会发现“北”会有点向上或向下 - 取决于你在地球上的哪个位置(或者,如果在两极,直接向上或向下!)。

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

于 2018-11-08T12:15:59.540 回答