使用iPhone传感器检测旋转

3
我正在开发一款应用程序,以检测手机是否旋转了360度。这种旋转很可能会在35秒内完成。如何准确地检测它?我已经阅读了一些关于“积分”和使用陀螺仪进行短期补偿以及使用加速度计进行补偿的文章。最好的方法是什么?首先,我该如何从陀螺仪中获取旋转值?
我不太理解通过逆转换CMAttitude乘以RotationMatrix所得到的旋转矩阵。即使我没有使用手机,CMAttitude.yaw也会给我不同的值。我还看过茶壶示例。我的代码与此类似,只是我需要自己处理从RotationMatrix获取的数据,因为我没有使用OpenGL来完成这项任务。
提前致谢, Hidde

你需要检测哪个轴的360度旋转? - Emile Cormier
任何轴。手机的位置未知。 - Hidde
如果不是现实世界中的轴线,那么相对于手机的轴线是什么? - Emile Cormier
1个回答

1

在研究核心运动API时,似乎最好的方法是监测旋转速率。具体来说,通过CMDeviceMotion接口声明一个rotationRate属性,其中包含以下讨论:

CMRotationRate结构包含指定设备围绕三个轴旋转速率的数据。该属性的值包含通过Core Motion算法去除偏差的陀螺仪数据的测量结果。另一方面,CMGyroData的同名属性提供了陀螺仪的原始数据。该结构类型在CMGyroData.h中声明。

您可以通过声明您的兴趣来监测事件,方法是通过CMMotionManager method:

- (void)startDeviceMotionUpdatesUsingReferenceFrame:(CMAttitudeReferenceFrame)referenceFrame toQueue:(NSOperationQueue *)queue withHandler:(CMDeviceMotionHandler)handler

然后,您需要进行一些数学计算,以确定旋转按给定速率发生的时间量,以构成完整的360度旋转。


谢谢,我会进行一些测试和计算。你给了我正确的设置。 - Hidde
所以我已经进行了一些测试,但是当我将Y轴上的每次旋转相加时,即使我根本没有移动手机,也会得到一个不断变化的数字。 - Hidde
陀螺仪提供的旋转速率存在偏差(偏移量),而且这个偏差会随时间变化。iPhone使用复杂的算法(称之为“传感器融合”,但可能是卡尔曼滤波器)通过使用加速度计来补偿这种偏差。在CMDeviceMotion中获取的姿态数据是该传感器融合算法的结果,而旋转速率则未经处理。 - Emile Cormier
当使用姿态对象时,我得到了更好的结果。然而,该值仍然会有些抖动,当我快速移动它时,抖动很厉害(太多了)。有没有办法来补偿这个问题?并且我是否仍然需要在接收到的姿态对象上调用multiplyByInverseOfAttitude函数? - Hidde

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