在iPhone 4上使用陀螺仪补偿罗盘延迟

时间:2010-11-18 08:45:25

标签: iphone ios compass-geolocation iphone-4 gyroscope

我一直在试验iPhone 4上的指南针和陀螺仪,并希望得到一些我正在解决的问题的帮助。我想通过使用陀螺仪的数据来弥补指南针的缓慢。

使用CMMotionManager及其CMDeviceMotion对象(motionManager.deviceMotion),我得到了CMAttitude个对象。如果我错了(请),请纠正我,但这是我从CMAttitude对象的yaw属性中推断出的内容(我不需要pitch也不需要roll为了我的目的):

    当电话指向下方时(yaw指示)并逆时针摆动并0转为{{1},
  • PI的范围从deviceMotion.gravity.z0当顺时针摆动时
  • 当设备朝上时,-PI的范围分别从yaw-PI0PI
  • 并且从指南针数据(我正在使用0),我看到指南针会提供从locationManager.heading.magneticHeading0的值,当顺时针摆动时值会增加

好的,所以一起使用所有这些信息,我能够得到一个我称之为360的值,无论设备是向上还是向下,都会给出{{1}的值} horizontal并在设备顺时针摆动时增加(虽然我0360附近时仍然遇到问题 - deviceManager.gravity.z值在此0处发现1}}值)。

在我看来,我可以使用映射到yaw的计算gravity.z值“同步”horizontalmagneticHeading值,并“同步”当我觉得罗盘已“赶上来”时,horizontalmagneticHeading

所以我的问题:

  • 我是否在正确的轨道上?
  • 我是否正确使用了来自horizontal的陀螺仪数据并且上面列出的假设是正确的?
  • magneticHeadingCMDeviceMotion附近时,为什么yaw会惊慌失措?

非常感谢你。我期待着听到你的答案!

4 个答案:

答案 0 :(得分:21)

试着回答......如果我错了,请纠正我。

1.你走在正确的轨道上

CM中的重力已经与用户重力(由用户加速引起的重力值)“隔离”,这就是为什么有两个引力,“gravity”和“userAcceleration”它在Apple CM文档上 //注意:不完全孤立//

3。 如果你的重力为0则意味着相应的轴与重力垂直。 gravity.z是iPhone屏幕,这就是为什么它-9.82m / s2如果你把桌子放在屏幕上直立,实际上很难得到0或由于传感器噪音引起的最大重力值(这是正常的,所有传感器都有一个噪音特别便宜的传感器)。

我在我的应用程序上执行的操作是将我的参考轴切换到其他轴(在您的情况下可能是x或y)以获得某些限制,策略如何取决于目的或哪一方是您的参考。

另一件事是,陀螺仪速度快但不稳定,需要重新校准几个间隔的值。在我的情况下每5秒。我试验陀螺用于计算两个平面之间的角度,我尝试使用90度标尺并且每秒钟会产生大约0.5度的误差并且不断增加,但那是我的,也许其他人有更好的方法来避免错误。

下面是我的步骤“

  1. 初始化
  2. 读取重力XYZ - > Xg Yg Zg
  3. 检查Xg是否< 0.25如果为TRUE,则尝试Yg,然后Zg //注1 = 1g = 9.82 m / s ^ 2
  4. 阅读指南针和陀螺仪
  5. 使用指南针配置和校准陀螺仪,并根据我在第3点使用的轴进行计算。
  6. 如果通过5秒,则重新校准,阅读指南针
  7. 如果与陀螺仪读数的差异> 5度跳过recalibartion陀螺仪。
  8. 如果与陀螺仪读数的差异<1。 5度使用罗盘值校准陀螺仪
  9. 注意:对于7号:是检查手机是否受到磁场影响或是否接近巨大的钢铁或高压电线或工厂噪声和重型设备。

    多数民众赞成...希望这可以帮助你...... 抱歉我的英语..

答案 1 :(得分:10)

这是一个iPhone应用程序的示例,其中罗盘得到陀螺仪的补偿。代码和项目可以在这里看到: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

答案 2 :(得分:0)

在零重力(或自由下落或足够接近)时,偏航轴向量的方向是不确定的。

为了在运动中进行同步,您需要为“水平”值创建一个滤波器,该滤波器具有与磁罗盘相同的延迟/延迟响应特性。要么是这样,要么等到运动停止足够长的时间,以便在重新计算偏移量之前使两个值都稳定下来。

答案 3 :(得分:0)

对问题1的答案是肯定的,问题2你是在正确的轨道上,但是你可以使用不是“水平”的变量名称,问题3由hotpaw2回答,并且在斩波器或直升机中的偏航接近零高度会警告飞行员发出警报。存在时间滞后,因为部分软件是本地的,而有其他因素可以降低速度,包括访问用于检测磁波的传感器,设备位置和方向,为罗盘显示器准备图形输出,计算和输出来自陀螺仪和传感器的数据通过相对较慢的界面,使用通用手持设备而不是为要求的任务类型而定制。