一、Nav2到底是什么?

先说说我的理解。Nav2,全称是Navigation2,它是ROS2生态里负责机器人自主导航的官方框架。说白了,就是让机器人知道「我在哪、要去哪、怎么走、路上别撞到东西」的一套完整解决方案。

我记得刚接触机器人导航那会儿,总觉得导航不就是「给个目标点,走过去」嘛。后来真正上手才发现,这里面门道太多了——地图怎么建?路径怎么规划?遇到障碍物怎么绕?轮子打滑了怎么修正?这些问题,Nav2都帮你考虑到了。

核心定义:Nav2是一个基于ROS2的、模块化的、行为树驱动的导航框架。它把导航任务拆解成多个独立组件,通过行为树(Behavior Tree)来编排这些组件的执行顺序和逻辑。

Nav2架构解析

Nav2的架构设计,我个人觉得非常优雅。它不像ROS1的move_base那样把所有逻辑揉在一起,而是采用了「插件化 + 行为树」的松耦合设计。

整体架构分层

从顶层往下看,Nav2大致分为三层:

  • 应用层:你写的机器人应用程序,通过Action接口给Nav2下发导航目标
  • 行为树层:BT Navigator,负责编排整个导航流程
  • 插件层:Planner、Controller、Recovery等具体功能模块

嗯,这里要注意,行为树层是Nav2区别于move_base最核心的地方。它让导航逻辑变得可配置、可复用、可调试。

Nav2 架构分层图 应用层 机器人应用程序 / 导航目标下发 (Action接口) 行为树层 BT Navigator — 编排导航流程逻辑 插件层 Planner / Controller / Recovery / 其他插件 Planner 全局路径规划 Controller 局部路径跟踪 Recovery 异常恢复行为

核心组件详解

接下来我们逐个看看Nav2里最重要的几个组件。我在实际项目中调试最多的也就是它们几个。

1. BT Navigator — 行为树导航器

这是Nav2的大脑。它不直接做路径规划,也不直接控制电机,而是负责「决策」——什么时候该规划路径?什么时候该跟踪路径?遇到障碍物是先原地旋转还是倒车?

BT Navigator加载一个XML格式的行为树文件,里面定义了各种导航行为的组合逻辑。你想想看,这比在C++代码里写if-else要灵活太多了。

我的经验:刚开始用Nav2时,我总觉得行为树很玄乎。后来有一次调试一个复杂场景——机器人需要在窄走廊里倒车避让,然后重新规划路径。用行为树,我只需要拖拽几个节点就能搞定。要是用传统方式,得改半天代码。

2. Planner — 全局路径规划器

Planner负责从起点到终点规划出一条全局路径。它基于静态地图(比如SLAM建好的地图)来计算。

常用的Planner插件有:

  • NavFn:基于Dijkstra或A*算法,稳定可靠
  • Smac Planner:支持Hybrid-A*,适合阿克曼底盘
  • Theta*:路径更平滑,但计算量稍大

我个人习惯用NavFn做基础配置,因为它最稳定。只有在需要更复杂路径时,才会换成Smac Planner。

3. Controller — 局部路径控制器

Controller负责把全局路径转化成实际的运动指令。它要考虑机器人的运动学约束,还要实时避障。

常见的Controller插件:

插件名称 适用底盘 特点
DWB Controller 差速/全向 可配置性强,支持多种打分器
Regulated Pure Pursuit 差速/阿克曼 纯追踪改进版,带速度调节
MPPI Controller 差速/阿克曼 基于模型预测,效果好但计算量大

避坑指南:我曾经在阿克曼底盘上用了DWB Controller,结果机器人转弯时一直在原地打转。后来才发现DWB默认参数是为差速底盘优化的。换成Regulated Pure Pursuit后,问题立刻解决了。选Controller一定要匹配你的底盘类型。

4. Recovery — 恢复行为

机器人导航不可能一帆风顺。卡住了怎么办?路径被完全堵死了怎么办?Recovery模块就是干这个的。

Nav2内置了几种恢复行为:

  • Spin:原地旋转,重新扫描周围环境
  • BackUp:后退一段距离,尝试绕开障碍
  • Wait:等待一段时间,比如等人让路
  • Clear Costmap:清除代价地图上的障碍物信息

这些恢复行为通过行为树组合起来。比如「先Spin,不行就BackUp,再不行就Clear Costmap重试」。嗯,这里要注意,恢复行为的参数调不好,机器人可能会反复做无用功。

代价地图系统

差点忘了说代价地图(Costmap)。这是Nav2里一个非常重要的概念,它把环境信息转化成机器人能理解的「代价」数值。

Nav2维护了两张代价地图:

  • 全局代价地图:用于全局路径规划,更新频率低,范围大
  • 局部代价地图:用于局部路径规划和避障,更新频率高,范围小

每张地图又分为多个图层(Layer),比如静态地图层、障碍物层、膨胀层等。这种分层设计让我在调试时能精确定位问题——是地图没加载对?还是传感器数据没进来?

核心要点:代价地图的配置直接影响导航效果。膨胀半径设大了,机器人过不了窄门;设小了,容易刮蹭。我一般从0.3米开始调,根据实际测试逐步优化。

小结

这一章我们聊了Nav2是什么、它的三层架构、以及Planner、Controller、Recovery这几个核心组件。说白了,Nav2就是把导航这件事拆成了「规划→控制→异常处理」三个环节,再用行为树把它们串起来。

理解了这个框架,后面调参的时候你就能知道——机器人不走直线,是Controller的问题;机器人找不到路,是Planner的问题;机器人卡住不动,是Recovery或者行为树逻辑的问题。

嗯,这些内容看起来有点多,但别急。后面我们会一个一个组件深入调试,到时候你就能体会到Nav2这套设计的精妙之处了。