我正在构建一个小型设备,它也使用磁力计数据来计算罗盘方向。如果航向计算为偏航(如果传感器位于平面上),则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;
...我的是磁力计Y和mx磁力计X
现在,我不知道如何根据其他轴计算航向。
答案 0 :(得分:0)
我知道这个线程已经有一段时间没有活动了,但是在搜索过程中,我遇到了this publication by NXP,这很好地解释了该解决方案。
简而言之:
计算侧倾和俯仰
// 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)))
计算偏航/罗盘航向(此处Vx,Vy,Vz对应于可以如this publication中所述单独计算的硬铁效应):
// 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))
将标题更正为[0,2 * PI)
if( yaw < 0 ) {
yaw += 2*Math.PI
}