导航栈
导航栈是一整套软件,它把像“去厨房”这样一句简单的指令,转化为移动机器人真正到达那里所需的、源源不断的转向和速度指令流。之所以叫“栈”,是因为它像一座由相互协作的层叠搭起来的塔,每一层负责一件事,并把结果向上或向下传给下一层,就像餐厅里一份点单从顾客传到服务员、再传到后厨、最后传到厨师那样。没有任何单独一块能包办一切;导航之所以能成立,正是因为所有这些层被接在一起,连成了一条流水线。
大致从下往上看,导航栈会读入空间的地图,以及对机器人此刻在地图上位置的持续估计(定位)。它会构建一张代价地图,标出哪里行驶安全、哪里有风险。接着,全局规划器在整张地图上勾画出一条从机器人到目标的粗略路线,而局部规划器则反复地把眼前精细的转向补充进来——精确地决定接下来一两秒内如何拐弯、减速、躲避——并对全局方案预先不知道的情况做出反应,比如有人横穿路径。最终输出是一串发送给轮子的速度指令,整个循环每秒会重复许多次,好让机器人随着世界的变化不断修正。
把导航当作一套可复用的“栈”来对待之所以强大,是因为只要把其中个别的层换进换出,同一套总体结构就能驱动差别很大的机器人——家用扫地机、仓库料车、人行道送货车。一个著名的例子是 ROS(机器人操作系统,一套被广泛共享的开源工具集)中的导航系统:各团队会按需搭配不同的规划器、为自己的机器调校代价地图,而不必从零重写整套导航。
你在医院地图上点一个位置;导航栈先给料车定位,再沿走廊规划出一条全局路线,它的局部规划器在让车绕过一辆经过的病床推车后再继续前进,整个过程无需任何人操控方向。
输入一句指令,输出一串安全的转向。
人们口中常说的具名导航栈,主要是 ROS 1 里的“move_base”和 ROS 2 里的“Nav2”;它们是开源的参考实现,而非构建导航的唯一方式。