我目前正在为iOS进行航向估计,并且正在使用CoreLocation记录trueHeading
和magneticHeading
,并且还记录了原始磁力计数据和校准的磁力计数据。
我观察到在默认参考系CMAttitudeReferenceFrameXArbitraryZVertical
中,校准磁数据的总值为0。难道我做错了什么?
另外,在一些论文中,我找到了一个公式来计算磁力计的航向。计算公式如下:
H = -atan2(my,mx)其中mx,my和H是磁力计的x分量,磁力计的y分量,H是航向。
当我应用上述公式时,估计的航向与CoreLocation中的MagneticHeading或TrueHeading都不匹配。
那么如何获得标题?
最佳答案
我来帮你
我观察到在默认参考框架中,
CMAttitudeReferenceFrameXArbitraryZVertical,我总是得到0
校准的磁数据。难道我做错了什么?
是。您不应该得到零结果。
这是演示如何在iO处获取传感器数据的代码段:
[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。
关于ios - iOS默认引用系上的真航向估计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32614098/