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 的核心组件和它们之间的数据流。你可以把它当作后续章节的「导航地图」。

Nav2 核心架构与数据流 行为树 (BT Navigator) 全局规划器 (Planner) 控制器 (Controller) 全局代价地图 局部代价地图 传感器 (Lidar/Camera) 说明:行为树调度规划器和控制器;规划器依赖全局代价地图,控制器依赖局部代价地图;传感器同时更新两张代价地图。

从这张图你能看到:行为树是「大脑」,决定什么时候规划、什么时候控制、什么时候恢复。规划器和控制器是「左右手」,一个负责想,一个负责做。代价地图是「眼睛」,告诉它们哪里能走哪里不能走。

1.7 本章小结

这一章我们走马观花地看了 Nav2 的骨架。你不需要现在就记住所有细节,但请记住几个关键点:

  • Nav2 是模块化的,每个组件可以独立替换和调试。
  • 生命周期节点让系统启动更安全,不会「带病上岗」。
  • 行为树是决策核心,把导航逻辑可视化、可组合。
  • 规划器和控制器分工明确,一个负责全局路径,一个负责局部跟踪。
  • 代价地图是导航的「危险感知图」,分全局和局部两张。