检测汽车加速度(iPhone加速度计)

时间:2010-04-28 21:24:38

标签: iphone objective-c physics accelerometer

我正在开发一款iPhone应用程序,我们正在尝试计算移动汽车的加速度。类似的应用程序已完成此操作(Dynolicious),但不同之处在于此应用程序旨在用于一般城市驾驶,而不是拖动条。

这引起了我们一个大关注,即Dynolicious幸运地能够避免:丘陵。是的,丘陵。

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

我们的初步运作很简单并且遭受了后果。在校准阶段,我在手机上取平均力,在跑步过程中,我只是从当前力中减去平均力,以获得此帧的当前加速度。这样做的问题在于,典型的汽车比前进的力量获得更多的力量 - 从转向坑洼的一切都导致价值与实际发生的事情不同步。

下一步是为了增加iPhone必须以屏幕朝向汽车后部的方式定向的条件。使用这种方法,我试图仅在z轴上使用力,但这显然会导致问题,除非iPhone由于重力而直接直立。

之后的一些三角函数,我已经成功地将重力放在了等式之外,因此iPhone的实际读取非常非常好。

直到我遇到斜坡。一旦汽车的角度发生变化,我突然接到了没有意义的加速和减速,我们又一次不同步。

在数学上与一个比我更聪明的人交谈导致我一直试图实施的解决方案比我想承认的更长。它的步骤如下:

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

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

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

奖励:在第一个答案中提供250美元的奖金,从而获得解决方案。

5 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:3)

要解决此问题,如果可能,您需要引用汽车外部的内容。可能使用 GPS 来测量高程增益是最直接的方法。也就是说,使用测量的高程增益计算坡度,并使用它来补偿加速度测量。

正如其他人所提到的,在很深的层面上,没有办法区分重力和加速度;这被称为Equivalence Principle(并且是爱因斯坦最重要的见解之一)。因此,人们需要知道的不仅仅是加速度计的输出来解决这个问题,这使问题变得困难。有关此问题的各种方法,请参阅here

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

更多关于您需要外部参考的原因:

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

alt text http://i42.tinypic.com/6gasnb.png

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

因此,唯一的好办法是使用外部信息。

答案 2 :(得分:1)

一些想法:

  • 重力 是矢量,而不是幅度。
  • 由于一些其他力量引起的重力和加速度引起的加速度是无法区分的(你也无法区分绕过拐角和滚动车辆的区别)。
  • 你可能有两个加速度计更好运,但是你需要两部手机。

如果是我,我会写一个免责声明,说“这不适用于山丘,使用直线,平坦的道路进行测试。”

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

答案 3 :(得分:1)

这并不能完全解决您的问题,但希望它可以清除您一直想要做的事情。我相信最终你需要一些其他工具才能完全做到这一点。 GPS作为tom10建议的声音对我来说是最好的选择(因为没有可用的陀螺仪),但我预见到诸如滞后时间和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是vector cross product
  7. 找到 v4 的单位向量, v5 = v4 / | v4 |
  8. 当汽车在完全平坦的表面上时,

    v5 指向重力指向的方向。你现在至少可以判断你是否处于某种坡度以及该坡度的角度。这可以通过以下方式完成:

    1. 记录当前加速度矢量 a
    2. 找到 a v1 的点积,c = a 。的 V1
    3. 如果c小于g(而不是等于g),则汽车在斜坡上。斜率的角度是θ= arccos(c / g)。
    4. 然而,这是我们遇到问题的地方。即使我们将自己局限于上下斜坡而不是向左或向右弯曲/倾斜,我们仍然无法确定斜率是向下还是向上 - 只是它的角度。我们可以通过取 v1 v3 的点积来初步确定汽车是上坡还是下坡(正值表示向下坡度,负值向上倾斜)。

      然而,您可以使用总加速度矢量的幅度是随着斜率增加还是减小而减小或增加的事实来猜测,但这不是肯定的。例如,如果斜率的角度(θ)已经为0度(或者足够接近它),现在它不是,并且整体加速度的投影(点积)到 v3的单位矢量上正在减少,然后我们可能会推断汽车正在上坡。再次,这只是一个猜测,这可能是错误的。我说可以,但我的意思是有时会出错。

      这就像我可以想象的那样,从一个只使用加速度计的系统中获取信息。祝你好运!

答案 4 :(得分:0)

@The Gazzardian,

所以我理解你的基本问题是检测前向矢量。你可以选择这些:

  1. 您每隔0.2秒采样一次,持续5秒,并在接下来的n秒内关闭采样,以免资源耗尽。现在您可以从这些数据点中做到,您将能够辨别速度的变化率(有简单的数值方法可以使用数据点找到导数)。但是这不会给你最真实的加速,因为它不会给你方向。 AFAIK,加速度计也产生方向,即它对轴/重力之一倾斜多少。
  2. 参考此图来检测角度:  Angles and Hills http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

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