在机器人自主移动领域,导航系统始终是核心组成部分。从室内服务机器人到工业AGV,一个稳定、灵活的导航框架往往决定了项目的成败。
Navigation2 就是这样一套专为机器人设计的开源导航框架。它继承了经典导航栈的成熟理念,同时引入了行为树任务编排 、模块化服务器架构 和生命周期管理等现代化设计,让开发者能够更轻松地构建工业级导航应用。
本文将抛开底层通信细节,从功能与设计的角度,带你全面了解 Navigation2。
一、Navigation2 的整体定位
Navigation2 的目标是:让机器人能够从 A 点安全、高效地移动到 B 点,同时处理动态障碍物、地图更新、异常恢复等复杂情况。
它主要由以下几个功能模块构成:
| 模块 | 职责 |
|---|---|
| 全局规划器 | 基于静态地图,规划从起点到目标点的宏观路径 |
| 局部规划器 | 根据全局路径和实时传感器数据,生成平滑的速度控制指令 |
| 代价地图 | 融合静态地图和动态障碍物信息,为规划提供环境表示 |
| 恢复行为 | 当机器人卡住或路径被阻塞时,执行清障、旋转等自救操作 |
| 行为树 | 协调上述模块的执行顺序和切换逻辑 |
与传统导航栈不同,Navigation2 将这些模块设计为独立的服务,并通过行为树进行灵活编排。这意味着你可以像搭积木一样自定义导航行为------例如,先做全局规划,再执行路径跟踪,如果失败则尝试旋转清障,然后重新规划。
二、全局规划器:找到宏观路径
全局规划器的任务是在已知静态地图上,寻找一条从当前机器人位置到目标位姿的无碰撞路径。
Navigation2 内置了多种全局规划算法:
-
Navfn 规划器
:经典的 Dijkstra 最短路径算法,简单可靠。
-
Smac 规划器
:基于搜索的规划器,支持不同运动学模型(如差分驱动、全向、阿克曼),生成的路径更平滑。
-
Theta 规划器
*:允许路径以任意角度通过网格顶点,路径更短更自然。
此外,Navigation2 支持自定义全局规划插件。如果你有特殊的路径约束(如禁止倒车、偏好右侧行驶),可以轻松替换默认实现。
全局规划器通常以异步服务方式运行:当行为树发出"计算路径"请求时,规划器在后台执行搜索,完成后返回路径结果。
三、局部规划器:实时控制与避障
全局路径只是"大方向",实际执行中必须考虑动态障碍物、机器人运动学限制和控制精度。这部分由局部规划器负责。
局部规划器接收:
-
全局参考路径
-
当前机器人位姿和速度
-
局部代价地图(实时更新的障碍物信息)
然后输出:线速度 + 角速度(或关节位置指令)。
Navigation2 内置了多种局部规划器:
-
DWB 控制器
:Dynamic Window Approach 的增强版,在速度空间采样并评分,选择最优指令。支持多种评分项(目标对齐、障碍物距离、速度一致性等)。
-
Regulated Pure Pursuit
:改进的纯追踪算法,通过调节前瞻距离和速度限制,在高速和避障之间取得平衡。
-
模型预测控制器
:基于优化的控制器,能够更精确地处理运动学和动力学约束。
局部规划器通常以周期性线程运行(例如 10~20 Hz),实时响应传感器变化。
四、代价地图:环境表示的核心
无论是全局规划还是局部控制,都需要一个统一的环境模型------这就是代价地图。
代价地图是一个二维网格,每个单元格存储一个"代价值",表示该位置被占用的可能性或通过的成本。通常分为两层:
-
静态层
:来自已知地图(如 SLAM 构建的 occupancy grid),表示固定障碍物(墙壁、家具等)。
-
障碍物层
:来自实时传感器(激光雷达、深度相机),动态更新,表示临时障碍物(行人、货物等)。
Navigation2 的代价地图支持多层叠加。你还可以添加自定义层,例如:
-
通货膨胀层
:在障碍物周围扩展安全缓冲区
-
车道层
:标识可行驶区域和禁止区域
代价地图会实时更新,并以服务形式提供给规划器和控制器查询。
五、行为树:灵活的任务编排
传统导航栈使用硬编码状态机:规划 → 控制 → 恢复,状态切换逻辑固定写在代码里。这种方式的缺点是:当你想改变导航策略(比如先尝试旋转清障,再重新规划,如果还失败就上报异常),需要修改 C++ 代码并重新编译。
Navigation2 引入行为树来彻底解决这个问题。
行为树是一种描述任务流程的树形结构,每个节点代表一个动作或条件。例如:

行为树以XML 文件的形式配置,无需编程即可修改导航逻辑。Navigation2 官方提供了丰富的预置节点,包括:
-
路径计算与跟踪
-
代价地图操作
-
速度与状态检查
-
各种恢复行为(旋转、后退、等待等)
你甚至可以编写自己的行为树节点,实现特定业务逻辑(如"到达目标后播放语音提示")。
六、生命周期管理:可控的启动与关闭
在复杂的机器人系统中,模块的启动顺序往往至关重要。例如,代价地图必须在地图服务器加载完地图之后才能初始化,而控制器又依赖于代价地图。
Navigation2 引入了生命周期管理机制,为每个核心模块定义了标准状态:
-
未配置
:模块已创建,但未加载参数或分配资源
-
非激活
:已配置,但不处理数据
-
激活
:正常运行
-
已销毁
:资源释放
一个全局生命周期管理器负责协调所有模块的状态转换。例如,启动导航时,管理器会依次调用:
-
地图服务器的"配置"和"激活"
-
代价地图的"配置"和"激活"
-
规划器与控制器......
这种设计确保了系统的确定性 和可恢复性------如果某个模块出错,管理器可以将其重置到未配置状态并重新初始化,而无需重启整个程序。
七、恢复行为:处理异常情况
现实世界充满不确定性:机器人可能被椅子卡住、行人突然挡住去路、或者局部代价地图出现短暂错误。Navigation2 内置了一套恢复行为机制,用于应对这些异常。
常见的恢复行为包括:
| 行为 | 说明 |
|---|---|
| 旋转清障 | 原地旋转扫描周围环境,试图找到可通行方向 |
| 后退 | 向后移动一小段距离,摆脱局部极小值 |
| 等待 | 暂停几秒,等待动态障碍物离开 |
| 清除代价地图 | 重置局部代价地图缓存,避免过时障碍物信息 |
| 重新规划 | 强制触发一次全局重新规划 |
这些恢复行为可以通过行为树灵活组合。例如,一个典型的恢复序列可能是:
-
检查是否卡住 → 如果是,旋转清障
-
如果旋转无效,后退一米
-
清除局部代价地图
-
重新规划路径
-
如果以上全部失败,上报错误并停止
八、应用场景与生态
Navigation2 已被广泛应用于各种机器人平台:
-
室内服务机器人
:餐厅送餐、酒店引导、清洁机器人
-
工业 AGV
:仓库搬运、产线物料配送
-
巡检机器人
:变电站、数据中心自动巡逻
-
户外移动平台
:割草机器人、物流配送车
由于其插件化架构,Navigation2 可以适配不同的传感器配置(激光雷达、视觉、超声波)和运动底盘(两轮差分、四轮全向、履带等)。开发者只需实现相应的传感器数据接口和运动控制接口,即可快速将 Navigation2 部署到自己的机器人上。
九、总结
Navigation2 不仅仅是一个导航算法库,更是一套工程化的机器人导航框架。它的核心设计理念可以概括为:
-
模块化
:全局规划、局部控制、代价地图、恢复行为彼此独立
-
可编排
:行为树让导航逻辑可视化、可配置
-
可恢复
:生命周期管理和恢复行为保证系统鲁棒性
-
可扩展
:所有核心模块都支持插件式替换
对于机器人开发者来说,Navigation2 提供了一条从快速原型到产品落地的清晰路径。无论你是刚入门移动机器人,还是正在构建工业级导航系统,它都值得深入学习和使用。