使用iPhone 4上的陀螺仪来补偿指南针滞后问题

31

我一直在尝试使用iPhone 4上的指南针和陀螺仪,并希望有人能帮我解决一个问题。我想通过使用陀螺仪的数据来弥补指南针速度慢的问题。

使用 CMMotionManager及其 CMDeviceMotion 对象 (motionManager.deviceMotion),我获取到了 CMAttitude 对象。请纠正我如果我错了 (请) ,但这是我从 CMAttitude 对象的 yaw 属性中推断出来的内容(我不需要 pitchroll):

  • 当手机向下指时(被 deviceMotion.gravity.z 指示),并逆时针摆动时,yaw 的范围从 0PI,而顺时针摆动时则从 0-PI
  • 当设备朝上时,yaw 范围从 -PI0 和从 PI0
  • 从指南针数据中(我使用 locationManager.heading.magneticHeading),我看到指南针在摆动顺时针方向时的值从 0360,随着摆动而增加

好的,现在我将所有这些信息整合在一起,能够得到一个我称之为 horizontal 的值,无论设备是朝上还是朝下,都会给出从 0360 的值,并且当设备逆时针摆动时会增加(尽管在 deviceManager.gravity.z 大约为 0 时仍然存在问题 -- yaw 值在这个 gravity.z 值处失控)。

我认为我可以通过计算得出一个映射到磁北极方向的“水平”值,并将“水平”值“同步”到磁北极方向上,当我感觉罗盘已经“追上”时,将“水平”值同步到磁北极方向上。

所以我的问题是:

  • 我这样做是否正确?
  • 我是否正确地使用了CMDeviceMotion 的陀螺仪数据和我列出的假设?
  • 为什么当gravity.z 在约等于0时,yaw会出现异常?

非常感谢。期待您的回答!

4个回答

22

只是试图回答......如果我错了,请纠正我。

1. 是的,你走在正确的路上。

2. 在CM中的重力已经与用户加速度引起的重力值“隔离”开来了,这就是为什么有“重力”和“userAcceleration”,这在苹果CM文档中有说明。//注意:并没有完全隔离//

3. 如果你的重力为0,意味着相应轴与重力垂直。重力.z是iPhone屏幕,所以它是-9.82 m/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度,则跳过陀螺仪的重新校准。
  8. 如果陀螺仪读数与校准值之间的差异小于5度,则使用指南针值校准陀螺仪。

注意:第7点是检查手机是否受到磁场、靠近巨大钢铁或高压电线,或在工厂设备的噪音和重负荷环境中。

就这些了... 希望这能帮到你... 对我的英语表示抱歉。


在初始化步骤中,请确保提示用户稍作停顿。如果您的应用程序不会遇到钢铁或电力,请跳过第7步,在我的情况下,我需要它,因为它用于具有高压设备和钢管的工厂。 - DoogyHtw

10

0

当处于零重力(或自由落体,或足够接近)时,偏航轴向量的方向是未定义的。

为了在运动中进行同步,您需要创建一个过滤器来处理您的“水平”值,使其具有与磁罗盘相同的滞后/延迟响应特性。要么如此,要么等待运动停止足够长的时间,以便两个值都稳定下来再重新计算偏移量。


0

问题1的答案是肯定的,问题2你走在了正确的轨道上,但你可以使用一个不是“horizontal”的变量名,问题3由hotpaw2回答,而且直升机或直升机在接近零高度时的偏航会通过警报提醒飞行员。由于软件的一部分是本地的,因此存在时间滞后,同时还有其他因素可能会减慢它的速度,包括访问用于检测磁波的传感器、设备位置和方向、为指南针显示准备图形输出、通过相对较慢的接口从陀螺仪和传感器计算和输出数据,使用通用手持设备而非专门设计用于所要求的任务类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接