2012-03-26 89 views
0

我一直在尝试CMDeviceMotion,尤其是使用startDeviceMotionUpdatesUsingReferenceFrame。这在我看来不正确的磁场值。CMDeviceMotion的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微特斯拉之间),但是矢量的方向似乎都是错误的。我想知道是否:

  • 这是什么奇怪我的位置只(斯德哥尔摩,瑞典),或
  • 的磁感应强度属性显示剩余磁场没有地球磁场,或
  • 这是错误

您是否有与磁场属性相似的经历?

+0

至少部分您的问题,[文档](http://developer.apple.com/library/ios/DOCUMENTATION/CoreMotion/Reference/CMDeviceMotion_Class/Reference/Reference.html#//apple_ref/occ/ instp/CMDeviceMotion/magneticField)是你的朋友:“...给你设备附近的总磁场,没有设备偏差......这些值反映了地球的磁场加周围场,减去设备偏差。” – rickster 2012-03-26 16:31:22

+0

是的,但真实的行为似乎不是根据文档... – fishinear 2012-03-26 16:36:07

+1

你的问题启发我玩磁力计一些我自己...我试过这个代码(不使用你的答案参考框架,因为我对设备相关的领域方向感兴趣),但我看到的只有<0,0,0>。我错过了那些不在你节选内容的东西吗? – rickster 2012-03-30 21:00:05

回答

2

好的,神秘感解决了。

我现在使用了一个参考坐标系CMAttitudeReferenceFrameXTrueNorthZVertical,它给出了与之前使用的... XArbirtraryCorrectedZVertical类似的结果。然后,我通过使用给定的姿态将其旋转回参考框架来计算磁场矢量相对于重力的位置。

事实证明,磁场相当稳定地指向真北方以东5度,但与地面成约73度的角度。根据我在瑞典的位置,根据this map,这就是正好是

+0

是的。他们并没有在学校教给你:-)地球上的大多数磁场矢量直接指向地面 - 至少,它的确位于我住的地方(在英国)。 – Benjohn 2016-01-14 16:26:44