2

我目前正在为 iOS 进行航向估计,我正在记录trueHeadingmagneticHeading使用 CoreLocation,我还在记录原始磁力计数据以及校准的磁力计数据。

我观察到,在默认参考框架中,CMAttitudeReferenceFrameXArbitraryZVertical校准磁数据总是得到 0。难道我做错了什么?

此外,在一些论文中,我找到了一个从磁力计计算航向的公式。公式如下:

H = -atan2(my,mx) 其中 mx、my 和 H 是磁力计的 x 分量,磁力计的 y 分量,H 是航向。

当我应用上述公式时,估计的航向与 CoreLocation 的 MagneticHeading 或 TrueHeading 都不匹配。

那么如何获取Heading呢?

4

1 回答 1

0

让我试着帮助你。

我观察到在默认参考框架 CMAttitudeReferenceFrameXArbitraryZVertical 中,校准磁数据总是得到 0。难道我做错了什么?是的。你不应该得到零结果。

这是演示如何在 iOs 上获取传感器数据的代码片段:

[motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXMagneticNorthZVertical
                                                            toQueue: sensorsQueue
                                                            withHandler:^ (CMDeviceMotion motionData, NSError error)

   {
     if(error != NULL){
       DLog(@"sensors error info: %@",[error localizedDescription]);
     }
     else
     {
       sensorEntryM.type      = SENSOR_ENTRY_MAGNETOMETER;
       sensorEntryM.values[0] = motionData.magneticField.field.x;
       sensorEntryM.values[1] = motionData.magneticField.field.y;
       sensorEntryM.values[2] = motionData.magneticField.field.z;
       sensorEntryM.values[3] = motionData.magneticField.accuracy;

     }
   }];

但请注意,传感器测量是在与设备紧密连​​接的车身框架中获得的。为了获得航向角,您应该将车身框架转换为全局ENU框架。值得注意的是,您的公式

H = -atan2(my,mx)

仅适用于 ENU 帧的测量。要找到这样的变换或旋转矩阵,您应该知道设备的俯仰角和滚动角。有关详细信息,请参阅此答案。

您还可以浏览具有详细说明的优秀传感器融合手册。

于 2015-09-17T14:22:43.817 回答