我目前正在开发iPhone应用程序(在iPhone 5,iOS 7,Xcode 5上),这需要非常准确地确定当前的态度。 CMDeviceMotion的“态度”并不能满足这些要求,因为Apple的传感器融合算法似乎过分依赖陀螺仪,而陀螺仪的速度相当快(根据我的经验)。这就是我决定读出裸传感器数据的原因,后来我想将它自己组合在一个传感器融合算法中。
当要求磁力计数据时,有两种可能性:
通过CMMotionManager中的CMMagnetometerData
通过CMDeviceMotion中的CMCalibratedMagneticField关于Apple所说的
此属性返回的CMCalibratedMagneticField可为您提供设备附近的总磁场,而无需设备偏差。与CMMagnetometer类的magneticField属性不同,这些值反映了地球的磁场加上周围的场,减去了设备偏差。
原则上(2.)正是我想要的。
如果磁力计数据正确校准,则测试非常简单。为简单起见,可以将自己限制在两个维度。当设备位于其后面时,组合B_x ^ 2 + B_y ^ 2必须是恒定的,与设备指向的方向无关。它必须等于地球磁场的水平分量(假设设备附近没有其他场)。因此,当执行位于其背面的设备的360度转弯时,B_x上的测量数据B_y应显示圆形。有关详细信息,请参阅here。
现在重点:CMCalibratedMagneticField的数据不会产生圆圈!
有没有人对此有解释?或者有人知道,CMCalibratedMagneticField是如何产生的?当执行设备的“八字形”运动时,磁力计是否在link from above的意义上进行校准,或者运动适合什么?
顺便说一下。为什么“八字形”机芯并没有将设备翻转到三轴之间,这样可以进行link from above所述的校准?
对于这个问题的澄清,我会很高兴...谢谢!
答案 0 :(得分:2)
iOS 7中的磁力计存在问题,误差为+-7º。尝试使用7.1测试版。
修改
磁力计随着时间的推移具有零漂移,但对于突然的位置变化而言是非常不准确的。另一方面,加速度计和陀螺仪可以快速调整突然变化,但作为惯性传感器,它们会在一段时间内失去准确性。
因此当CMCalibratedMagneticField
尝试补偿您的旋转运动时,它会使用来自陀螺仪和加速度计的数据。这是当加速计和陀螺仪的+-7º误差进入并使您的圆偏离轨道时。请查看此answer和此wikipedia article以获取更多信息。
关于8的数字: 两者都做同样的事情,他们在每个方向上定位设备的“北”,以期抵消磁干扰。沿着所有三个轴翻转您的设备将更好地工作,但它更难以执行,并且不易被用户理解。
希望这有帮助。