安卓加速度计精度(惯性导航)

118

我正在研究为Android手机实现惯性导航系统,但考虑到加速度计的精度和读数的不断波动,这可能很困难。

首先,我将手机放在平面上,并采样了1000个X方向和Y方向(与桌子平行,因此这些方向上没有重力作用)的加速度读数。然后,我计算了这些读数的平均值,用该值来校准手机(从每个后续读数中减去该值)。

然后,我再次将其放置在桌子上,并在X和Y方向上采样了5000个加速度读数。基于之前的校准,我预期这些加速度应该在每个方向上大致相加得到0。但是,实际情况并非如此,在5000次迭代中,总加速度远非0(每个轴上平均约为10)。

我意识到如果没有看到我的代码,回答这个问题可能很困难,但更一般地说...

这只是说明移动电话(HTC Desire S)上加速度计读数的不准确性,还是更可能是我的编码出现了错误?


3
webvr-polyfill是一个很好的灵感来源:https://github.com/borismus/webvr-polyfill/tree/master/src。看看他们如何使用加速度计数据来填充VR传感器:https://github.com/borismus/webvr-polyfill/blob/master/src/fusion-position-sensor-vr-device.js - S.C.
考虑陀螺仪的问题:https://dev59.com/q2sy5IYBdhLWcg3w3hyI - Ciro Santilli OurBigBook.com
6个回答

139

将线性加速度积分两次可以得到位置,但误差很大,在实践中无用。

以下是Google Tech Talk23:20的解释。我强烈推荐这个视频。

问题不是由于加速度计噪声引起的,而是由于陀螺仪白噪声,参见第6.2.3小节“误差传播”。(顺便说一句,你也需要陀螺仪。)

至于室内定位,我发现以下内容很有用:

基于RSSI的室内定位和跟踪使用Sigma-Point Kalman Smoothers

鞋载惯性传感器的行人跟踪

使用单个加速度计提高计步器性能

我不知道这些方法在实际应用中的表现如何,也不知道如何将它们转化为一个好的Android应用程序。
一个类似的问题是这个
更新:
显然,比上面的Oliver J. Woodman的博士论文"惯性导航简介"更新的版本是: 室内环境下的行人定位

2
我知道这是很久以前的事情了,但我有一个后续问题。Android JB中的相机具有“全景”功能,可以通过移动手机(旋转或沿一个轴线线性移动)拍摄全景照片。为此,它必须相对准确地跟踪手机的位置-至少比此答案链接中提到的20cm / s误差更好。它是如何做到的?它是否有一些方法来改善惯性跟踪的质量?还是仅使用相机进行聪明的图像处理来完成? - Tom
1
@Tom 我相信后者,手机纯粹通过图像处理算法将图片拼接在一起。你为什么认为手机必须跟踪其位置才能制作全景照片呢?在90年代,普通相机就可以做到这一点,当然,那时候相机里没有加速度计 :) 当然,这些照片是在普通电脑上拼接的。但是,你不需要位置信息,图像处理算法就足够了。希望这可以帮到你。 - Ali
1
这与旧的手动拍照然后后期拼接工作非常不同。它以某种方式实时跟踪其位置。没有演示很难解释清楚。你不必手动拍照 - 手机会决定何时移动足够远以拍摄另一张照片。在拍照时,它会在底部显示一个带有全景预览的小条形图。如果你把相机指向下面(例如),它就开始哔哔响并显示一个向上箭头,告诉你需要把它移回来。 - Tom
4
实际上,它似乎确实使用了图像处理技术 - 开始拍摄全景照片,然后在相机前挥手会严重干扰其位置跟踪系统! - Tom
@Tom 好的。我认为它主要使用图像处理(正如你最后的评论所暗示的那样),但很可能与跟踪方向(而不是位置)相结合。 - Ali
显示剩余2条评论

20

我只是在胡思乱想,并且我还没有使用过Android加速度计API, 请耐心等待。

首先,传统上,要从加速计获取导航需要一个6轴加速计。你需要X、Y和Z方向上的加速度,还需要Xr、Yr和Zr方向的旋转数据。如果没有旋转数据,除非你假设设备永远不会改变姿态,否则你没有足够的数据来建立一个矢量,这将非常有限。反正也没有人读TOS(服务协议)。

哦,你知道INS会随着地球的旋转而漂移吗?所以还有这个问题。一个小时后,你神秘地爬上了一个15°的斜坡,进入太空。这是假设你有一个能维持位置那么长时间的INS,而电话目前做不到。

更好的利用加速计-即使只有3轴加速计-进行导航的方法是尽可能地与GPS结合,以校准INS。当GPS无法满足要求时,INS能够很好地配合。 GPS可能会突然把你甩到3个街区外,因为你离树太近了。INS并不完美,但至少它知道你没有被陨石击中。

你可以记录手机的加速度计数据,而且要记录很多,比如几周的数据。将其与优质(我是说真的好的)GPS数据进行比较,并使用数据挖掘来建立加速度计数据和已知GPS数据之间趋势的相关性。(专业提示:您需要检查GPS卫星时刻表以获取具有良好几何形状和许多卫星的日期。有些日子您可能只有4个卫星,这是不够的)你可能能找到一个人在口袋里拿着手机走路时,加速度计数据会记录一个非常特定的模式。根据数据挖掘,您可以为该设备与该用户建立一个配置文件,并确定该模式表示的速度类型,当它有GPS数据可供参考时。您应该能够检测到转弯、上楼梯、坐下(校准为0速度时间!)和其他各种任务。如何握住手机需要完全视为单独的数据输入。我觉得可以使用神经网络来进行数据挖掘。某种程度上,这是一种对输入含义盲目的算法。该算法只会寻找模式中的趋势,而不会真正关注INS的实际测量值。所有它知道的是“历史上当出现这种模式时,设备以2.72 m/s X,0.17m/s Y,0.01m/s Z的速度移动,所以现在设备必须正在这样做。”然后它会相应地推进。这种完全盲目非常重要,因为仅仅将手机放在口袋里可能会朝4个不同的方向定位,如果你换背包就有8种方式。而且还有很多持手机的方法。这里涉及到很多数据。 显然,您仍将具有很多漂移,但我认为通过这种方式,您会更有成功率,因为设备知道您何时停止行走,并且位置漂移不会一直存在。它知道你静止不动是基于历史数据。传统INS系统没有这样的功能。漂移会影响所有未来测量值并呈指数级增长。对于传统的INS系统,非常准确或者定期检查的第二导航系统是绝对必要的。每个设备和每个人都必须有自己的配置文件。这是大量数据和计算。每个人走路的速度不同,步伐也不同,将手机放在不同的口袋里等等。要在现实世界中实现这一点,需要处理服务器端的大量数字计算。
如果您使用GPS进行基准测试,其中部分问题是GPS往往会随着时间的推移而具有自身迁移,但它们是非永久性的错误。在一个位置放置接收器并记录数据。如果没有WAAS校正,您可以轻松地得到围绕您100英尺范围内以随机方向漂移的位置修复。通过WAAS,可能降至6英尺。使用背包上的亚米级RTK系统可能更容易让ANN算法下降。
使用我的方法仍然会有INS角度漂移的问题。这是一个问题。但是,如果您已经如此远地构建了一个ANN来逐周研究n个用户的GPS和INS数据,并且实际上使其工作到了这个水平,那么显然您不介意到目前为止使用更多的数据来帮助解决角度漂移问题:人类是有习惯的生物。我们几乎都做同样的事情,例如在人行道上行走,穿过门,上楼梯,而不会做疯狂的事情,例如穿越高速公路,穿过墙壁或从阳台上跳下来。假设您像Big Brother一样开始储存人们的行动数据,我们可以开始绘制人们行走的地图。如果用户开始走上楼梯,那么她就站在前一个人爬过的楼梯底部,这是很确定的。经过1000次迭代和一些最小二乘调整后,您的数据库可以准确地知道这些楼梯的位置。现在,当人们开始行走时,您可以纠正角度漂移和位置。当她走到楼梯、拐弯或沿着人行道行走时,任何漂移都可以被纠正。您的数据库将包含按照人们行走可能性加权的区域,或者该用户曾经在那里行走过的区域。空间数据库使用“分而治之”的方法进行优化,只分配有意义的区域。这有点像那些麻省理工学院项目,其中装备激光器的机器人从黑色图像开始,通过每个转弯来在内存中绘制迷宫。
高交通量区域将获得更高的权重,而没有人去过的区域则具有0权重。高交通量区域具有更高的分辨率。最终您将获得一个地图,标注出每个人到访的地方,并将其用作预测模型。
使用这种方法,我不会感到惊讶,您可以确定一个人在电影院的哪个座位上。如果有足够多的用户去电影院,并具备足够的分辨率,您将获得每排座位的数据映射,以及每排座位的宽度。访问地点的人越多,您就越能准确地预测该人所处的位置。
此外,如果您对目前的研究感兴趣,我强烈建议您获取(免费)的GPS World杂志订阅服务。我每个月都会沉迷其中。

最好的方法是尽可能地与GPS连接以校准INS。当GPS不足时,INS可以很好地补充。这就是卡尔曼滤波的作用,它将每种方法的优点结合起来,以消除另一种方法的缺点。 - endolith

9
我不确定你的偏移量有多好,因为你忘记包括单位。(“每个轴大约10”并没有太多信息:P)话虽如此,仍然很可能是由于硬件不精确造成的。
加速度计对于确定电话相对于重力的方向或检测手势(摇动或撞击电话等)等方面非常适用。
然而,试图使用加速度计进行死算会导致大量复合误差。除非加速度计非常精确,否则这不是一个常见的用例,因此我怀疑硬件制造商是否正在优化它。

感谢您的回答。当静止时,加速度计在X和Y轴上读取约为-0.8 ms^-2,因此我将其用作我的偏移量。关于“大约10”的部分,我的意思是在5000次迭代中,将传感器单个轴上的每个加速度相加时,总和并不接近0 ms^-2(如果它均匀地在偏移值上下波动,则会接近),而是倾向于在一个方向上更多地注册加速度,经过双重积分以找到位置后,手机每分钟移动约3米。 - woodstock365
+1 用航空导航术语“死算”更为恰当。虽然死算更适用于使用相机进行导航而非惯性导航系统。 - RyanJMcGowan

8

Android加速度计是数字化的,它使用相同数量的“桶”来采样加速度,假设有256个桶,并且加速度计能够感测-2g到+2g。这意味着你的输出将以这些“桶”量化,并且会在一些值集合中跳动。

为了校准Android加速度计,需要采样超过1000个数据点并找到加速度计波动的“模式”。然后计算输出波动的数字点数,并将其用于滤波。

我建议在获得模式和+/-波动后使用卡尔曼滤波。


1
我正在寻找校准方法,看起来你的建议正是我需要的。我只需要确认一下。一旦我找到了模式,比如说是0.5。我没有理解“然后通过输出波动情况找到数字点数,并将其用于您的滤波器。”,你能否请详细解释一下。 - Nazerke
1
假设你的加速度计有256个输出点,并且在读数之间波动为0.015m/s^2。当你把设备放在桌子上时,你的输出可能会以0.015m/s^2的偶数倍波动。假设你得到了一个读数为0 +/- (X * 0.015)。你需要找到X(它将是一个偶数)。例如,我的X可能是3。在这种情况下,我将忽略小于0.045 m/s^2的加速度计读数变化。 - Alex Stone
那么安卓手机的加速度计还不够好,对吗? - Techsin

7

我知道这篇文章比较老,但是其中的问题在所有回答中都没有得到解决。

你所看到的是设备的线性加速度,包括重力效应。如果你把手机放在一个平坦的表面上,传感器将会报告由重力引起的加速度,大约为9.80665 m/s2,因此显示的值是10。虽然传感器的精度有一定误差,但它们并不那么不准确!请参考此处获取一些有用的链接和关于传感器的信息。


19
不,我认为你误读了问题:“……X方向和Y方向的读数(平行于桌面,因此在这些方向上没有重力作用)”。9.8米/秒²是指Z轴上的重力加速度。 - teapot7

1
你做出了一个假设,即X和Y方向的加速度计读数(在这种情况下完全是硬件噪声)会围绕平均值形成正态分布。显然事实并非如此。
你可以尝试将这些值绘制在图表上,看是否出现任何模式。如果没有,那么噪声是统计随机的,无法校准 - 至少对于你特定的手机硬件而言。

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