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 的导航生命周期大致是这样的:
- Unconfigured:节点刚创建,啥也没干
- Inactive:节点配置好了(比如加载了地图、设置了参数),但还没开始工作
- Active:节点开始正常工作,规划路径、控制运动
- Finalized:节点被销毁,释放资源
我在调试时经常利用这个机制。比如先让所有节点进入 Inactive 状态,确认参数都正确了,再统一激活。这样避免了「启动顺序不对导致崩溃」的问题。
实用命令:用 ros2 lifecycle list /nav2_controller 可以查看当前生命周期状态。用 ros2 lifecycle set /nav2_controller configure 可以手动切换状态。
四、知识体系总览
下面这张图是我自己整理的 Nav2 核心架构。你可以看到,BT Navigator 在最上层做决策,Planner 和 Controller 分别负责全局和局部路径,Recovery 在底层兜底。整个系统由生命周期管理。
从这张图你可以看到,整个系统是分层的。上层决策,中层规划与控制,下层兜底。每一层各司其职,通过行为树和生命周期机制协同工作。
我个人觉得,理解这个架构比记住具体参数更重要。因为参数可以查文档,但架构决定了你遇到问题时该从哪里入手。
调试思路:如果机器人导航出了问题,先看 BT Navigator 的行为树执行状态,再看 Planner 的全局路径是否合理,最后检查 Controller 的局部控制参数。按这个顺序排查,效率最高。