我目前正致力于iOS的标题估算,我正在使用CoreLocation录制trueHeading
和magneticHeading
,我还记录了原始磁力计数据以及校准的磁力计数据。
我观察到,在默认参考框架CMAttitudeReferenceFrameXArbitraryZVertical
中,对于校准磁数据,我总是得到0。我做错了吗?
另外,在一些论文中,我找到了一个用磁力计计算航向的公式。公式如下:
H = -atan2(my,mx)其中mx,my和H是磁力计的x分量,磁力计的y分量,H正在前进。
当我应用上面的公式时,估计的标题与MagneticHeading或CoreLocation的TrueHeading不匹配。
那么我如何获得标题?
答案 0 :(得分: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帧的测量。 要找到这样的变换或旋转矩阵,您应该知道设备的俯仰角和滚动角。 有关详细信息,请参阅此答案。
您还可以通过详细说明探索好Sensor Fusion manual。