在汽车中检测加速度(iPhone 加速度计)。

12

我正在开发一款iPhone应用程序,试图计算移动汽车的加速度。类似的应用程序已经完成了这个任务(如Dynolicious),但是不同之处在于这个应用程序旨在在普通城市驾驶中使用,而不是在直线赛道上使用。

这带来了一个大问题,Dynolicious幸运地避免了这个问题:山坡。是的,山坡。

包括校准和实际驾驶在内有两个重要阶段。

我们的初始测试很简单,但受到了后果的影响。在校准阶段,我测量了手机上的平均力,而在运行过程中,我仅仅减去了当前力与平均力的差值以获取当前帧的加速度。问题在于,典型的汽车受到的力远不止正向的力 - 从转弯到路面坑洞都会导致数值与实际情况不同步。

下一个尝试是添加一个条件,即iPhone必须定位在靠近车辆后部的方向上。使用这种方法,我试图跟踪z轴上的力,但是除非iPhone直立放置,否则显然会出现问题,因为存在重力。

通过一些三角学的计算,我设法从方程中排除重力,使得汽车实际上被iPhone非常准确地读取。

直到我碰到了一个坡度。一旦汽车的角度改变,突然间我收到的加速度和减速度就变得毫无意义了,我们又再次失去了同步。

与一位数学能力比我高的人交谈后,我找到了一个解决方案,而我一直在试图实现它已经超过了我想承认的时间。以下是它的步骤:

1)在校准阶段,将重力测量为矢量而不是大小。存储该矢量。 2)当汽车最初向前移动时,获取运动矢量并减去重力。使用这个作为前进动力。(暂时忽略用户情况的复杂性,让我们专注于数学问题 :)) 3)从前向量和重力向量构建平面。 4)每当接收到一个力时,将其投影到平面上以消除侧向力等。

5) 接着,利用已知的万有引力大小、前进方向运动的已知方向,基本上解决一个三角形,得到前进向量。

在这个新系统中最困难的问题不是步骤5,因为我已经让所有数字看起来都应该正确了。实际上困难的部分是检测前进向量。我选择那些大小超过重力的向量,然后对它们进行平均并减去重力。(我正在进行一些错误检查,以确保我不是仅仅因为iPhone加速度计偏差了一点就使用了某个力量,这种情况比我想象的更频繁)。但是,如果我绘制这些向量,它们实际上会有20-30度的角度偏差,这可能会导致一些严重的不准确性。最终结果是,这个应用程序现在比以前更加不准确。

因此,基本上 - 所有数学和iPhone专家们 - 有什么明显的错误吗?有任何可能更好的解决方案吗?任何有用的经验可以提供帮助吗?

奖励:提供250美元赏金给第一个能提供解决方案的回答者。


1
似乎这也是一个适合 http://mathoverflow.net/ 的工作。 - John K
3
这篇内容不适合在Mathoverflow上发布。那些在Stackoverflow上的人需要停止推荐Mathoverflow。Mathoverflow并不像Stackoverflow一样是为各种数学问题提供帮助的网站,它有完全不同的用途。它是用于研究数学的。 - sigfpe
5个回答

11
你需要一个陀螺仪。否则,在山坡上加速的汽车有多种配置,可以产生完全相同的加速度计读数。它们将是完全不可能区分的。这就是惯性导航系统结合陀螺仪和加速度计的原因。
你不能这样做的原因是由爱因斯坦给出的!使用局部测量,你无法区分重力和加速度。你确实具有一些有用的非局部信息——假设这里的重力和那里的重力具有相同的值。但是如果没有进行所谓的“平行传送”手段,你无法比较两个不同位置的重力。这就是陀螺仪的作用。
别管那250美元了,但我认为你应该给我一杯啤酒来感谢我节省您的研发时间。 :-)

你没有陀螺仪,但是在3GS上有一个指南针。更准确地说是一个三维磁力计。您可以检测手机在三维空间中的旋转,并知道加速度向量的相对方向。这可以替代陀螺仪,不是吗?您可以校准磁力计以具有水平参考,就像陀螺仪一样。请参考Teslameter:http://developer.apple.com/iphone/library/samplecode/Teslameter/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008931-Intro-DontLinkElementID_2 - progrmr
原则上,指南针应该工作良好。我猜测,如果你假定准确度高的话,它可以在山上使用,但如果你还允许倾斜曲线的话,则不行。但是我的指南针经验是,它只能产生随机数。 :-) 可能我很不走运,买到了一只坏的。 - sigfpe
当牛顿引力定律足够时,没有必要调用广义相对论。等效原理比爱因斯坦更古老。 - kennytm
爱因斯坦曾说过:“我们假设引力场和相应的参考系加速度在物理上完全等效。”为什么我不能提到这一点呢?这是我需要的明确陈述。牛顿从未在任何地方说过这一点。它可以从牛顿的有限形式中推导出来。但是爱因斯坦说了这句话。而且我没有提到广义相对论,是你提到了它。 - sigfpe
1
哇塞,你们真聪明。 - willcodejavaforfood

3
为了解决这个问题,如果可能的话,您需要引用一些与汽车外部有关的东西。 可能使用GPS来测量高度增益是最直接的方法。 也就是说,使用测得的高度增益计算山坡的斜率,并使用它来补偿加速度测量。
正如其他人提到的,在非常深层次上,无法区分重力和加速度;这被称为等效原理(是爱因斯坦最重要的见解之一)。 因此,解决这个问题需要更多信息而不仅仅是加速度计的输出,这使得问题变得困难。 关于解决该问题的各种方法,请参见此处
你最好的希望是参考车外的一些外部东西,例如GPS信号或图片来测量位置的变化,或者地球的磁场等。由于这将发生在许多金属(汽车)附近,地球的场可能很难测量,并且某些参考物体(如太阳)的连续照片显然很困难,因此GPS似乎是您最好的选择。
关于为什么需要外部参考:
值得考虑的是,您是否可以利用重力的独特特性:1)它始终“开启”,2)它始终具有相同的大小(对于此情况)。但是,当您只知道总加速度时,无法可靠地分离两个贡献。如下图所示,仅知道重力的大小是不够的...下面的图片是在手机的参考框架中绘制的,其中它测量出结果加速度(黑色向量),而较大的彩色箭头是可能的重力向量,而匹配颜色的较小箭头是相应的加速度向量。因此,可以看出,如果不知道角度,则没有足够的信息来解决问题。

alt text

另一件您可能能做的事情是将陀螺仪的输出整合起来,以找到重力矢量的角度。也就是说,假设您从平坦地面开始,并且始终跟踪基于累积小变化的重力方向。但这种方法容易出错,计算误差会随着时间的推移迅速累积;并且它还假定您可以访问陀螺仪。

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


汤姆,重力就是加速度...不需要引入等效原理或其他... - Soham
@Soham - 由于等效原理,重力是加速度因为。如果不是这种情况,那么可以使用两个具有不同弹簧质量的加速计来区分它们,可能所有加速计都是这样构建的,那么OP的问题就不会被问到了。只有惯性质量和重力质量相同,才能如此自信地说“是”。(在等效原理之前,人们认为重力是导致加速度的力,而不是它本身)。 - tom10
惯性质量和重力质量是否会有所不同?我只是觉得,在这种情况下引用EP等价于杀鸡焉用牛刀。 - Soham
原问题的要点是寻求一种分离重力和运动加速度的方法,因此显然需要指出,基本上没有单个本地测量可以做到这一点。 EP是一个简单明了的陈述,也是定义这个问题和限制可能解决方案的主要问题。 - tom10

1
一些想法:
  • 重力是一个向量量,而不是一个大小。
  • 由于重力加速度和由于其他力的加速度是无法区分的(你也无法区分绕过拐角和滚动汽车之间的区别)。
  • 你可能会用两个加速计更好,但那样你就需要两部手机。

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

P.S.:我喜欢回答的现金奖励,我会在meta.stackoverflow.com上发布这个建议:P


1

这并不能完全解决您的问题,但希望它能澄清您一直在尝试做什么。我相信最终您需要其他工具才能完全实现这一点。像tom10建议的 GPS 对我来说似乎是最好的选择(因为没有陀螺仪可用),但我预见到可能会出现一些问题,例如 GPS 坐标的延迟时间和不准确性(我不知道 iPhone 的 GPS 有多准确)。

首先,我假设 iPhone 在整个过程中牢固地固定在汽车上。对于没有左右曲线的上坡或下坡,您可以进行以下校准操作:

校准

  1. 找到一个表面,使其不显著改变倾斜程度。
  2. 当汽车相对于道路静止时,找到加速度向量。将完整向量(x、y和z分量)记录为v1。g = |v1|是重力大小,在整个过程中应该保持不变。
  3. 开始在坡度上直线行驶(向上或向下行驶,不能横向行驶,当然,平坦的表面也很好)。
  4. 将这个完整的加速度向量记录为v2
  5. 通过减去重力得到向前运动的向量v3,即v2- v1
  6. 使用向量叉乘积,计算v4 = v3 x (v1 x v3)。
  7. 计算v4的单位向量v5 = v4 / |v4|。

v5 指向汽车在完全平坦表面上时重力指向的方向。现在,您至少可以知道是否处于某种坡度以及该坡度的角度。可以通过以下方式完成:

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

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

然而,您可能能够利用总加速度矢量的大小是在减小还是增加随着坡度的增加或减少来猜测,但这不是确定的。例如,如果坡度的角度(θ)为0度(或足够接近),现在不是,且整体加速度在v3单位向量上的投影(点积)正在减小,则我们可能推断汽车正在爬坡。同样,这只是一个猜测,很可能是错误的。我说可能是因为我的意思是有时会错。

这大概是我能想象从仅使用加速计的系统中获得的信息了。祝你好运!


0

@The Gazzardian,

据我理解,您的主要问题是检测前向矢量。您可以选择以下方法:

  1. 每隔0.2秒采样一次速度,持续5秒,并在接下来的n秒内关闭采样,以避免资源占用。现在,您可以从这些数据点中得出速度变化率(使用简单的数值方法找到导数)。但是,这不会真正给您加速度,因为它不会给您方向。据我所知,加速度计也会提供方向,即它倾斜到其中一个轴/重力的程度。

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

另一种可能的方法是在爬坡过程中找到额外的力量。有了额外的力量,你也许能够找到角度。额外力量的垂直分量是为了抵消相反方向的重力垂直分量。

延伸Tom的想法,关于拍摄照片/ GPS 等等的问题,我不确定iPhone是否具有GPS功能(我甚至没有一个iPhone),但我确信能够通过拍摄前方道路的照片,并利用图像处理技术来判断深度或高度感。也许这个想法太过牵强?我不知道。 - Soham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接