让我试着帮助你。
我观察到在默认参考框架 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 帧的测量。要找到这样的变换或旋转矩阵,您应该知道设备的俯仰角和滚动角。有关详细信息,请参阅此答案。
您还可以浏览具有详细说明的优秀传感器融合手册。