检测iPhone旋转方向的方法?

4
我想创建一个应用程序,可以检测用户旋转iPhone设备时的旋转次数。目前,我正在使用Compass API获取角度并尝试许多方法来检测旋转。以下是我尝试过的解决方案列表: 1/ 在完整的圆上创建2个角度陷阱(完整圆的一部分),以检测罗盘得到的角度是否通过它们。 2/ 将罗盘更新的所有角度距离相加(在updateHeading函数中),然后尝试将总角度除以360 => 我们可以得到旋转次数。
问题是:当手机旋转得太快时,罗盘无法跟上手机的速度,并且返回给我们最新时间的角度(不像真正的旋转那样连续)。
我们也尝试使用加速计来检测旋转。但是,在平面上旋转手机时,这种方式无法工作。
如果您对此问题有任何解决方案或经验,请帮助我。
非常感谢。
3个回答

3
iPhone4内含MEMS陀螺仪,这是最直接的方法。
正如您所注意到的,磁力计反应迟缓。可以通过使用预测算法来减少这种反应迟缓,该算法利用了反应迟缓来对当前方向进行有根据的猜测。
首先,您需要确定传感器的实际性能。为此,您需要在几个旋转速度下以精确的速率旋转它,并记录指南针的行为。旋转平台应该有一种读取瞬时位置的方法。
在较慢的速度下,您将看到不同程度的固定滞后。随着速度的增加,滞后将增长,直到接近180度,此时指南针将突然翻转。在更高的速度下,您将只看到翻转,尽管当翻转重复出现在相同的值时,它可能看起来没有翻转。在某些较高的速度下,指南针可能会出现向后旋转,与旋转方向相反。
获取旋转表可能很麻烦,并确保它不会影响局部磁场(使指南针无用)是一个挑战。理想的桌子将由铝制成,如果您需要使用钢制桌子(最常见),则需要将手机安装在非磁性平台上,以使其尽可能远离钢铁。
当地的机器店是一个好的起点:CNC机器很容易做到所需的事情。
一旦您获得了指南针性能数据,就需要建立观察读数与实际方向和旋转速率之间的模型。反转该模型并将其应用于读数,以获得实际读数的猜测。
一个简单的算法实现将保留读数的历史记录,并保留连续读数之间的差异列表。由于我们知道有指南针滞后,当差值为非零值时,我们将知道当前值由于滞后具有某种程度的不准确性。
下一步是创建“校正”读数列表,其中使用先前实际值的已知滞后来生成更新的值,该值用于创建添加到“校正”列表中的最后一个值的更新值,并存储为最新值。
当实际列表和校正列表中最新值之间的累积校正(超过360度)时,这意味着我们基本上不知道指南针指向哪里。希望不会达到这个点,因为大多数旋转运动通常只持续相当短的时间。
但是,由于您的目标仅是计算旋转次数,因此在累积误差达到相当高的值之前,您将偏少一次完整旋转。我不确定这个值会是多少,因为它取决于实际指南针滞后和实际旋转速率。但是,如果您只关心少量旋转(大约5个),则应该能够获得可用结果。

我希望我能为你这样一份全面的回答提供不止一个赞。 - Andy Dent

0
你可以使用加速度的速度来确定手机旋转的速度,并用它来填补空白,直到手机停止,此时你可以再次查询指南针。

0

如果您正在使用iPhone 4,则问题已经解决,您可以使用Core Motion获取旋转数据。

对于早期设备,我认为一种有趣的方法是尝试使用UIAccelerometer在非常精细的报告间隔上检测设备旋转时的晃动。您可能能够从与旋转平面垂直的运动中检测到一些合理的模式。


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