Nav2导航调参与避障实战 - 第1节

一、Nav2 到底是什么?

先说说我的理解。Nav2,全称是 Navigation2,说白了就是 ROS2 生态里专门负责让机器人「从 A 点走到 B 点」的那套框架。

你可能会问:「那和 ROS1 时代的 Navigation Stack 有什么区别?」嗯,区别大了。Nav2 不是简单的升级,而是完全重写的。我当年从 ROS1 迁移到 ROS2 时,最头疼的就是导航部分——老代码几乎没法直接用。Nav2 利用了 ROS2 的很多新特性,比如生命周期节点、更灵活的参数系统,还有行为树。

我个人习惯把 Nav2 理解成一个「导航操作系统」。它不只是一个算法库,而是一整套可插拔的组件框架。你可以换掉里面的规划器、控制器,甚至整个行为逻辑,但框架本身是稳定的。

核心要点:Nav2 = 导航算法 + 行为管理 + 生命周期控制

二、核心组件拆解

Nav2 的组件很多,但真正核心的就这几个。我按它们在导航流程中的出场顺序来讲。

1. BT Navigator(行为树导航器)

这是 Nav2 的大脑。它不直接做路径规划,而是负责「决策」——什么时候该规划路径?什么时候该避障?什么时候该执行恢复行为?

BT Navigator 用行为树(Behavior Tree)来组织这些逻辑。你想想看,传统导航里,如果机器人卡住了,你得写一堆 if-else 来判断。有了行为树,这些逻辑变成了可视化的节点树,改起来方便多了。

我在项目中遇到过一个问题:机器人总是在狭窄走廊里来回摆动。后来发现是行为树里「避障」和「路径跟踪」两个节点的优先级没调好。调整了行为树结构后,问题就解决了。

小技巧:调试行为树时,可以用 Nav2 自带的 BT Visualizer 工具,实时看到每个节点的执行状态。这比看日志直观多了。

2. Planner(全局规划器)

Planner 负责「大方向」。它根据全局地图,规划出一条从起点到终点的路径。默认用的是 NavFn,但你可以换成 A*、Dijkstra,甚至自己写的算法。

这里有个坑:全局规划器只考虑静态障碍物。动态障碍物?那是 Controller 的事。我曾经犯过这个错误——以为 Planner 能处理所有障碍,结果机器人对着一个突然出现的人直接撞上去了。

3. Controller(局部控制器)

Controller 负责「小细节」。它沿着 Planner 给出的全局路径走,同时实时处理传感器数据,避开动态障碍物。

Nav2 默认的 Controller 是 DWB(Dynamic Window Approach),说白了就是「边走边看」。它会在每个控制周期里,模拟出未来几秒内的多种运动轨迹,然后选一条最好的。

我记得有一次调试,机器人总是在原地打转。查了半天,发现是 Controller 的「最大旋转速度」参数设得太小了,导致它转不过弯来。嗯,这种问题很常见。

4. Recovery(恢复行为)

机器人总会遇到「走不动」的情况。比如被椅子腿卡住,或者前方突然出现一堵墙。这时候就需要 Recovery 组件上场了。

Nav2 内置了几种恢复行为:

  • Spin:原地旋转,重新扫描周围环境
  • Backup:后退一段距离,换个角度再试
  • Wait:等待一段时间,看看障碍物会不会自己移开

我曾经在仓库项目里遇到过:机器人被货架缝隙卡住,Spin 和 Backup 都试了没用。最后我加了一个自定义恢复行为——先后退,再旋转 45 度,然后重新规划路径。效果很好。

注意:恢复行为不是万能的。如果机器人频繁触发恢复,说明你的规划参数或者地图有问题。别只靠恢复行为来「擦屁股」。

三、导航生命周期

这是 Nav2 最让我喜欢的设计之一。ROS2 的生命周期节点,说白了就是给节点定义了明确的「状态机」:未配置、未激活、激活、正在关闭。

为什么需要这个?你想想看,传统导航里,节点一启动就开始工作。但如果地图还没加载完呢?如果传感器还没初始化呢?生命周期机制让这一切变得可控。

Nav2 的导航生命周期大致是这样的:

  1. Unconfigured:节点刚创建,啥也没干
  2. Inactive:节点配置好了(比如加载了地图、设置了参数),但还没开始工作
  3. Active:节点开始正常工作,规划路径、控制运动
  4. Finalized:节点被销毁,释放资源

我在调试时经常利用这个机制。比如先让所有节点进入 Inactive 状态,确认参数都正确了,再统一激活。这样避免了「启动顺序不对导致崩溃」的问题。

实用命令:用 ros2 lifecycle list /nav2_controller 可以查看当前生命周期状态。用 ros2 lifecycle set /nav2_controller configure 可以手动切换状态。

四、知识体系总览

下面这张图是我自己整理的 Nav2 核心架构。你可以看到,BT Navigator 在最上层做决策,Planner 和 Controller 分别负责全局和局部路径,Recovery 在底层兜底。整个系统由生命周期管理。

Nav2 核心架构总览 BT Navigator(行为树导航器) 决策层:何时规划?何时避障?何时恢复? Planner(全局规划器) 大方向:全局路径规划 Controller(局部控制器) 小细节:动态避障与轨迹跟踪 Recovery(恢复行为) 兜底:Spin / Backup / Wait 生命周期管理(Unconfigured → Inactive → Active → Finalized) 图 1:Nav2 核心组件分层架构

从这张图你可以看到,整个系统是分层的。上层决策,中层规划与控制,下层兜底。每一层各司其职,通过行为树和生命周期机制协同工作。

我个人觉得,理解这个架构比记住具体参数更重要。因为参数可以查文档,但架构决定了你遇到问题时该从哪里入手。

调试思路:如果机器人导航出了问题,先看 BT Navigator 的行为树执行状态,再看 Planner 的全局路径是否合理,最后检查 Controller 的局部控制参数。按这个顺序排查,效率最高。