30

我一直在用 iPhone 4 上的指南针和陀螺仪进行试验,并希望对我遇到的问题有所帮助。我想通过使用来自陀螺仪的数据来补偿罗盘的缓慢。

使用CMMotionManager和它的CMDeviceMotion对象(motionManager.deviceMotion),我得到了CMAttitude对象。如果我错了(请)纠正我,但这是我从CMAttitude对象的yaw属性中推断出来的(我不需要,也不需要pitchroll

  • yaw范围从0PI手机指向下方(如 所示deviceMotion.gravity.z)并逆时针摆动0到 到-PI顺时针摆动
  • 当设备指向上方时,yaw范围分别为-PIto0PIto0
  • 从罗盘数据(我正在使用locationManager.heading.magneticHeading),我看到罗盘给出的值从0360,顺时针摆动时值增加

好的,所以将所有这些信息结合在一起,我可以得到一个我称之为的值horizontal,无论设备是向上还是向下,都会在设备顺时针摆动时给出从0to和增加的值(尽管我360我仍然遇到麻烦-价值deviceManager.gravity.z在这个价值上吓坏了)。0yawgravity.z

在我看来,我可以使用映射到的计算值“同步”horizontal和值,并在我感觉指南针“赶上”时“同步”该值。magneticHeadinghorizontalmagneticHeadinghorizontalmagneticHeading

所以我的问题:

  • 我在正确的轨道上吗?
  • CMDeviceMotion是否正确使用了陀螺仪数据并且我上面列出的假设是否正确?
  • 为什么在附近yaw时会吓坏?gravity.z0

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

4

4 回答 4

21

只是想回答...如果我错了请纠正我..

1.是的,你在正确的轨道上

2. CM 中的重力已经与用户重力“隔离”(由用户加速度引起的重力值),这就是为什么在苹果 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 度,则跳过重新校准陀螺仪。
  8. 如果与陀螺仪读数的差异 < 5 度,则使用罗盘值校准陀螺仪

注意:对于数字 7 :是检查手机是否受到磁场或靠近巨大的钢铁或高压电线或工厂车间嘈杂和重型设备的影响。

就是这样......希望这可以帮助你......对不起我的英语......

于 2010-12-13T09:23:27.093 回答
10

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

于 2011-09-19T16:03:02.230 回答
0

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

于 2010-12-12T16:13:18.293 回答
0

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

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

于 2010-12-08T06:18:54.840 回答