我正在开发一款iPhone应用程序,试图计算移动汽车的加速度。类似的应用程序已经完成了这个任务(如Dynolicious),但是不同之处在于这个应用程序旨在在普通城市驾驶中使用,而不是在直线赛道上使用。
这带来了一个大问题,Dynolicious幸运地避免了这个问题:山坡。是的,山坡。
包括校准和实际驾驶在内有两个重要阶段。
我们的初始测试很简单,但受到了后果的影响。在校准阶段,我测量了手机上的平均力,而在运行过程中,我仅仅减去了当前力与平均力的差值以获取当前帧的加速度。问题在于,典型的汽车受到的力远不止正向的力 - 从转弯到路面坑洞都会导致数值与实际情况不同步。
下一个尝试是添加一个条件,即iPhone必须定位在靠近车辆后部的方向上。使用这种方法,我试图跟踪z轴上的力,但是除非iPhone直立放置,否则显然会出现问题,因为存在重力。
通过一些三角学的计算,我设法从方程中排除重力,使得汽车实际上被iPhone非常准确地读取。
直到我碰到了一个坡度。一旦汽车的角度改变,突然间我收到的加速度和减速度就变得毫无意义了,我们又再次失去了同步。
与一位数学能力比我高的人交谈后,我找到了一个解决方案,而我一直在试图实现它已经超过了我想承认的时间。以下是它的步骤:
1)在校准阶段,将重力测量为矢量而不是大小。存储该矢量。 2)当汽车最初向前移动时,获取运动矢量并减去重力。使用这个作为前进动力。(暂时忽略用户情况的复杂性,让我们专注于数学问题 :)) 3)从前向量和重力向量构建平面。 4)每当接收到一个力时,将其投影到平面上以消除侧向力等。
5) 接着,利用已知的万有引力大小、前进方向运动的已知方向,基本上解决一个三角形,得到前进向量。在这个新系统中最困难的问题不是步骤5,因为我已经让所有数字看起来都应该正确了。实际上困难的部分是检测前进向量。我选择那些大小超过重力的向量,然后对它们进行平均并减去重力。(我正在进行一些错误检查,以确保我不是仅仅因为iPhone加速度计偏差了一点就使用了某个力量,这种情况比我想象的更频繁)。但是,如果我绘制这些向量,它们实际上会有20-30度的角度偏差,这可能会导致一些严重的不准确性。最终结果是,这个应用程序现在比以前更加不准确。
因此,基本上 - 所有数学和iPhone专家们 - 有什么明显的错误吗?有任何可能更好的解决方案吗?任何有用的经验可以提供帮助吗?
奖励:提供250美元赏金给第一个能提供解决方案的回答者。