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