1

我正在构建一个小型设备,它也使用磁力计数据来计算罗盘航向。如果航向被计算为偏航(如果传感器位于平面上),则 LSM9DS0 IMU 传感器工作得很好。

我已经 3D 打印了一个外壳,我将在其中组装所有电子设备。我的问题是它设计不佳,IMU 传感器不在平面上,但它必须保持在 90 度。因此,Z 轴不再是我计算偏航角(或航向)的方法,而是改为 Y。

为了计算 Z 上的航向,我使用了这个公式:

heading.value = atan2((float)dof.my, (float)dof.mx);
        if(heading.value < 0) heading.value += 2*PI;
        if(heading.value > 2*PI) heading.value -= 2*PI;
 heading.value *= 180/PI; 

...其中 my 是磁力计 Y,mx 是磁力计 X

现在,我不知道如何根据其他轴计算航向。

4

1 回答 1

0

我知道这个线程已经有一段时间没有活跃了,但是在我搜索的过程中,我发现了 NXP 的这个出版物,它很好地解释了这个解决方案。

简单来说:

  1. 对齐加速度计读数 (G) 和磁力计读数 (B),使其遵循 NED 坐标系,x 轴指向前方,y 轴和 z 轴分别指向右侧和下方。
  2. 计算横滚和俯仰

    // Using atan2 to restrict +/- PI const roll = Math.atan2(Gy, Gz)

    // Using atan to restrict to +/- PI/2 const pitch = Math.atan(-Gx / (Gy * Math.sin(roll) + Gz * Math.cos(roll)))

  3. 计算偏航角/罗盘航向(这里 Vx、Vy、Vz 对应于硬铁效应,可以按照本出版物中的讨论单独计算):

    // Using atan2 to restring to +/- PI let yaw = Math.atan2( (Bz-Vz)*Math.sin(roll) - (By-Vy)*Math.cos(roll), (Bx-Vx)*Math.cos(pitch) + (By-Vy)*Math.sin(pitch)*Math.sin(roll) + (Bz-Vz)*Math.sin(pitch)*Math.cos(roll))

  4. 将航向更正为 [0, 2*PI)

    if( yaw < 0 ) { yaw += 2*Math.PI }

于 2019-05-13T09:19:01.973 回答