在我目前的项目中,我遇到了与Core Motion的CMAttitude提供的四元数有关的问题。我将iPhone 5(iOS 6.0.1)放置在一个明确定义的起始位置。然后我开始快速移动设备,就像在快节奏游戏中一样。当我在10-30秒后返回起始位置时,报告的偏航角与起始位置相差10-20度(大多数时间约为11°)。
我使用了旧版(可惜现在不再提供)的Core Motion Teapot示例来验证这种影响。记录欧拉角直接从CMAttitude读取:
我在两个不同时间、不同工厂生产的 iPhone 5 设备上发现了这个问题。但真正奇怪的是,我的 iPhone 4 运行 iOS 5.1.1,它的功能却如预期一般正常。我认为这可能是 iOS 的一个 bug,并已经提交了错误报告,但另一方面,我几乎想象不到还没有人遇到过这个问题。我怀疑这可能与重新设计的 Core Motion API 有关。从版本 5 开始,磁力计(指南针)也被视为传感器融合的一部分。控制台显示 locationd 提供的偏差估计值给 CoreMotion:
我的问题是:使用设备运动时是否有阻止磁力计读数的可能?我尝试关闭位置服务,但没有影响Core Motion。如果不可能,是否有其他选择/解决方法,例如基于加速度计的重力估算?
PS:由于我们处理四元数模型,这与万向锁无关。
编辑:经过更多测量,似乎仅偏航受到影响。俯仰和横滚在容差范围内(<=1°)显示偏差,而偏航则会漂移,无论起始位置如何。CMDeviceMotion.gravity似乎也很干净。
编辑(2):我可以使用附加到最新XCode版本的MotionGraphs示例复制问题。偏航图可重现地从原点漂移。
我使用了旧版(可惜现在不再提供)的Core Motion Teapot示例来验证这种影响。记录欧拉角直接从CMAttitude读取:
![起始位置](https://istack.dev59.com/XHjrf.webp)
![15秒后回到同一位置](https://istack.dev59.com/cQVMO.webp)
NSLog(@"pitch: %f, roll: %f, yaw: %f", attitude.pitch * 180 / M_PI, attitude.roll * 180 / M_PI, attitude.yaw * 180 / M_PI);
我在两个不同时间、不同工厂生产的 iPhone 5 设备上发现了这个问题。但真正奇怪的是,我的 iPhone 4 运行 iOS 5.1.1,它的功能却如预期一般正常。我认为这可能是 iOS 的一个 bug,并已经提交了错误报告,但另一方面,我几乎想象不到还没有人遇到过这个问题。我怀疑这可能与重新设计的 Core Motion API 有关。从版本 5 开始,磁力计(指南针)也被视为传感器融合的一部分。控制台显示 locationd 提供的偏差估计值给 CoreMotion:
locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688
我的问题是:使用设备运动时是否有阻止磁力计读数的可能?我尝试关闭位置服务,但没有影响Core Motion。如果不可能,是否有其他选择/解决方法,例如基于加速度计的重力估算?
PS:由于我们处理四元数模型,这与万向锁无关。
编辑:经过更多测量,似乎仅偏航受到影响。俯仰和横滚在容差范围内(<=1°)显示偏差,而偏航则会漂移,无论起始位置如何。CMDeviceMotion.gravity似乎也很干净。
编辑(2):我可以使用附加到最新XCode版本的MotionGraphs示例复制问题。偏航图可重现地从原点漂移。