我想创建一个应用程序可以检测用户旋转iPhone设备时的旋转次数。目前,我正在使用Compass API获取角度并尝试多种方法来检测旋转。以下是我尝试过的解决方案列表: 1 /在整圆上创建2个角度陷阱(整圆),以检测我们从指南针获得的角度是否通过它们。 2 /指南针更新时间之间的所有角度距离(在updateHeading函数中)。让我们尝试将和角分成360 =>我们可以得到旋转数
问题是:当手机旋转得太快时,指南针无法赶上手机的速度,它会以最新时间返回给我们角度(不像实际旋转那样连续)。
我们还尝试使用加速度计来检测旋转。但是,在平面上旋转手机时,这种方式无效。
如果您对此问题有任何解决方案或经验,请帮助我。
非常感谢。
答案 0 :(得分:3)
iPhone4包含一个MEMS陀螺罗盘,因此这是最直接的路线。
正如您所注意到的那样,磁力计响应迟缓。这可以通过使用预期算法来减少,该算法使用迟缓来对当前方向的确实做出有根据的猜测。
首先,您需要确定传感器的实际性能。要做到这一点,您需要以几个转速中的每一个以精确的速率旋转它,并记录指南针行为。旋转平台应该有一种方法来读取瞬时位置。
速度较慢时,您会看到不同程度的固定延迟。随着速度的增加,滞后将增加直到接近180度,此时指南针将突然翻转。在更高的速度下,您将看到的只是翻转,但是当翻盖以相同的值重复时,它可能看起来不会翻转。在某些较高的速度下,指南针可能看起来向后旋转,与旋转方向相反。
获得旋转台可能很麻烦,确保它不会影响局部磁场(使指南针无用)是一项挑战。理想的桌子将由铝制成,如果您需要使用钢桌(最常见),您需要将手机安装在非磁性平台上,以使其尽可能远离钢材。
本地机加工车间将是一个很好的起点:数控机床很容易做到所需。
获得指南针性能数据后,您需要建立观察读数与实际方向和旋转速率的模型。反转模型并将其应用于读数以获得实际读数的猜测。
简单的算法实现将保留读数的历史记录,并保留顺序读数之间的差异列表。由于我们知道存在罗盘滞后,当差值非零时,我们将知道当前值由于滞后而具有一定程度的不准确性。
下一步是创建一个“已更正”读数列表,其中先前实际值的已知滞后用于生成更新值,该更新值用于创建添加到最后一个值的更新值。 '更正'列表,并存储为最新值。
当累积校正(实际和校正列表中的最新值之间的差异超过360度时,这意味着我们基本上不知道指南针指向的位置。希望这一点不会达到,因为大多数旋转运动通常应持续相当短的时间。
但是,由于您的目标只是计算旋转次数,因此在累积误差达到更高的值之前,您将关闭不到一整圈。我不确定这个值是什么,因为它取决于实际罗盘滞后和实际旋转速度。但如果你只关心少量轮换(5左右),你应该能够获得有用的结果。
答案 1 :(得分:0)
您可以使用加速度来确定手机旋转的速度,并使用它来填充空白,直到手机停止,此时您可以再次查询指南针。
答案 2 :(得分:0)
如果您使用的是iPhone 4,则问题已解决,您可以使用Core Motion获取旋转数据。
对于早期的设备,我认为一种有趣的方法是尝试在设备旋转时检测摆动,在非常精细的报告间隔内使用UIAccelerometer。您可能能够从与旋转平面成直角的运动中检测到一些合理的模式。