Nav2 概览与架构:它到底是什么?
好,我们直接开始。这门课叫《Nav2 导航参数配置与调优》,第一件事,得先搞清楚 Nav2 是什么。
简单说,Nav2 就是 ROS2 生态里那个帮你把机器人从 A 点导航到 B 点的框架。它不是一个单一的程序,而是一整套可插拔的模块集合。你想想看,一个机器人要动起来,得先知道自己在哪(定位),然后规划一条路(全局规划),再沿着路走(控制),路上遇到障碍还得躲(局部规划),万一卡住了还得想办法脱困(恢复)。Nav2 把这些事全包了。
我个人习惯把 Nav2 理解成一个「导航操作系统」。它把底层硬件、传感器数据、算法模块全部抽象成标准接口,你只需要配置参数、组装模块,就能跑起来。我在项目里见过不少团队自己从头写导航,最后都绕回来用 Nav2——不是因为别的,而是它把坑都踩过了。
核心组件:谁在干活?
Nav2 的核心组件,说白了就四个角色:BT Navigator、Planner、Controller、Recovery。它们各司其职,配合起来就像一支小型团队。
一句话总结:BT Navigator 是项目经理,Planner 是设计师,Controller 是执行者,Recovery 是救火队。
1. BT Navigator(行为树导航器)
这是 Nav2 的大脑。它不直接算路径,也不直接控制电机,而是用一棵「行为树」来编排整个导航流程。比如:先检查目标是否可达 → 规划全局路径 → 开始跟踪 → 如果遇到障碍 → 尝试局部避障 → 如果还是过不去 → 触发恢复行为。
为什么用行为树?因为导航不是线性的。你没法写死一个「先 A 后 B 再 C」的流程,路上随时可能出状况。行为树天然支持条件判断、循环、回退,比传统状态机灵活得多。我记得第一次在项目里把状态机换成行为树,代码量直接砍了一半。
2. Planner(规划器)
Planner 负责「想」。它根据地图和目标点,算出一条从起点到终点的全局路径。默认用的是 NavFn,一个基于 Dijkstra 或 A* 的网格规划器。你也可以换成 Smac Planner,它支持 Hybrid-A*,适合阿克曼底盘。
这里有个坑:Planner 算出来的路径是「理想路径」,它不考虑机器人能不能走。比如直角转弯,对差速底盘没问题,但对阿克曼底盘就是死路。所以参数调优时,一定要匹配底盘模型。
3. Controller(控制器)
Controller 负责「做」。它拿到 Planner 给的全局路径,结合当前位姿和激光雷达数据,实时算出一条局部路径,然后发给电机。默认是 DWB Controller,类似 ROS1 的 DWA,但更灵活。
Controller 的调参是这门课的重头戏。速度、加速度、前视距离、代价权重……每个参数都直接影响机器人走得好不好。我在项目里遇到过机器人原地画圈,最后发现是 max_vel_x 设得太小,控制器根本推不动。
4. Recovery(恢复行为)
Recovery 是兜底的。当 Controller 发现路径被堵死,或者机器人卡住不动,就会触发恢复行为。默认有三种:原地旋转、后退再旋转、重新规划全局路径。
我曾经在一个仓库项目里,机器人老是在货架缝隙里卡住。默认的恢复行为是原地转圈,结果越转越卡。后来我把旋转半径调大,加了后退距离,才解决问题。嗯,这里要注意:恢复行为不是万能的,它只是给你一个「再试一次」的机会。
| 组件 | 职责 | 默认实现 | 调优重点 |
|---|---|---|---|
| BT Navigator | 编排导航流程 | Nav2BehaviorTree | 行为树 XML 配置 |
| Planner | 全局路径规划 | NavFn / Smac Planner | 规划算法、启发函数 |
| Controller | 局部路径跟踪 | DWB Controller | 速度、加速度、代价权重 |
| Recovery | 异常恢复 | Spin / BackUp / Replan | 旋转半径、后退距离 |
ROS2 与 Nav2:谁依赖谁?
这个问题经常有人搞混。ROS2 是底层通信框架,Nav2 是上层应用。没有 ROS2,Nav2 跑不起来;但 ROS2 不只有 Nav2,它还能做机械臂控制、视觉处理等等。
具体来说,Nav2 依赖 ROS2 的这些东西:
- 节点与话题:每个组件都是一个 ROS2 节点,通过话题交换数据。比如 /odom、/scan、/cmd_vel。
- 参数服务器:所有配置参数都通过 ROS2 参数系统加载,支持运行时动态修改。
- TF 坐标变换:导航必须知道每个坐标系的关系(map → odom → base_link → laser),全靠 TF 维护。
- Action 通信:导航是一个持续动作,不是一次性请求。ROS2 的 Action 机制天然适合这种场景。
- 生命周期管理:Nav2 的节点都是有生命周期的——未配置、未激活、激活、关闭。ROS2 提供了标准接口来管理这些状态。
我的建议:如果你刚接触 ROS2,先别急着调 Nav2。花一天时间把 ROS2 的话题、服务、Action、TF 这四个概念搞熟,后面调参会顺畅很多。我见过太多人卡在「为什么话题收不到数据」这种基础问题上。
整体架构:一张图看懂
下面这张图展示了 Nav2 的核心架构。注意看数据流向:传感器数据从左边进来,经过各个模块,最终输出速度指令给底盘。
注意:这张图是简化版。实际 Nav2 还有 Map Server、Costmap2D、Waypoint Follower 等模块。但核心流程就是传感器 → 规划 → 控制 → 执行。先把主干搞懂,枝叶后面慢慢加。
为什么选择 Nav2?
市面上导航框架不少,但 Nav2 有几个不可替代的优势:
- 模块化:每个组件都可以替换。你觉得 DWB 不好用?换成 TEB 或 MPC。你觉得 NavFn 太慢?换成 Smac Planner。接口是标准的,插拔就行。
- 行为树:这是 Nav2 区别于 ROS1 Navigation Stack 的最大亮点。行为树让导航逻辑变得可配置、可调试、可复用。你甚至可以在运行时动态切换行为树。
- ROS2 原生:充分利用 ROS2 的分布式、实时性、安全性。多机器人场景下,Nav2 的架构优势非常明显。
- 社区活跃:有问题去 GitHub 提 issue,基本当天就有人回。文档虽然不算完美,但比大多数开源项目强。
当然,Nav2 也不是银弹。它学习曲线陡,参数多,文档有时候跟不上代码。但这就是我们这门课存在的意义——帮你把这些参数一个个吃透,把坑一个个填平。