永远没有把握的机器人
想象一个小机器人在仓库地面上滚动。它命令轮子精确转动,刚好前进一米。可地面有些灰尘,一个轮子打滑,机器人实际上只走了 98 厘米,还向左偏了一丝。它感觉不到这一点。在它自己看来,它笃定地认为自己笔直前进了一米——而它其实已经错了一点点。
为了确认自己究竟在哪里,机器人查看它的传感器。但传感器也会“说谎”——不是故意的,而是因为每一次真实测量都带着传感器噪声,也就是叠加在真值之上的微小随机抖动。读数 2.00 米,真实距离可能是 1.96 米或 2.05 米。于是机器人被夹在两个都不可靠的证人之间:它自己的运动(会打滑)和它的传感器(会抖动)。它永远无法锁定自己所在位置那个唯一而精确的真相。
状态:道尽一切的几个数字
在谈论“不确定”之前,我们得先弄清机器人对什么不确定。那个对象就是它的状态:能完整描述机器人此刻处境的最小一组数字。对于在平地上行驶的机器人,状态也许就是三个数——它的 x 坐标、y 坐标,以及它所朝的方向。再没有别的东西需要补充,就能说清它在哪里、面朝何方。
什么算作状态,取决于机器人要做什么。一架快速飞行的无人机还在乎速度,于是它的状态扩展到包含它在各个方向上的运动快慢。一条机械臂的状态则是它每个关节的角度。其中的门道在于:挑出最少的几个数,又仍能涵盖一切要紧之事——少到便于计算,又全到不漏掉任何重要的东西。
信念:携带一片云,而非一个点
关键的一步在这里。既然机器人永远无法知道自己的真实状态,它就不会存下“我在 (3.0, 4.0)”这样一个单一答案。它存下的是一个信念:一片概率,铺展在它可能所处的所有状态之上。你可以把它想象成悬在地面上的一团柔软的云——在机器人最可能所在之处最浓,向边缘逐渐稀薄,那里它大概、但不确定地,并不在那里。
这团云有两样东西值得读取。它的中心是机器人最好的单点猜测——如果非要给出一个位置,就是它。它的宽度是机器人有多没把握:紧致狭窄的云意味着高度自信;宽阔弥散的云意味着机器人只有一个模糊的概念。机器人会明确地追踪这个宽度,通常借助状态协方差矩阵——一份紧凑的账本,记下每个方向上散布有多大,以及状态中不同部分的不确定性如何彼此关联。
为什么要费事携带一整团云?因为这个宽度是机器人能据以行动的信息。一个知道自己没把握的机器人,可以放慢速度、再看一眼,或者请求帮助。而一个丢掉自身不确定性、只信一个点的机器人,会自信满满地一头撞上墙。诚实的怀疑,比虚假的笃定更有用。
为什么不确定性永不消失
人们很容易指望:只要硬件够好,怀疑就会消失。它不会,原因有两条,深植于物理之中。第一,机器人自身的运动每一步都在累加误差:每一次轮子转动都会以微小而不可预测的量打滑,这些小误差随时间不断堆积。第二,每一次传感器读数都被噪声弄得模糊,因此任何单独一瞥都无法把真相完美厘清。
所以目标不是抹去不确定性——那不可能——而是诚实地表示它,并把它压到证据所允许的最小限度。一个说“我大概在这里,上下浮动 10 厘米”的机器人,是诚实而有用的。一个说“我精确地就在这里”的机器人,是天真的,而真实世界里的天真,结局就是碰撞。忠实地呈现这份怀疑,毫不夸张地说,就是状态估计的全部。
预告:滤波如何驯服那团云
如果运动不断把信念之云铺开,是什么又把它收回去?新的证据。每当机器人取得一次传感器读数,并把它与自己预期看到的相比对,它就学到了一点东西,那团云便围着契合新观测的那些状态收紧。这种永不停歇的节奏——猜测、查看、修正、重复——就叫滤波,它是机器人定位(在地图上弄清机器人位于何处这一任务)的引擎。
- 预测:用下达的运动指令把信念之云向前推。中心发生移动,而由于运动会增添不确定性,云会铺得更宽。
- 更新:取一次传感器读数,把云朝着与之相符的那些状态拉拢。云收紧了,机器人也变得更有把握。
- 重复:一遍又一遍地做,每秒许多次,让信念始终是一个鲜活、实时更新的最佳估计,而非陈旧的猜测。
本主线里其余的一切——著名的卡尔曼滤波器、它的非线性表亲、粒子滤波器,以及一次融合多个传感器的技巧——都不过是把那两步做好的不同配方而已。它们共享同一种心跳:用运动铺开云,用测量挤压它,循环不息。一旦你把状态估计看作照料一团信念之云,而非追逐一个唯一的真值,这门领域的其余部分便会豁然贯通。