1. Nav2概述与架构:Nav2是什么、Nav2与ROS1 Navigation Stack的区别、Nav2的核心组件与架构图
1.1 Nav2到底是什么?
说实话,很多刚接触Nav2的朋友都会问我一个问题:「Nav2不就是ROS1那个导航包的升级版吗?」嗯,这个说法对,但不全对。
Nav2,全称是Navigation 2,它是ROS2生态下的新一代导航框架。你可以把它理解成一个「机器人导航的完整解决方案」。它不光能帮你规划路径,还能处理定位、控制、行为树管理、甚至生命周期管理这些杂七杂八的事情。
我个人习惯把Nav2比作一个「导航操作系统」——它不是一个单一的功能包,而是一整套可插拔、可配置的导航工具链。你想想看,从传感器数据进来,到机器人最终动起来,中间要经过多少环节?Nav2把这些环节全部标准化了。
核心要点:Nav2是一个基于ROS2的、模块化的、可扩展的导航框架。它支持多机器人、多地图、动态路径规划,并且完全兼容ROS2的生态。
1.2 Nav2与ROS1 Navigation Stack的区别
我在2018年做过一个项目,用的是ROS1的move_base。那时候遇到一个很头疼的问题:机器人走到一半,地图变了,整个导航系统直接崩掉。嗯,这就是ROS1 Navigation Stack的痛点之一。
下面这张表,我整理了两者的核心区别,你看完就明白了:
| 对比维度 | ROS1 Navigation Stack | Nav2 (ROS2) |
|---|---|---|
| 底层通信 | 基于ROS1的Topic/Service | 基于ROS2的DDS(数据分发服务) |
| 生命周期管理 | 无,节点启动后一直运行 | 有,支持生命周期节点(LifecycleNode) |
| 行为管理 | 简单的状态机(State Machine) | 行为树(Behavior Tree) |
| 多机器人支持 | 不原生支持 | 原生支持多机器人导航 |
| 动态地图 | 支持有限,容易崩溃 | 原生支持,稳定可靠 |
| 插件化程度 | 部分插件化 | 完全插件化,所有组件都可替换 |
| 参数动态配置 | 需要重启节点 | 支持运行时动态修改参数 |
说白了,ROS1的Navigation Stack更像是一个「固定流水线」——你只能按照它规定好的流程走。而Nav2是一个「乐高积木」——你想怎么拼就怎么拼。
我的经验:如果你是从ROS1迁移过来的,最需要适应的不是API的变化,而是「行为树」这个新概念。我曾经花了一周时间才彻底搞懂行为树怎么用,但一旦用上了,你会发现它比状态机灵活太多了。
1.3 Nav2的核心组件
Nav2的组件很多,但核心的就那么几个。我按功能把它们分成了四类:
1.3.1 规划器(Planner)
- 全局规划器(Global Planner):负责从起点到终点的全局路径规划。默认用的是NavFn,你也可以换成A*、Dijkstra或者RRT。
- 局部规划器(Local Planner):负责实时避障和局部路径调整。默认是DWB(Dynamic Window Approach),你也可以用TEB、MPC等。
1.3.2 控制器(Controller)
- 负责把规划好的路径转换成具体的速度指令(线速度、角速度)。
- 说白了,就是告诉机器人「你该走多快、往哪转」。
1.3.3 定位模块(Localization)
- 默认使用AMCL(自适应蒙特卡洛定位),负责估计机器人在全局地图中的位置。
- 你也可以换成EKF、UKF或者其他定位算法。
1.3.4 行为树(Behavior Tree)
- 这是Nav2最大的亮点。它用行为树来管理整个导航流程。
- 比如:先定位 → 再规划 → 再控制 → 如果遇到障碍物就重新规划。
- 你可以在XML文件里自由编排这些行为。
避坑指南:我曾经在调试一个项目时,发现机器人总是卡在某个地方不动。查了半天,原来是行为树里少了一个「重试」节点。记住,行为树的逻辑一定要覆盖所有异常情况,否则机器人会「傻掉」。
1.4 Nav2架构图
下面这张SVG图,是我手绘的Nav2核心架构。你看完就能对整个系统有个全局认识:
这张图你看懂了吗?从上到下,用户发起导航请求,行为树负责编排整个流程,核心组件各司其职,最后数据层和硬件层完成实际执行。每一层都可以独立替换,这就是Nav2的「插件化」精髓。
1.5 一个小例子:启动Nav2
说了这么多理论,我们来点实际的。下面这个命令,是启动Nav2最基础的方式:
# 启动Nav2,加载默认配置
ros2 launch nav2_bringup navigation_launch.py
# 如果你有自己的地图,可以这样
ros2 launch nav2_bringup navigation_launch.py \
map:=/path/to/your/map.yaml \
use_sim_time:=True
嗯,就这么简单。但别高兴太早——实际项目中,你至少需要配置以下几个文件:
- nav2_params.yaml:所有导航参数的配置文件
- behavior_tree.xml:行为树定义文件
- planner.yaml:规划器参数
- controller.yaml:控制器参数
我的建议:刚开始学Nav2,不要急着改参数。先用默认配置跑通一个仿真环境,比如turtlebot3。等你看到机器人真的动起来了,再慢慢调参数。我见过太多人一上来就改参数,结果机器人原地打转,心态直接崩了。
1.6 本章小结
这一章我们聊了Nav2是什么、它和ROS1 Navigation Stack的区别、以及它的核心组件和架构。说白了,Nav2就是ROS2时代的导航标准,它更灵活、更稳定、也更强大。
下一章,我们会深入行为树——这个Nav2最核心、也最让人头疼的部分。准备好了吗?