我一直在试验iPhone 4上的指南针和陀螺仪,并希望得到一些我正在解决的问题的帮助。我想通过使用陀螺仪的数据来弥补指南针的缓慢。
使用CMMotionManager
及其CMDeviceMotion
对象(motionManager.deviceMotion
),我得到了CMAttitude
个对象。如果我错了(请),请纠正我,但这是我从CMAttitude
对象的yaw
属性中推断出的内容(我不需要pitch
也不需要roll
为了我的目的):
yaw
指示)并逆时针摆动并0
转为{{1},PI
的范围从deviceMotion.gravity.z
到0
当顺时针摆动时-PI
的范围分别从yaw
到-PI
和0
到PI
0
),我看到指南针会提供从locationManager.heading.magneticHeading
到0
的值,当顺时针摆动时值会增加好的,所以一起使用所有这些信息,我能够得到一个我称之为360
的值,无论设备是向上还是向下,都会给出{{1}的值} horizontal
并在设备顺时针摆动时增加(虽然我0
在360
附近时仍然遇到问题 - deviceManager.gravity.z
值在此0
处发现1}}值)。
在我看来,我可以使用映射到yaw
的计算gravity.z
值“同步”horizontal
和magneticHeading
值,并“同步”当我觉得罗盘已“赶上来”时,horizontal
值magneticHeading
。
所以我的问题:
horizontal
的陀螺仪数据并且上面列出的假设是正确的? magneticHeading
在CMDeviceMotion
附近时,为什么yaw
会惊慌失措?非常感谢你。我期待着听到你的答案!
答案 0 :(得分:21)
试着回答......如果我错了,请纠正我。
1.你走在正确的轨道上
CM中的重力已经与用户重力(由用户加速引起的重力值)“隔离”,这就是为什么有两个引力,“gravity”和“userAcceleration”它在Apple CM文档上 //注意:不完全孤立//3。 如果你的重力为0则意味着相应的轴与重力垂直。 gravity.z是iPhone屏幕,这就是为什么它-9.82m / s2如果你把桌子放在屏幕上直立,实际上很难得到0或由于传感器噪音引起的最大重力值(这是正常的,所有传感器都有一个噪音特别便宜的传感器)。
我在我的应用程序上执行的操作是将我的参考轴切换到其他轴(在您的情况下可能是x或y)以获得某些限制,策略如何取决于目的或哪一方是您的参考。
另一件事是,陀螺仪速度快但不稳定,需要重新校准几个间隔的值。在我的情况下每5秒。我试验陀螺用于计算两个平面之间的角度,我尝试使用90度标尺并且每秒钟会产生大约0.5度的误差并且不断增加,但那是我的,也许其他人有更好的方法来避免错误。
下面是我的步骤“
注意:对于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回答,并且在斩波器或直升机中的偏航接近零高度会警告飞行员发出警报。存在时间滞后,因为部分软件是本地的,而有其他因素可以降低速度,包括访问用于检测磁波的传感器,设备位置和方向,为罗盘显示器准备图形输出,计算和输出来自陀螺仪和传感器的数据通过相对较慢的界面,使用通用手持设备而不是为要求的任务类型而定制。