1. Nav2初识:什么是Nav2?架构与核心组件概览

如果你刚接触机器人导航,可能会被一堆名词吓到:全局规划、代价地图、行为树、生命周期……
别急,我刚开始也一样。记得我第一次用ROS1的navigation stack时,光配置一个yaml就折腾了两天。
后来ROS2来了,Nav2彻底重写了导航框架。说实话,第一次看到Nav2的架构图,我也有点懵。
但等你真正理解它的设计思路,你会觉得——嗯,就该这么干。

1.1 到底什么是Nav2?

Nav2,全称Navigation2,是ROS2生态下的导航框架。
说白了,它是一套让机器人从A点走到B点的“大脑+小脑”组合。
它负责:接收目标位置、规划路径、避开障碍、控制速度、处理异常……
你可以把它理解成一个“导航操作系统”——但不是直接写死的,而是高度模块化。

核心思想: 用行为树(Behavior Tree)串联导航任务,每个节点只干一件事。想改导航逻辑?换一棵树就行,不用改C++代码。

我遇到过不少团队,把Nav2当成黑盒子。出问题了就调参数,调不好就骂街。
其实你只要搞懂它的几个核心组件,很多问题一眼就能看穿。

1.2 Nav2的架构与核心组件

来看一张我画的简化架构图。别被方块吓到,每个方块都是一个独立ROS2节点。

Nav2 核心组件 · 简化架构 行为树 (BT) 导航逻辑编排 全局规划器 NavFn / Smac / A* 局部规划器 DWB / TEB 全局代价地图 静态层 + 障碍物层 局部代价地图 动态障碍物 + 膨胀层 AMCL 粒子滤波定位 恢复行为 生命周期管理

从上图你能看到,Nav2不是一个大单体,而是多个模块各司其职:

  • 行为树(BT) —— 导航的“总指挥”。它决定先规划还是先恢复,失败了重试还是放弃。
  • 全局规划器 —— 负责生成从起点到终点的宏观路径。我常用Smac Planner,它在复杂环境里更稳。
  • 局部规划器 —— 负责实际控制机器人沿着路径走,同时避开突然出现的障碍物。DWB是默认选择。
  • 代价地图(全局/局部) —— 把环境变成“格子地图”,每个格子有代价。障碍物越近代价越高。
  • AMCL —— 定位模块。用粒子滤波告诉你“机器人在哪”。
  • 恢复行为 —— 当机器人卡住或迷路时,执行旋转、后退等动作尝试脱困。
  • 生命周期管理 —— 每个节点都有明确的启动/关闭/激活状态,方便调试和热重启。
💡 我的经验: 刚接触时别急着调参数。先打开终端,用 ros2 lifecycle list 看看各个节点的状态。我曾经花了一下午查“为什么导航不启动”,最后发现是生命周期节点没激活。

1.3 为什么选择Nav2?

你可能想问:ROS1的navigation stack用得好好的,为什么要换?
我直接说几个让我彻底倒戈的理由:

  1. 模块化到骨子里。 每个组件都是独立节点,可以单独替换。比如我不喜欢DWB,直接换成TEB,不用动其他代码。
  2. 行为树加持。 导航逻辑不再是硬编码的if-else。你可以用XML定义“如果定位不好,先旋转再重试”。可读性极高。
  3. 生命周期管理。 每个节点都能被优雅地启动、停止、重置。我在调试时经常只重启代价地图,不用重启整个导航栈。
  4. 参数动态调优。 运行时修改参数,立刻生效。你想想看,机器人跑着跑着,你调一下速度限制,不用重启——多爽。
  5. ROS2原生。 分布式通信、QoS、多机器人支持……这些ROS2的特性Nav2全用上了。
⚠️ 避坑提醒: 我曾经在一个项目里直接复制了别人的Nav2参数,结果机器人原地转圈。后来发现是全局代价地图的“膨胀半径”设得太小,机器人把自己当成障碍物了。所以,理解每个参数的含义比抄参数更重要。

当然,Nav2也有学习曲线。但只要你理解了它的架构,后面调参就是水到渠成的事。
我个人习惯把Nav2看作一个“导航积木盒”——你需要什么功能,就拼什么模块。这也是为什么我坚持用Nav2做所有导航项目。

1.4 核心组件速览表

组件职责常用实现
行为树导航逻辑编排Nav2 BT XML
全局规划器生成全局路径Smac Planner, NavFn
局部规划器局部避障与速度控制DWB, TEB
全局代价地图静态环境建模代价地图2D
局部代价地图动态障碍物建模代价地图2D
AMCL粒子滤波定位AMCL
恢复行为卡住/迷路时自救Spin, Backup, Wait
生命周期节点状态管理生命周期节点

嗯,这一章先让你对Nav2有个整体印象。后面每一章我们都会深入一个组件,从原理到参数,再到实战调优。
你想想看,如果你能亲手把一台机器人的导航从“乱撞”调到“丝滑”,那种成就感——值得期待。