1. Nav2初探:什么是Nav2?为什么选择Nav2?Nav2的架构概览与核心组件介绍
1.1 什么是Nav2?
Nav2,全称Navigation2,是ROS2生态下的官方导航框架。说白了,它就是一套帮你把机器人从A点安全送到B点的工具集。
我刚开始接触机器人导航时,用的是ROS1时代的move_base。那时候配置一个导航系统,光参数文件就能写几百行。后来迁移到ROS2,发现官方直接重写了整个导航栈,也就是现在的Nav2。
Nav2不是简单的版本升级,而是完全基于ROS2的特性重新设计的。它支持生命周期节点、参数动态配置、行为树驱动等现代架构。你想想看,一个导航系统要处理激光雷达数据、规划路径、控制电机、避障……这么多模块如果各自为战,调试起来得多痛苦?Nav2把这些都整合到了一起。
核心定义:Nav2是一个模块化、可扩展的导航框架,提供从感知到控制的完整导航解决方案。
1.2 为什么选择Nav2?
这个问题我经常被问到。尤其是那些从ROS1迁移过来的团队,总会问:用move_base跑得好好的,为什么要换?
我的回答很简单:因为ROS2本身就不一样了。
- 分布式架构:ROS2天然支持多机通信,Nav2可以轻松部署在机器人本体和远程计算节点上。我在项目中遇到过需要把路径规划放在工控机、传感器处理放在树莓派的情况,Nav2的节点拆分能力帮了大忙。
- 生命周期管理:每个导航组件都有明确的状态机——未配置、未激活、激活、错误。这意味着你可以精确控制启动顺序,避免传感器还没准备好就开始规划路径的尴尬。
- 行为树驱动:Nav2用行为树(Behavior Tree)替代了传统的状态机。嗯,这里要注意,行为树不是简单的流程图,它支持回退、并行、条件判断等复杂逻辑。我曾经用行为树实现了一个“先尝试全局规划,失败后原地旋转扫描,再重试”的逻辑,代码量比状态机少了三分之二。
- 插件化设计:几乎所有核心模块都支持插件。你想换一个路径规划算法?写个插件就行,不用动框架代码。
个人建议:如果你正在从ROS1迁移到ROS2,或者新项目选型,直接上Nav2。别走回头路。ROS1的move_base已经停止维护了。
1.3 Nav2的架构概览
Nav2的架构,我习惯把它分成三层来看:
- 应用层:用户直接交互的部分,比如导航面板、Rviz2插件、API接口。
- 核心层:导航的核心逻辑,包括全局规划器、局部规划器、恢复行为等。
- 硬件抽象层:与机器人硬件交互的部分,比如里程计、激光雷达、电机控制接口。
下面这张图是我自己整理的Nav2核心架构,你一看就明白了:
1.4 核心组件介绍
上面这张图里的每个方块,都是一个独立的组件。我来逐个说说它们的作用:
1.4.1 全局规划器 (Planner)
全局规划器负责计算从起点到终点的全局路径。它基于静态地图(比如SLAM建好的地图)做规划。默认用的是NavFn算法,你也可以换成A*、Dijkstra或者RRT*。
我记得有一次在工厂项目里,默认的NavFn在狭窄通道里总是规划出锯齿状的路径。后来换成了Smac Planner(一种混合A*算法),路径平滑了很多,机器人过弯再也不卡墙了。
1.4.2 局部规划器 (Controller)
局部规划器负责跟踪全局路径,同时处理动态障碍物。它实时接收激光雷达数据,在局部范围内做避障。默认的DWB(Dynamic Window Approach)控制器,说白了就是不断计算“当前速度下,未来几秒内会不会撞到东西”,然后选一个最优速度。
避坑指南:我曾经在调试局部规划器时,发现机器人总是贴着墙走。查了半天,原来是代价地图的膨胀半径设得太小了。记住,膨胀半径至少要大于机器人半径的一半,否则转弯时容易刮蹭。
1.4.3 代价地图 (Costmap)
代价地图是Nav2的“眼睛”。它把传感器数据(激光雷达、深度相机等)转换成栅格地图,每个格子都有一个代价值。代价值越高,表示这个区域越危险。全局代价地图和局部代价地图是分开维护的,前者用于全局规划,后者用于局部避障。
1.4.4 行为树 (Behavior Tree)
行为树是Nav2的“大脑”。它定义了导航的整个流程:先做什么、后做什么、出错了怎么办。比如一个典型的行为树流程是:
Sequence:
1. 计算全局路径
2. 循环执行局部跟踪
- 如果跟踪成功,继续
- 如果跟踪失败,执行恢复行为
- 原地旋转扫描
- 重新规划全局路径
- 如果还失败,发出求救信号
你想想看,如果用传统状态机实现这个逻辑,得写多少嵌套的if-else?行为树用XML文件就能搞定,而且可视化调试非常方便。
1.4.5 恢复行为 (Recovery)
机器人卡住了怎么办?Nav2内置了几种恢复行为:原地旋转、后退、重新规划。这些行为可以组合使用。我习惯把恢复行为比作“机器人的自救手册”——遇到问题先尝试自己解决,实在不行再向人类求助。
1.4.6 生命周期管理器
这个组件负责管理所有导航节点的生命周期。启动时,它会按顺序激活各个节点:先激活传感器,再激活代价地图,最后激活规划器和控制器。关闭时则反向操作。这样做的好处是,不会出现“规划器已经开始工作了,但代价地图还没建好”的混乱情况。
1.5 快速上手示例
说了这么多,不如直接看代码。下面是一个最简单的Nav2启动示例:
# 安装Nav2
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
# 启动Nav2(假设你已经有了地图和机器人模型)
ros2 launch nav2_bringup navigation_launch.py
use_sim_time:=true
map:=/path/to/your/map.yaml
启动后,在Rviz2中添加“Navigation2”面板,就可以看到机器人的位置、规划路径和代价地图了。点击“2D Nav Goal”按钮,在地图上点一个目标点,机器人就会自动规划路径并开始移动。
小技巧:第一次启动时,建议把Rviz2的显示频率调低一点(比如5Hz),否则代价地图的更新会占用大量CPU资源。我在笔记本上调试时就吃过这个亏,画面卡得跟幻灯片似的。
1.6 本章小结
Nav2不是凭空造出来的,它是ROS社区多年导航经验的结晶。从ROS1的move_base到ROS2的Nav2,不仅仅是代码重写,更是架构思想的升级。模块化、插件化、行为树驱动——这些设计让Nav2既能跑在几千块的差速小车上,也能部署在几十万的工业AGV上。
我个人觉得,学习Nav2最好的方式就是动手跑一遍。别怕出错,我刚开始配置参数时也经常把机器人搞到撞墙。但正是这些“撞墙”的经历,让我真正理解了每个参数背后的意义。
下一章,我们会深入Nav2的安装和配置,手把手带你搭建一个完整的导航环境。