11

我正在开发一个 iPhone 应用程序,我们正在尝试计算移动汽车的加速度。类似的应用程序已经实现了这一点(Dynolicious),但不同的是,该应用程序旨在用于一般城市驾驶期间,而不是在拖曳带上使用。

这让我们想到了一个 Dynolicious 幸运地能够避免的大问题:山丘。是的,丘陵。

这有两个重要阶段:校准和实际驾驶。

我们最初的运行很简单,并遭受了后果。在校准阶段,我取手机上的平均力,而在跑步过程中,我只是从当前力中减去平均力,得到这一帧的当前加速度。这样做的问题是,典型的汽车受到的力远远超过向前的力——从转向到坑洼的一切都导致数值与实际发生的情况不同步。

接下来的运行是添加条件,即 iPhone 必须以屏幕朝向汽车后部的方式定向。使用这种方法,我试图只跟随 z 轴上的力,但这显然会导致问题,除非 iPhone 直接直立,因为重力。

后来做了一些三角函数,我设法从方程中计算出重力,所以iPhone实际上非常非常好地读取了汽车。

直到我碰到一个斜坡。当汽车的角度发生变化时,突然间我收到了毫无意义的加速和减速,我们又一次失去了同步。

与数学上比我聪明得多的人交谈会导致我尝试实施的解决方案比我想承认的要长。其步骤如下:

1) 在校准过程中,将重力测量为矢量而不是大小。存储该向量。2)当汽车最初向前移动时,取运动矢量并减去重力。以此为前进动力。(暂时忽略这将是困难的用户案例,让我们专注于数学:) 3) 从前向矢量和重力矢量,构造一个平面。4)每当收到一个力时,将其投射到所述平面上以消除侧向力等。5) 然后,使用该力、已知的重力大小和已知的前向运动方向基本上求解三角形以获得前向矢量。

在这个新系统中造成最大困难的问题不是第 5 步,我已经达到了所有数字看起来都应该如此的地步。困难的部分实际上是前向向量的检测。我正在选择大小超过重力的向量,然后从那里对它们进行平均并减去重力。(我正在做一些错误检查,以确保我没有因为 iPhone 加速度计稍微关闭而使用力,这比我想要的更频繁地发生)。但是,如果我绘制我正在使用的这些向量,它们实际上会以大约 20-30 度的角度变化,这可能会导致一些严重的不准确性。最终结果是该应用程序现在比以前更加不准确。

所以基本上 - 你所有的数学和 iPhone 大脑在那里 - 任何明显的错误?任何可能更好的解决方案?任何可能有用的经验?

奖励:为找到解决方案的第一个答案提供 250 美元的奖金。

4

5 回答 5

10

你需要一个陀螺仪。否则,在山上加速的汽车有多种配置,可以在加速度计上产生完全相同的读数。它们将完全无法区分。这就是惯性导航系统结合陀螺仪和加速度计的原因。

你不能这样做的原因是爱因斯坦给出的!使用局部测量,您无法区分重力和加速度。您确实有一些有用的非本地信息 - 假设这里的重力和那里几码的重力具有相同的值。但是,如果没有执行所谓的“平行传输”的方法,就无法比较两个不同位置的重力。这就是陀螺仪的作用。

忘记 250 美元,但我认为你应该给我一杯啤酒,因为我为你节省了研发时间。:-)

于 2010-04-28T21:39:05.373 回答
3

为了解决这个问题,如果可能的话,你需要引用汽车外部的东西。可能使用GPS测量海拔增益是最直接的方法。也就是说,使用测量的高程增益计算山坡的坡度,并使用它来补偿加速度测量。

正如其他人所提到的,在非常深的层次上,没有办法区分重力和加速度。这被称为等效原理(并且是爱因斯坦最重要的见解之一)。因此,要解决这个问题,需要知道的不仅仅是加速度计的输出,这使问题变得困难。有关该问题的各种方法,请参见此处

你最好的希望是参考车外的东西,比如 GPS 信号,或者图片来测量车外东西的位置变化,或者地球的磁场等。因为这会发生在很多金属附近(汽车)地球的场可能很难测量,一些参考物体(如太阳)的连续照片显然是困难的,所以看起来 GPS 是你最好的选择。

有关为什么需要外部参考的更多信息:

值得考虑是否可以使用重力的独特功能:1)它总是“打开”,2)它总是具有相同的大小(对于这种情况)。但是当你只知道总加速度时,你就不能可靠地将这两个贡献分开。如下图所示,仅仅知道重力的大小是不够的……下图是在手机的参考系中绘制的,它测量合成加速度(黑色矢量),较大的彩色箭头可能是重力矢量,而匹配颜色的较小箭头是相应的加速度矢量。所以你可以看到,没有知识和角度,你没有足够的信息来解决问题。

替代文字

您可以做的另一件事是整合陀螺仪的输出以找到重力矢量的角度。也就是说,假设您从平地开始,然后您始终根据累积的小变化跟踪您认为重力的位置。但这很容易出错,而且你的计算误差会随着时间的推移而迅速累积;它还假设您可以使用陀螺仪。

因此,唯一好的解决方案是使用外部信息。

于 2010-04-29T04:23:53.250 回答
1

一些想法:

  • 重力一个向量,而不是一个量级。
  • 由于重力引起的加速度和由于其他力引起的加速度是无法区分的(您也无法区分转弯和滚动汽车之间的区别)。
  • 使用两个加速度计可能会更好,但是您需要两部手机。

如果是我,我会写一个免责声明,上面写着“这在山上不起作用,请使用笔直平坦的道路进行测试。”

PS:我喜欢答案的现金奖励,我会确定并将其作为建议发布在 meta.stackoverflow.com 上:P

于 2010-04-28T21:39:44.210 回答
1

这并不能完全解决您的问题,但希望它可以清除您一直在尝试做的事情。我相信最终你将需要一些其他的工具来完全做到这一点。作为 tom10 建议的 GPS 对我来说听起来是最好的选择(因为没有可用的陀螺仪),但我预见到诸如滞后时间和 GPS 坐标不准确等问题(我不知道 iPhone GPS 有多准确) )。

首先,我假设 iPhone 始终牢牢地固定在汽车上。对于向上或向下且没有左右曲线的斜率,您可以执行以下操作进行校准。

校准

  1. 找到一个表面,使其恶劣程度没有明显变化。
  2. 求汽车相对于道路不移动时的加速度矢量。将此完整向量(x、y 和 z 分量)记录为v1。g = | v1 | 是重力的大小,应该始终保持不变。
  3. 开始在斜坡上直线向前行驶(向上或向下行驶,而不是向侧面行驶,当然平坦的表面也很棒)。
  4. 将此完整的加速度矢量记录为v2
  5. 通过取v2 - v1(减去重力)找到表示向前运动的矢量v3 。
  6. v4 = v3 x ( v1 x v3 ) 其中 x 是向量叉积
  7. 求v4的单位向量,v5 = v4 / |v4|

v5指向当汽车在完全平坦的表面上时重力将指向的方向。您现在至少可以判断您是否在某种斜坡上,以及该斜坡的角度是多少。这可以通过以下方式完成:

  1. 记录当前加速度矢量a
  2. 求av1的点积,c = av1
  3. 如果 c 小于 g(而不是等于 g),则汽车在斜坡上。斜率的角度是 theta = arccos(c/g)。

然而,这是我们遇到问题的地方。即使我们将自己限制在上下斜坡而不是向左或向右弯曲/倾斜,我们仍然无法确定斜坡是向下还是向上 - 只是它的角度。我们可以通过v1v3的点积来初步判断汽车是上坡还是下坡(正值表示下坡,负值表示上坡)。

但是,您可以使用总加速度矢量的幅度随着斜率增加或减少而减少或增加的事实来对此进行猜测,但不能确定。例如,如果斜率的角度 (theta) 为 0 度(或足够接近)而现在不是,并且整体加速度在v3的单位向量上的投影(点积)正在减小,那么我们可能会推断出汽车正在上坡。同样,这只是一个很可能是错误的猜测。我说可以,但我的意思是有时它会出错。

这就是我可以想象的从仅使用加速度计的系统中获取的尽可能多的信息。祝你好运!

于 2010-04-29T19:20:25.717 回答
0

@Gazzardian,

因此,据我所知,您的基本问题是检测前向向量。您可以选择这些:

  1. 您以每 0.2 秒的速度采样 5 秒,然后在接下来的 n 秒内关闭采样,这样资源就不会被占用。现在你可以从这些数据点做的是,你将能够辨别速度的变化率(有简单的数值方法可以使用数据点找到导数)。但这不会给你真正意义上的加速,因为它不会给你方向。AFAIK,加速度计也产生方向,即它与轴/重力之一的倾斜程度。

参考此图检测角度: Angles and Hills http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

另一种可能的方法是在爬山过程中寻找额外的力量。给定额外的力量,你也许能找到角度。额外力的垂直分量是反方向的垂直分量,g。

于 2010-04-29T06:23:54.637 回答