1. Nav2 概览与核心架构
大家好,欢迎来到《Nav2地图构建与避障调参实战》的第一章。
说实话,很多新手拿到 Nav2 第一反应就是「这玩意儿怎么这么复杂?」。一堆节点、一堆参数、还有行为树这种听起来就头大的东西。别急,我当年也是这么过来的。
这一章,我们就来拆解 Nav2 的骨架。你不需要记住所有细节,但得知道它为什么这么设计,以及每个零件是干嘛用的。
1.1 模块化设计:为什么拆开比揉在一起好?
Nav2 不是一个大铁块,而是一套乐高积木。每个功能模块独立运行,通过 ROS 2 的通信机制互相配合。
这样做的好处很明显:
- 可替换性:你觉得默认的全局规划器不好用?换一个就行,不用动其他部分。
- 可调试性:机器人撞墙了,你只需要盯着控制器和代价地图,不用从头排查到尾。
- 可扩展性:想加个「爬坡检测」功能?写个新节点插进去就行。
核心思路:Nav2 把「导航」这件事拆成了「我在哪」「去哪」「怎么去」「路上别撞」四个问题,每个问题对应一个或几个模块。
我在项目中遇到过最典型的反面教材:有人把所有逻辑写在一个节点里,结果每次改参数都要重新编译整个项目。嗯,那滋味可不好受。
1.2 生命周期节点:让机器人学会「开机自检」
你有没有想过,为什么机器人启动后不能直接跑?
因为导航系统需要初始化。比如加载地图、连接传感器、校准参数。如果这些没做完就开始规划路径,大概率会撞墙。
Nav2 引入了 生命周期节点(LifecycleNode)来解决这个问题。每个节点有四个状态:
| 状态 | 含义 | 我常用的场景 |
|---|---|---|
| Unconfigured | 刚创建,啥都没干 | 节点启动后的初始状态 |
| Inactive | 已配置,但还没开始工作 | 加载参数、订阅话题,但不处理数据 |
| Active | 正常运行 | 开始规划、控制、更新代价地图 |
| Finalized | 清理资源,准备销毁 | 关闭节点时的收尾工作 |
我个人习惯在 Inactive 阶段做一次「健康检查」——确认激光雷达有数据、里程计在发布、地图加载成功。如果哪一步失败,直接拒绝进入 Active,而不是让机器人带着故障上路。
小技巧:调试时可以用 ros2 lifecycle set /nav2_controller configure 手动触发状态切换,看看每个阶段有没有报错。
1.3 行为树:导航的「决策大脑」
行为树(Behavior Tree)是 Nav2 最让我眼前一亮的设计。它把导航决策画成了一棵树,每个节点代表一个动作或条件。
举个例子,一个简单的导航行为树可能是这样的:
- 根节点:Sequence(顺序执行)
- 子节点1:ComputePathToPose(计算路径)
- 子节点2:FollowPath(跟随路径)
- 子节点3:如果遇到障碍,执行 Recovery(恢复行为)
你想想看,这种结构的好处是什么?
- 可视化:用工具(比如 Nav2 自带的 Behavior Tree Viewer)能直接看到机器人当前在树的哪个位置。
- 可组合:想加个「先原地旋转再后退」的避障策略?在树里加个节点就行,不用改 C++ 代码。
- 可调试:机器人卡住了,看行为树就知道是「路径计算失败」还是「路径跟踪超时」。
我曾经踩过的坑:默认的行为树里,Recovery 节点会尝试「后退-旋转-前进」三次。但在狭窄走廊里,后退反而会让机器人卡得更死。后来我改成了「先旋转90度再尝试」,效果好了很多。
1.4 规划器与控制器:谁负责想,谁负责做?
这两个角色分工非常明确:
- 规划器(Planner):负责「想」。给定起点和终点,算出一条无碰撞的路径。Nav2 默认用 NavFn 或 Smac Planner。
- 控制器(Controller):负责「做」。沿着规划器给的路径走,同时实时避障。默认是 DWB(Dynamic Window Approach)或 Regulated Pure Pursuit。
我习惯把规划器比作「地图上的导航员」,控制器比作「实际开车的司机」。导航员说「前方500米右转」,司机得看路况决定怎么转——如果路上有坑,司机可以稍微绕一下,但大方向不变。
| 组件 | 输入 | 输出 | 我常用的算法 |
|---|---|---|---|
| 全局规划器 | 起点、终点、全局代价地图 | 全局路径(一系列位姿点) | NavFn、Smac Planner 2D |
| 局部规划器(控制器) | 全局路径、局部代价地图、里程计 | 速度指令(线速度+角速度) | DWB、Regulated Pure Pursuit |
个人经验:如果你在室内环境(走廊、房间),Regulated Pure Pursuit 比 DWB 更稳,因为它对路径的跟踪更平滑。但如果你在户外或动态障碍物多的场景,DWB 的灵活性更好。
1.5 代价地图:机器人的「危险感知图」
代价地图(Costmap)是 Nav2 里最容易被忽视但最重要的组件。说白了,它就是一张二维网格图,每个格子有一个「代价」值,表示这个位置有多危险。
- 0:自由空间,随便走。
- 1-99:有障碍物风险,越靠近障碍物代价越高。
- 100:致命障碍,不能走。
Nav2 维护了两张代价地图:
- 全局代价地图:用于全局规划,通常基于静态地图(比如 SLAM 建好的图)。更新频率低,但范围大。
- 局部代价地图:用于实时避障,基于传感器数据(激光雷达、深度相机)。更新频率高,但范围小(通常 3-5 米)。
嗯,这里要注意:代价地图的更新频率和分辨率直接影响导航效果。分辨率太高,计算量爆炸;分辨率太低,机器人可能「看不见」细小的障碍物(比如桌腿)。
我的调参原则:先保证局部代价地图能「看到」机器人周围 0.5 米内的所有障碍物,再考虑全局地图的精度。毕竟,撞上近处的障碍物比走一条「理论上最优」的路径更致命。
1.6 整体架构图:把这些零件拼起来
下面这张图展示了 Nav2 的核心组件和它们之间的数据流。你可以把它当作后续章节的「导航地图」。
从这张图你能看到:行为树是「大脑」,决定什么时候规划、什么时候控制、什么时候恢复。规划器和控制器是「左右手」,一个负责想,一个负责做。代价地图是「眼睛」,告诉它们哪里能走哪里不能走。
1.7 本章小结
这一章我们走马观花地看了 Nav2 的骨架。你不需要现在就记住所有细节,但请记住几个关键点:
- Nav2 是模块化的,每个组件可以独立替换和调试。
- 生命周期节点让系统启动更安全,不会「带病上岗」。
- 行为树是决策核心,把导航逻辑可视化、可组合。
- 规划器和控制器分工明确,一个负责全局路径,一个负责局部跟踪。
- 代价地图是导航的「危险感知图」,分全局和局部两张。