如何将原始 xyz 磁力计数据转换为航向?

How do I convert raw xyz Magnetometer data to a heading?

我正在使用带有简单 3 轴磁力计的嵌入式设备。我目前在微型特斯拉中显示 X Y Z 值,但如何将这些值转换为罗盘航向?我试过在 Google 上查找它,但我发现的一切似乎都非常 complicated/poorly 解释。

如果可能的话,我想知道如何做到倾斜补偿和不补偿倾斜。

我目前在平面上获得的 X、Y、Z 值分别为 70、0.8 和 34.1,以防有帮助。

P.S 如果有帮助,这里是我用于磁力计的代码片段:

mSensor.enable();

while(true){
    wait(1);
    mSensor.getAxis(mData);
    lcd.cls();
    lcd.locate(0,3);
    lcd.printf("X=%4.1f micro-Tesla\n\rY=%4.1f micro-Tesla\n\rZ=%4.1f micro-Tesla", mData.x, mData.y, mData.z);

没有倾斜补偿它并不太复杂:

angle = atan2(Y, X);

这实际上与将笛卡尔坐标 [X, Y] 中的向量转换为极坐标 [长度, 角度] 中的向量相同,不需要长度。

对于倾斜补偿版本,您需要先将 3D 向量 [X, Y, Z] 投影到平面 [X2, Y2] 上,然后使用与之前相同的公式。但要做到这一点,您需要一个加速度计来了解倾斜量。

您首先需要校准(使用设备校准方法,或者将其旋转一整圈以确定完整的场强)。

然后您可以使用 X、Y 和 Z 读数来计算 "north" 相对于您指向的任何方向的位置(请记住,"north" 变化多达 30度取决于你在地球上的位置(称为赤纬 - 见 http://www.magnetic-declination.com/), and that it's not horizontal to the ground either (confusingly, called "inclination" - see https://physics.stackexchange.com/questions/283761/if-you-hold-a-compass-needle-vertical-does-it-point-down-or-up-differently-on-wh/283782

如果您将 X、Y 和 Z 读数描述为“假想圆上的磁力方向 - 这 3 个圆在 3 个不同的平面上,您可以计算矢量指向的逻辑位置在 3 个维度上朝向磁北。

坏消息 - 没有简单的方法可以准确地做你想做的事情,而且绝对不会在所有 3 个读数上没有三角数学的情况下工作(你不能只使用 X and/or Y 单独).

好消息 - 您可能真的不需要知道实际的 "heading" - 大多数应用程序只需要与您已经知道的东西相比的一些局部相对方向。

请注意强磁铁(例如所有现代电机中的磁铁)会严重干扰远处(甚至 10 英尺或更远)的读数 - 从您的 phone 商店获取一个应用程序,显示您的 phone 磁力计读数,并四处挥动磁铁即可轻松查看!