1. Nav2初识:什么是Nav2?架构与核心组件概览
如果你刚接触机器人导航,可能会被一堆名词吓到:全局规划、代价地图、行为树、生命周期……
别急,我刚开始也一样。记得我第一次用ROS1的navigation stack时,光配置一个yaml就折腾了两天。
后来ROS2来了,Nav2彻底重写了导航框架。说实话,第一次看到Nav2的架构图,我也有点懵。
但等你真正理解它的设计思路,你会觉得——嗯,就该这么干。
1.1 到底什么是Nav2?
Nav2,全称Navigation2,是ROS2生态下的导航框架。
说白了,它是一套让机器人从A点走到B点的“大脑+小脑”组合。
它负责:接收目标位置、规划路径、避开障碍、控制速度、处理异常……
你可以把它理解成一个“导航操作系统”——但不是直接写死的,而是高度模块化。
我遇到过不少团队,把Nav2当成黑盒子。出问题了就调参数,调不好就骂街。
其实你只要搞懂它的几个核心组件,很多问题一眼就能看穿。
1.2 Nav2的架构与核心组件
来看一张我画的简化架构图。别被方块吓到,每个方块都是一个独立ROS2节点。
从上图你能看到,Nav2不是一个大单体,而是多个模块各司其职:
- 行为树(BT) —— 导航的“总指挥”。它决定先规划还是先恢复,失败了重试还是放弃。
- 全局规划器 —— 负责生成从起点到终点的宏观路径。我常用Smac Planner,它在复杂环境里更稳。
- 局部规划器 —— 负责实际控制机器人沿着路径走,同时避开突然出现的障碍物。DWB是默认选择。
- 代价地图(全局/局部) —— 把环境变成“格子地图”,每个格子有代价。障碍物越近代价越高。
- AMCL —— 定位模块。用粒子滤波告诉你“机器人在哪”。
- 恢复行为 —— 当机器人卡住或迷路时,执行旋转、后退等动作尝试脱困。
- 生命周期管理 —— 每个节点都有明确的启动/关闭/激活状态,方便调试和热重启。
ros2 lifecycle list 看看各个节点的状态。我曾经花了一下午查“为什么导航不启动”,最后发现是生命周期节点没激活。
1.3 为什么选择Nav2?
你可能想问:ROS1的navigation stack用得好好的,为什么要换?
我直接说几个让我彻底倒戈的理由:
- 模块化到骨子里。 每个组件都是独立节点,可以单独替换。比如我不喜欢DWB,直接换成TEB,不用动其他代码。
- 行为树加持。 导航逻辑不再是硬编码的if-else。你可以用XML定义“如果定位不好,先旋转再重试”。可读性极高。
- 生命周期管理。 每个节点都能被优雅地启动、停止、重置。我在调试时经常只重启代价地图,不用重启整个导航栈。
- 参数动态调优。 运行时修改参数,立刻生效。你想想看,机器人跑着跑着,你调一下速度限制,不用重启——多爽。
- ROS2原生。 分布式通信、QoS、多机器人支持……这些ROS2的特性Nav2全用上了。
当然,Nav2也有学习曲线。但只要你理解了它的架构,后面调参就是水到渠成的事。
我个人习惯把Nav2看作一个“导航积木盒”——你需要什么功能,就拼什么模块。这也是为什么我坚持用Nav2做所有导航项目。
1.4 核心组件速览表
| 组件 | 职责 | 常用实现 |
|---|---|---|
| 行为树 | 导航逻辑编排 | Nav2 BT XML |
| 全局规划器 | 生成全局路径 | Smac Planner, NavFn |
| 局部规划器 | 局部避障与速度控制 | DWB, TEB |
| 全局代价地图 | 静态环境建模 | 代价地图2D |
| 局部代价地图 | 动态障碍物建模 | 代价地图2D |
| AMCL | 粒子滤波定位 | AMCL |
| 恢复行为 | 卡住/迷路时自救 | Spin, Backup, Wait |
| 生命周期 | 节点状态管理 | 生命周期节点 |
嗯,这一章先让你对Nav2有个整体印象。后面每一章我们都会深入一个组件,从原理到参数,再到实战调优。
你想想看,如果你能亲手把一台机器人的导航从“乱撞”调到“丝滑”,那种成就感——值得期待。