1. 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 核心架构图 用户应用层 导航请求 / 目标点 / 地图加载 行为树管理器 (Behavior Tree) 导航流程编排 / 异常处理 / 重试机制 核心导航组件 全局规划器 NavFn / A* / Dijkstra 局部规划器 DWB / TEB / MPC 控制器 速度指令生成 定位模块 AMCL / EKF 数据与地图层 代价地图 / 全局地图 / 传感器数据 机器人硬件层 (底盘 / 传感器)

这张图你看懂了吗?从上到下,用户发起导航请求,行为树负责编排整个流程,核心组件各司其职,最后数据层和硬件层完成实际执行。每一层都可以独立替换,这就是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时代的导航标准,它更灵活、更稳定、也更强大。