三拍,一只杯子
让一个机器人去拿杯子,在那一个流畅动作的底下,是一个有三拍的循环:感知、规划、行动。这个节奏太根本了,根本到有了专门的名字——感知—规划—行动范式——它几乎是每一台能自主移动的机器内部的骨架。
第一拍,感知:相机和其他传感器读取这个世界。杯子究竟在哪里?机器人把原始像素和距离读数变成数字——比如「杯子在前方 32 厘米、左侧 5 厘米处」。没有这一步,机器人就是在黑暗中乱抓。
第二拍,规划:知道了杯子在哪、手现在在哪,机器人就算出一条路径——一连串关节动作,把夹爪送到杯子那里,途中又不撞翻盐瓶。(从一个目标位置反推出能够到达它的关节角度,本身就是一个很深的问题,叫做逆运动学。)
第三拍,行动:电机驱动手臂沿着那条路径运动。手张开、移动、合拢。然后——这是新手会漏掉的部分——循环重新开始。再次感知。杯子现在已经在夹爪里,或者滑掉了,或者被人挪走了。机器人不会闭着眼把动作做完;它会核对现实,然后再转一圈。
为什么它必须是循环,而不是一份食谱
食谱只跑一遍,从头到尾。当没有任何意外时,这样可行。但真实世界一直在给你意外:杯子比相机说的偏了一厘米,桌子晃了一下,夹爪打滑了。如果机器人只是执行一遍计划、再也不看一眼,第一个小误差就会累积成一只被撞翻的杯子。
于是循环闭合在自己身上。每一次新的感知读数都告诉机器人,它离原本想到达的位置偏了多远,而下一次规划就为这个差距做修正。这个想法——把你想要的和你得到的作比较,再去操控以缩小差异——正是反馈控制的核心,而感知—规划—行动循环就是穿上机器人身体的反馈控制。
把中间那一拍拆开
三拍是干净利落的说法,但「规划」那一拍藏了大量工作,所以现代机器人把循环拆成有名字的层。常见的版本是感知—规划—控制架构:感知把传感器数据变成一个世界模型,规划决定接下来一秒或一分钟要做什么,控制把那个决定变成精确而快速的电机指令。
为什么要拆?因为这三层天然以不同的速度运行。穿过一个房间的计划,每秒重算几次就够了;但让每个电机保持在目标上的底层控制,可能需要每秒更新上千次。把它们分开,就能让每一层按自己需要的节奏跑,而不被其他层拖慢。
你甚至可以把循环嵌套起来。一个快速的内层循环让手臂保持稳定;一个较慢的外层循环决定手臂下一步该去哪。有些系统把整件事包进一个行为树里,由它来挑选此刻哪个目标在生效——是去抓杯子,还是先把挡路的障碍物挪开。三拍依然在那里,只是被分了层。
想得更久,还是动得更快
这是每个机器人设计者都要面对的张力。在规划那一拍上花更多时间,你会得到更聪明、更流畅的动作——但你思考的时候,世界还在动,你的感知读数会过时。少规划,你就能更快行动、保持灵敏,但计划更粗糙,可能需要更多修正。
一只下棋的手臂有时间慢慢想;一架躲避树枝的无人机却没有。于是设计者会调节每一拍能占用多久。一个优雅的答案是模型预测控制:只向未来规划一小段,只执行其中第一步,然后把剩下的丢掉,用新鲜的感知数据重新规划。你既得到了规划的远见,又得到了频繁行动带来的新鲜度。
贯穿每个机器人的循环
一旦你看见了这个循环,你就会到处看见它。扫地机器人用碰撞传感器感知到一面墙,规划出一个转弯,通过转向来行动,然后再次感知——每分钟几百次。火星车跑的是同一个循环,只是更慢、更小心,因为一旦出错,离能帮上忙的人有几百万公里远。同样的三拍,截然不同的赌注。
这个循环还能解释一种著名的挫败。一个在仿真中调得完美的机器人,到了真实世界往往会绊倒,因为它感知到的画面和它实际做出的动作,都和干净的仿真有着微妙的差别。这种不匹配就是现实差距,而一个更紧、更快的感知—规划—行动循环,正是熬过它的主要工具之一。