在iPhone4上使用陀螺仪补偿罗盘滞后

在iPhone4上使用陀螺仪补偿罗盘滞后,iphone,ios,compass-geolocation,iphone-4,gyroscope,Iphone,Ios,Compass Geolocation,Iphone 4,Gyroscope,我一直在iPhone4上试用指南针和陀螺仪,希望能对我遇到的问题提供帮助。我想用陀螺仪的数据来补偿指南针的慢度 使用CMMotionManager及其CMDeviceMotion对象(motionManager.deviceMotion),我获得CMAttitude对象。如果我错了,请纠正我(请),但以下是我从CMAttitude对象的yaw属性(我不需要pitch也不需要roll)中得出的结论: 当手机朝下(如设备运动.gravity.z所示)并逆时针摆动时,偏航范围从0到PI,顺时针摆动时

我一直在iPhone4上试用指南针和陀螺仪,希望能对我遇到的问题提供帮助。我想用陀螺仪的数据来补偿指南针的慢度

使用
CMMotionManager
及其
CMDeviceMotion
对象(
motionManager.deviceMotion
),我获得
CMAttitude
对象。如果我错了,请纠正我(请),但以下是我从
CMAttitude
对象的
yaw
属性(我不需要
pitch
也不需要
roll
)中得出的结论:

  • 当手机朝下(如
    设备运动.gravity.z
    所示)并逆时针摆动时,偏航范围从
    0
    PI
    ,顺时针摆动时,偏航范围从
    0
    -PI
  • 当设备朝上时,
    偏航
    范围分别为
    -PI
    0
    PI
    0
  • 从指南针数据(我使用的是
    locationManager.heading.MagneticheReading
    ),我看到指南针给出的值从
    0
    360
    ,顺时针摆动时值会增加
好的,综合使用所有这些信息,我可以得到一个我称之为“水平”的值,无论设备是朝上还是朝下,都会给出从
0
360
的值,当设备顺时针旋转时,该值会增加(尽管当
deviceManager.gravity.z
0
附近时,我仍然有问题,
yaw
值在此
gravity.z
值处出现异常)

在我看来,我可以使用映射到
magnetichereading
的计算出的
水平
值,将
水平
磁读数
值“同步”到
水平
磁读数
,当我感觉指南针“赶上”时

所以我的问题是:

  • 我做得对吗
  • 我是否正确使用了
    CMDeviceMotion
    中的陀螺仪数据,并且上面列出的假设是否正确
  • gravity.z
    0
    附近时,
    yaw
    为什么会发疯

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

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


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

问题1的答案是肯定的,问题2您在正确的轨道上,但您可以使用非“水平”的变量名,问题3是answehotpaw2显示红色,直升机或直升机在接近零高度时出现偏航,将向飞行员发出警报。由于部分软件是本地的,因此存在时间延迟,而其他因素可能会使其减速,包括使用传感器检测磁波、设备位置和方向、准备图形输出对于罗盘显示,使用一个通用手持设备,而不是为所要求的任务类型定制的,通过一个相对缓慢的界面计算和输出陀螺和传感器的数据。

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

是的,你在正确的轨道上

2.CM中的重力已经与用户重力“隔离”(重力值由用户加速度引起),这就是为什么apple CM文档中有两个重力,“重力”和“用户加速度” //注:未完全隔离//

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

我在我的应用程序上所做的是,我会将我的参考轴切换到另一个轴(在您的情况下,可能是x或y轴),以满足某些限制,策略如何取决于目的或您的参考方向

另一件事是,陀螺仪很快,但不稳定,你需要每隔几秒钟重新校准数值。在我的例子中,每5秒钟。我用陀螺仪计算两个平面之间的角度,我用90度尺试了试,它每秒会给出0.5度的误差,试着继续增加,但那是我的,也许不是她有更好的方法来避免错误

以下是我的步骤“

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

    就这些…希望这能帮助你。。。
    对不起,我说的是英语。

    这是一个iPhone应用程序的示例,其中指南针通过陀螺仪得到补偿。代码和项目可以在这里看到:

    对于初始化步骤,请确保提示用户停止一段时间。如果您的应用程序不会遇到钢铁或电力,请跳过步骤7,以我的情况为例,我需要它