Android 加速度计精度(惯性导航)
Posted
技术标签:
【中文标题】Android 加速度计精度(惯性导航)【英文标题】:Android accelerometer accuracy (Inertial navigation) 【发布时间】:2011-12-11 08:40:03 【问题描述】:我正在考虑为 android 手机实施惯性导航系统,但鉴于加速度计的准确性和读数的不断波动,我意识到这很难。
首先,我将手机放在平坦的表面上,并在 X 和 Y 方向(与桌子平行,因此在这些方向上没有重力作用)对 1000 个加速度计读数进行采样。然后我对这些读数进行平均,并使用这个值来校准手机(从每个后续读数中减去这个值)。
然后我再次将系统放在桌子上并在 X 和 Y 方向上采样 5000 个加速度计读数来测试系统。我希望,考虑到校准,这些加速度在每个方向上应该加起来(大约)为 0。然而,情况并非如此,超过 5000 次迭代的总加速度远不接近于 0(每个轴上平均约为 10)。
我意识到,如果没有看到我的代码,这可能很难回答,但在更一般的意义上......
这仅仅是一个例子,说明手机 (HTC Desire S) 上的加速度计读数有多不准确,还是更有可能是我在编码中犯了一些错误?
【问题讨论】:
webvr-polyfill 是一个很好的灵感来源:github.com/borismus/webvr-polyfill/tree/master/src 看看他们如何使用加速度计数据填充 VR 传感器:github.com/borismus/webvr-polyfill/blob/master/src/… 也考虑陀螺仪的问题:***.com/questions/8264518/… 【参考方案1】:您可以通过两次积分线性加速度来获得位置,但 错误非常可怕。在实践中是没有用的。
这里是an explanation why (Google Tech Talk)23:20。我强烈推荐这个视频。
导致问题的不是加速度计噪声,而是gyro white noise,请参阅第 6.2.3 节错误传播。 (顺便说一句,你也需要陀螺仪。)
至于室内定位,我发现这些很有用:
RSSI-Based Indoor Localization and Tracking Using Sigma-Point Kalman Smoothers
Pedestrian Tracking with Shoe-Mounted Inertial Sensors
Enhancing the Performance of Pedometers Using a Single Accelerometer
我不知道这些方法在实际应用程序中的表现如何,也不知道如何将它们变成一个不错的 Android 应用程序。
类似的问题是this。
更新:
显然有比上面的 Oliver J. Woodman 更新的版本,“惯性导航简介”,他的博士论文:
Pedestrian Localisation for Indoor Environments
【讨论】:
我意识到这是很久以前的事了,但我有一个后续问题。 Android JB 中的相机具有“全景”功能,可让您通过移动手机拍摄全景照片,或者旋转手机或沿一个轴线性移动。为此,它必须相对准确地跟踪手机的位置——至少比这个答案链接的视频中提到的 20cm/s 误差要好。它是如何做到的?它有什么方法可以提高惯性跟踪的质量吗?或者它是否使用智能图像处理仅使用相机来完成? @Tom 我相信后者,手机纯粹通过图像处理算法将图片连接在一起。是什么让您认为手机必须跟踪其位置才能生成全景图片?早在 90 年代,就可以用普通相机做到这一点,很明显,当时我们的相机中没有加速度计 :) 当然,这些图片是在普通 PC 上连接的。但是你不需要这个位置,图像处理算法就足够了。希望这会有所帮助。 这与旧的手动拍摄一些照片然后缝合它们-稍后的工作完全不同。它确实以某种方式实时跟踪其位置。不演示就有点难以解释。您不必手动拍照 - 手机会决定您何时移动到足以拍摄另一张照片。当您拍照时,它会在底部显示一个带有全景预览的小栏。如果您将相机指向太低(例如),它会开始发出哔哔声并显示向上箭头,告诉您需要将其重新向上移动。 实际上它似乎确实使用了图像处理 - 开始全景然后在相机前挥手会严重混淆它的位置跟踪系统! @Tom 好的。我认为它主要使用图像处理(正如您上一条评论所暗示的那样),但它很可能与跟踪 orientation (但不是位置)结合使用。【参考方案2】:我只是在大声思考,我还没有玩过 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 的实际测量值。它所知道的只是historically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.
并且它会相应地向前推进。重要的是它是完全失明的,因为只需将手机放在口袋里可能会以 4 种不同方向之一定向,如果换口袋则 8 种。还有很多方法可以握住您的手机。我们在这里讨论了很多数据。
你显然仍然会有很多漂移,但我认为这样你会有更好的运气,因为设备会知道你何时停止行走,并且位置漂移不会持续存在。它会根据历史数据知道您处于静止状态。传统的 INS 系统不具备此功能。这种漂移会以指数方式延续到所有未来的测量和化合物中。对于传统的 INS 来说,极其精确或定期检查辅助导航是绝对重要的。
每个设备和每个人都必须拥有自己的个人资料。这是大量的数据和大量的计算。每个人的行走速度不同,步数不同,手机放在不同的口袋里等等。在现实世界中实现这一点肯定需要在服务器端处理数字运算。
如果您确实将 GPS 用于初始基线,部分问题在于 GPS 往往会随着时间的推移而有自己的迁移,但它们是非永久错误。将接收器放在一个位置并记录数据。如果没有 WAAS 校正,您可以轻松获得在您周围 100 英尺的随机方向上漂移的位置修正。使用 WAAS,可能低至 6 英尺。实际上,在背包上安装亚米 RTK 系统可能会更好,至少可以降低 ANN 的算法。
使用我的方法,INS 仍然会有角度漂移。这是个问题。但是,如果你到目前为止构建了一个人工神经网络,在 n 个用户中倾注了数周的 GPS 和 INS 数据,并且实际上让它工作到了这一点,那么你显然不介意到目前为止的大数据。继续走这条路并使用更多数据来帮助解决角度漂移:人是习惯的动物。我们几乎做同样的事情,比如在人行道上行走、穿过门、上楼梯,而不是做疯狂的事情,比如穿过高速公路、穿过墙壁或走出阳台。
假设您从老大哥那里获取一个页面并开始存储有关人们去向的数据。您可以开始绘制人们预期步行的位置。可以肯定的是,如果用户开始走上楼梯,她与之前的人走上的楼梯底部相同。在 1000 次迭代和一些最小二乘调整之后,您的数据库几乎可以非常准确地知道这些楼梯的位置。现在,您可以在人开始行走时校正角度漂移和位置。当她撞上那些楼梯,或者拐下那个大厅,或者沿着人行道行进时,任何漂移都可以得到纠正。您的数据库将包含根据一个人走到那里的可能性或该用户过去曾走过那里的可能性加权的扇区。空间数据库为此使用divide and conquer
进行了优化,仅分配有意义的扇区。这有点像麻省理工学院的项目,配备激光的机器人从一张黑色图像开始,然后通过每一个转弯来描绘记忆中的迷宫,照亮所有墙壁所在的位置。
人流量大的区域将获得更高的权重,而从未有人获得过权重的区域将获得 0 权重。较高的交通区域具有较高的分辨率。您最终会得到一张任何人去过的任何地方的地图,并将其用作预测模型。
如果您可以使用这种方法确定一个人在剧院中的哪个座位,我不会感到惊讶。如果有足够多的用户去剧院,并且有足够的分辨率,您将拥有映射剧院每一排的数据,以及每排的宽度。访问某个位置的人越多,您预测该人所在位置的保真度就越高。
另外,如果您对目前对此类内容的研究感兴趣,我强烈建议您(免费)订阅 GPS World 杂志。每个月我都在玩它。
【讨论】:
“将尽可能连接到 GPS 以校准 INS。如果 GPS 不足,则 INS 可以很好地补充。”据我了解,这就是卡尔曼滤波的用途。它结合了每种方法的优点来抵消另一种方法的缺点【参考方案3】:我不确定您的偏移量有多大,因为您忘记包含单位。 (“每个轴上大约 10 个”并没有说太多。:P)也就是说,这仍然可能是由于硬件不准确造成的。
加速度计适用于确定手机相对于重力的方向,或检测手势(摇晃或碰撞手机等)
但是,尝试使用加速度计进行航位推算会使您遇到很多复合错误。否则加速度计需要非常准确,这不是一个常见的用例,所以我怀疑硬件制造商是否正在针对它进行优化。
【讨论】:
感谢您的回答。静止时,加速度计在 X 轴和 Y 轴上的读数约为 -0.8 ms^-2,因此我将其用作偏移量。通过“大约 10”位,我的意思是超过 5000 次迭代,将来自传感器的单个轴上的每个加速度相加总和不约为 0 ms^-2(如果它在偏移上下均匀波动值),而是倾向于在一个方向上记录更多加速度,经过双重积分以找到位置后,手机在一分钟内移动了大约 3m。 +1 用于航空导航术语“航位推算”。虽然航位推算更适合使用相机而不是 INS 导航。【参考方案4】:Android 加速度计是数字的,它使用相同数量的“桶”对加速度进行采样,假设有 256 个桶,加速度计能够感应 -2g 到 +2g。这意味着您的输出将根据这些“桶”进行量化,并且会在一组值附近跳跃。
要校准安卓加速度计,您需要采样超过 1000 个点并找到加速度计波动的“模式”。然后通过输出波动的多少找到数字点的数量,并将其用于过滤。
一旦你得到模式和 +/- 波动,我建议卡尔曼滤波。
【讨论】:
我正在寻找校准方法。看来你的建议是我需要的。我只需要确认。一旦我找到模式,就说它是 0.5。我没有得到“然后通过输出波动的多少找到数字点的数量并将其用于过滤。”能否请您详细说明一下。 假设您的加速度计有 256 个输出点,并且在读数之间波动 0.015m/s^2。当您将设备放在桌子上时,您的输出可能会以 0.015m/s^2 的倍数波动。假设您的读数为 0 +/- (X * 0.015)。您需要找到 X(这将是一个偶数)。例如,我的 X 可能是 3。在这种情况下,我会忽略加速度计读数中小于 0.045 m/s^2 的变化 所以安卓手机的加速度计还不是很好..正确吗?【参考方案5】:我意识到这已经很老了,但是给出的任何答案都没有解决手头的问题。
您看到的是设备的线性加速度,包括重力效应。如果您将手机放在平坦的表面上,传感器将报告重力加速度,大约为9.80665 m/s2
,因此您看到的是 10。传感器不准确,但它们并没有那么不准确!请参阅here,了解一些有用的链接和有关您可能使用的传感器的信息。
【讨论】:
否 - 我认为您误读了这个问题:“...... X 和 Y 方向的读数(与桌子平行,因此在这些方向上没有重力作用)”。 9.8 /s2 将在 Z 轴上。【参考方案6】:您假设 X 和 Y 方向上的加速度计读数(在这种情况下完全是硬件噪声)将围绕您的平均值形成正态分布。显然不是这样的。
您可以尝试的一件事是在图表上绘制这些值并查看是否出现任何模式。如果不是,则噪声在统计上是随机的,并且无法针对 - 至少对于您的特定手机硬件进行校准。
【讨论】:
以上是关于Android 加速度计精度(惯性导航)的主要内容,如果未能解决你的问题,请参考以下文章