2010-01-19 153 views
4

我想创建一个应用程序,可以检测用户旋转iPhone设备时的旋转次数。目前,我正在使用Compass API来获取角度并尝试多种方法来检测旋转。以下是我尝试过的解决方案列表: 1 /在整个轮次创建2个角度陷阱(整个棋子),以检测我们从罗盘获得的角度是否通过了它们。 2 /计算指南针更新次数之间的所有角度距离(在updateHeading函数中)。让我们尝试将总和角度分为360 =>我们可以得到旋转数字检测iPhone旋转旋转?

问题是:当手机旋转得太快时,指南针无法跟上手机的速度,并且它会返回给我们最新时间的角度(不像实际旋转那样持续)。

我们也尝试使用加速计来检测自旋。但是,当您在平面上旋转手机时,这种方式无法工作。

如果您有任何有关此问题的解决方案或经验,请帮助我。

非常感谢。

回答

0

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

3

iPhone4包含MEMS陀螺仪,所以这是最直接的路线。

正如你所注意到的那样,磁力仪的反应迟钝。这可以通过使用一种预测算法来减少,该算法使用缓慢来对当前的方向进行有根据的猜测。

首先,您需要确定传感器的实际性能。要做到这一点,您需要以几个转速中的每一个以精确的速度旋转它,并记录指南针行为。旋转平台应该能够读取瞬时位置。

在较慢的速度下,您将看到不同程度的固定滞后。随着速度的增加,滞后将增加,直至接近180度,此时指南针将突然翻转。在更高的速度下,所有你会看到的是翻转,虽然它可能似乎不翻转时翻转重复在相同的值。在某些更高的速度下,指南针可能会向后旋转,与旋转方向相反。获取旋转表可能很麻烦,并且确保它不会影响本地磁场(使指南针无用)是一项挑战。理想的桌子将由铝制成,如果您需要使用钢制桌子(最常见),则需要将手机安装在非磁性平台上,以尽可能远离钢材。

本地机器商店将是一个很好的开始:CNC机器可以轻松地完成所需的任务。

一旦你获得了指南针的性能数据,你将需要建立一个观测读数与实际方向和转速的模型。翻转模型并将其应用于读数以获得实际读数的猜测。

一个简单的算法实现将保持读数的历史记录,并保持连续读数之间的差异列表。由于我们知道存在指南针滞后,当差值非零时,我们将知道当前值由于滞后而具有某种程度的不准确性。

下一步是创建一个'已更正'读数的列表,其中先前实际值的已知滞后用于生成更新值,该更新值用于创建一个更新值,该值已被添加到最后一个值中'已更正'列表,并作为最新值存储。

当累计修正值(实际列表中的最新值与修正列表中的最大值之间的差值超过360度时,这意味着我们基本上不知道指南针指向的位置,希望这一点不会达到,因为大多数旋转运动通常应该持续相当短的时间

但是,由于您的目标只是计数旋转,所以您将以小于完整旋转的速度旋转,直到累积误差达到相当高的值。不知道这个值是什么,因为它取决于实际的罗盘滞后和实际的旋转速度,但如果你只关心少量的旋转(5左右),你应该能够获得可用的结果。

+0

我希望我能给你一个以上upvote这样一个全面的答案。 – 2010-10-06 14:10:38

0

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

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