我一直在尝试CMDeviceMotion,尤其是startDeviceMotionUpdatesUsingReferenceFrame。在我看来,其中的magneticField值似乎不正确。

例如,如果我这样做:

CMDeviceMotion *manager = [[CMDeviceMotion alloc] init];
manager.deviceMotionUpdateInterval = 0.1;
[manager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical toQueue:queue withHandler:^(CMDeviceMotion *motion, NSError *error) {
    CMMagneticField fld = motion.magneticField.field;
    NSLog( @"%5.1f %5.1f %5.1f", fld.x, fld.y, fld.z );
    [self handleDeviceMotion:manager.deviceMotion];
}];


它显示了一个磁场矢量,大小约为50,但几乎与重力对齐。也就是说,当设备平放在桌子上时,x和y接近零,z接近-50,与我如何旋转设备无关。

50的大小对于地球磁场是正确的(根据Wikipedia应该在25到65微特斯拉之间),但是矢量的方向似乎都是错误的。我想知道是否:


仅在我的位置(瑞典斯德哥尔摩)这才是唯一的东西,或者
magneticField属性显示没有磁场的剩余磁场,或者
这是虫子


您对magneticField属性有类似的经历吗?

最佳答案

好了,谜团解决了。

现在,我使用了参考框架CMAttitudeReferenceFrameXTrueNorthZVertical,该结果与之前使用的... XArbirtraryCorrectedZVertical相似。然后,我通过使用给定的姿态将其旋转回到referenceFrame,从而计算了磁场相对于重力的位置。

事实证明,magneticField稳定地指向真北向东5度,但与地面的夹角约为73度。根据this map,这完全符合我在瑞典的位置的期望。

10-08 05:03