JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

现实世界中的传感器融合与对抗漂移

机器人如何把轮速、IMU 与摄像头融合为单一估计,航位推算为何会漂移,以及哪些噪声调参错误会毁掉一个滤波器。

许多有缺陷的传感器,一个好答案

机器人上没有任何单一传感器能讲出全部真相。轮式编码器在每一瞬间都很精确,但在湿滑地面上会打滑。IMU 能在毫秒内对运动做出反应,却会慢慢漂移。摄像头能看到丰富的细节,但在昏暗的走廊里会失明。传感器融合的思路,就是把许多有缺陷的传感器组合起来,让每个传感器的长处弥补另一个的短处,从而得出一个比任何单一传感器都更好的估计。

贯穿整篇指南的例子,是一台融合三种来源的轮式机器人:轮式里程计(计算车轮转数)、IMU(测量加速度与旋转)以及视觉(追踪摄像头图像中的地标)。编码器和 IMU 更新很快但会漂移;摄像头更新较慢,却能把机器人重新拴回世界中可识别的特征上。一个好的估计器会每秒多次把它们编织在一起。

把这一切粘合起来的数学,是一个不断维护机器人位置信念的滤波器。每一次传感器读数都会推动这个信念,而关键在于,滤波器会按照对每个读数的信任程度来加权。一个可信的传感器会强力拉动估计;一个嘈杂的传感器则几乎推不动它。融合不是求平均,而是加权信任。

航位推算为何会无止境地漂移

航位推算的意思,是从你上一个已知位置出发,把一连串细小的运动累加起来,从而估计新位置——车轮转数、航向变化、对加速度的积分。它极其自给自足:不需要 GPS,不需要地图,只用内部测量。轮式里程计就是经典例子。问题在于,每一步都带着一点点误差,而航位推算会把这些误差永远地一层层叠加上去。

由于误差不断累积、永远得不到纠正,估计便会无界漂移:机器人开得越久,它猜测的位置就离现实越远。一个打滑半个百分点的车轮、一个带着微弱偏置的陀螺仪、一个略微偏大的车轮半径——这些单独看都不吓人,但在数千步上累积起来,就会把机器人推离航线好几米。这是任何纯相对传感器的根本弱点。

解药是一个绝对参考——一种系于固定外部世界、而非系于机器人自身过去的测量。GNSS/GPS 给出全局位置。一个被识别出的地标,或一处机器人此前见过的地方,会把它钉在地图上。每一次绝对定位都会重置累积误差,所以一旦这样的测量到来,漂移就停止增长。这正是我们要把快却会漂移的里程计,与慢却接地的视觉融合起来的原因。

陷阱门诊:滤波器是怎么出错的

一个卡尔曼滤波器的好坏,完全取决于你喂给它的噪声数值,而调好这些数值,正是大多数真实系统翻车的地方。最常见的错误,是把两种噪声搞混。过程噪声描述的是你对自己运动模型的不信任程度——机器人可能在多大程度上偏离你的预测所期望的样子。测量噪声描述的,则是你对每个传感器读数的不信任程度。它们处在数学中不同的位置,必须各自独立地设定。

把这个平衡搞错,滤波器会以相反的方式失常。把过程噪声设得太低,滤波器会变得固执——它太相信自己的预测,以至于无视传感器,在突然转弯时落在后面。把测量噪声设得太低,滤波器会变得抖动——它追逐每一个嘈杂读数而颤抖。这两个旋钮彼此权衡:真正重要的是它们的比值,是这个比值决定了卡尔曼增益如何在预测与测量之间分配信任。

第二个经典陷阱,是过度信任一个有偏置的传感器。如果一个陀螺仪带着稳定的偏置,你却把它标为低噪声,滤波器就会乐呵呵地相信一个始终出错的传感器,把整个估计往偏置的方向拉。滤波器假定噪声是随机的、以零为中心的;一个恒定的偏移违背了这个假定,悄悄地毒化了答案。偏置必须被标定掉,或被建模为状态的一部分——绝不能仅仅靠「信任」把它抹平。

第三个、也是最阴险的失败,是过度自信的协方差。协方差矩阵是滤波器对「自己有多不确定」的自我汇报。如果它收缩得太厉害——因为过程噪声设得太小,或者因为一个没建好的非线性骗过了数学——滤波器就会宣布自己几乎确定,从此彻底不再听传感器的话。好的读数被当作离群点拒之门外,估计锁死在一个错误的值上,于是滤波器一边发散,一边大声坚称自己是对的。

估计技术的下一步走向

实用估计技术的前沿,是传感器之间更紧的耦合。视觉惯性里程计在很深的层次上融合摄像头与 IMU:IMU 填补摄像头各帧之间的快速运动,摄像头则纠正 IMU 的漂移,于是这一对组合远比任一单独使用都更稳健。在紧耦合中,两个传感器的原始测量进入同一个共享的优化,而不是各自先产生一个独立的猜测、事后再合并。

下一次飞跃,是把估计折叠进 SLAM——机器人一边构建地图,一边在地图中定位自己。认出一处以前到过的地方,会把累积的漂移一下子拉回正轨——这是一种强有力的绝对纠正,它来自机器人自己的记忆,而非 GPS 这类外部基础设施。估计与建图不再是两个分开的问题,而成了同一个问题的两半。

无论架构如何,底下的纪律始终不变。一个健康的滤波器,会尊重每个传感器能测与不能测的东西,对自己的不确定度保持诚实的记账,并且绝不让「图省事」压过这份诚实。每当你搭建或调试一个滤波器时,手边都备一张简短的检查清单。

  1. 把噪声分开:独立地设定过程噪声(对运动模型的信任)与测量噪声(对每个传感器的信任),并检查它们的比值。
  2. 融合之前先标定掉偏置:一个始终出错的传感器必须被纠正或建模,绝不能只是去信任它。
  3. 警惕过度自信:如果协方差收缩得比现实所能支撑的更快,滤波器就会拒绝好数据——盯住新息。
  4. 加入一个绝对参考:给快速的相对传感器配上至少一个能重置累积漂移的来源(GPS、地标、已知地点)。