1. 导航系统概述:ROS2与Nav2简介、导航系统组成、路径规划基本概念
1.1 为什么我们要聊导航系统?
做机器人这几年,我最大的感触就是:导航是机器人的“腿”。没有导航,机器人就是个会思考的“植物人”。你想想看,一个扫地机器人如果不知道自己在哪、要去哪、怎么去,那它只能原地打转。
我个人习惯把导航系统比作人类的出行方式。你出门前,得先知道自己在哪(定位),然后知道目的地(目标),再规划一条路线(路径规划),最后迈开腿走(控制执行)。机器人导航,说白了就是这套逻辑的工程化实现。
核心观点:导航不是单一技术,而是定位、建图、规划、控制的系统工程。
1.2 ROS2与Nav2:新时代的导航框架
ROS2,全称Robot Operating System 2,是机器人领域的“操作系统”。注意,它不是真正的操作系统,而是一个分布式通信框架。我刚开始接触ROS时,总觉得它就是个消息传递工具,后来才发现,它的生态才是真正的宝藏。
Nav2,则是ROS2生态下的导航系统。它继承了ROS1时代Navigation Stack的衣钵,但做了大量重构。我记得在ROS1时代,导航栈的配置简直是个噩梦——参数多到让人头皮发麻。Nav2在这方面做了很多优化,模块化程度更高,扩展性也更强。
为什么选择Nav2?
- 模块化设计:每个组件都可以独立替换,比如你可以用自己的路径规划器替换默认的
- 行为树驱动:导航流程不再是硬编码,而是通过行为树灵活编排
- 生命周期管理:每个节点都有明确的状态机,启动、运行、清理都井井有条
- 更好的实时性:ROS2的DDS通信机制,比ROS1的TCP/UDP更可靠
我的建议:如果你是从ROS1迁移过来的,别急着把所有参数照搬。Nav2的很多参数含义已经变了,直接复制粘贴会踩坑。
1.3 导航系统组成:拆开来看其实不复杂
一个完整的导航系统,通常包含以下几个核心模块。我画了一张图,帮你理清它们之间的关系。
这张图里,我特意把行为树管理层放在了最下面。为什么?因为它是Nav2的灵魂。我曾经在一个项目里,为了调试导航流程,硬生生把行为树拆了十几遍。后来发现,理解了行为树,Nav2就掌握了一半。
各模块的职责,我简单梳理一下:
| 模块 | 核心功能 | 常见实现 |
|---|---|---|
| 传感器 | 获取环境数据 | 激光雷达、深度相机、轮式里程计 |
| 定位 | 估计机器人位姿 | AMCL、EKF、Cartographer |
| 地图 | 构建环境表示 | 占用网格、代价地图、语义地图 |
| 路径规划 | 生成可行路径 | A*、Dijkstra、TEB、DWA |
| 控制 | 跟踪路径 | PID、MPC、Pure Pursuit |
注意:定位和建图是两个独立但紧密耦合的模块。如果你用SLAM同时做这两件事,一定要小心“漂移”问题。我曾经在一个长走廊里跑SLAM,结果地图越建越歪,最后机器人直接“撞墙”了。
1.4 路径规划基本概念:从A到B的艺术
路径规划,说白了就是回答三个问题:
- 我在哪?——定位模块回答
- 我要去哪?——用户或任务管理器回答
- 怎么去?——路径规划器回答
Nav2里,路径规划分两层:
- 全局路径规划:在已知地图上,规划一条从起点到终点的粗路径。常用算法有A*、Dijkstra。我个人的经验是,A*在大多数场景下够用,但如果地图特别大,可以考虑用JPS(Jump Point Search)加速。
- 局部路径规划:在全局路径的基础上,实时避障并生成平滑轨迹。常用算法有TEB(Timed Elastic Band)和DWA(Dynamic Window Approach)。
你可能会问:为什么需要两层?直接全局规划不行吗?
嗯,这里要注意。全局规划假设地图是静态的,但现实世界充满动态障碍物——突然跑出来的行人、移动的椅子、开着的门。局部规划就是处理这些“意外”的。我做过一个仓储机器人项目,全局路径规划得好好的,结果一个叉车突然横在路中间,局部规划器立刻重新规划了一条绕行路线。没有局部规划,机器人就只能傻等着。
避坑指南:我曾经在配置局部规划器时,把速度权重调得太高,结果机器人为了追求速度,贴着障碍物走,差点撞上。后来我学乖了,安全权重永远优先于效率权重。
1.5 代价地图:机器人眼中的世界
路径规划不是凭空进行的。机器人需要知道哪些地方能走,哪些地方不能走。这就是代价地图的作用。
代价地图本质上是一张网格图,每个格子都有一个代价值:
- 0:自由空间,随便走
- 100+:障碍物,不能走
- 1-99:越靠近障碍物,代价越高
Nav2维护了两张代价地图:
- 全局代价地图:用于全局规划,通常分辨率较低,覆盖范围大
- 局部代价地图:用于局部规划,分辨率高,范围小,实时更新
我记得第一次调试代价地图时,发现机器人总在同一个地方绕圈。后来一查,原来是代价地图的膨胀半径设得太小,机器人把障碍物边缘当成了可通行区域。嗯,这种坑踩过一次就不会再犯了。
1.6 行为树:导航流程的“导演”
Nav2最大的亮点之一,就是用行为树来编排导航流程。传统导航栈里,导航逻辑是写死在代码里的——先定位、再规划、再控制,顺序固定,很难灵活调整。
行为树就不一样了。它像一部电影的导演,可以随时喊“卡”,换一个场景。比如:
- 如果规划失败,行为树可以自动触发重规划
- 如果遇到动态障碍物,行为树可以暂停当前路径,等待障碍物离开
- 如果定位丢失,行为树可以触发重定位
我刚开始用行为树时,觉得它多此一举。后来在一个复杂工厂项目里,机器人需要频繁进出电梯,行为树的灵活性让我彻底服气了。没有行为树,这种场景的代码逻辑会复杂到让人崩溃。
一句话总结:ROS2 + Nav2 = 模块化 + 灵活性 + 可扩展性。理解了这三大特性,你就掌握了导航系统的设计哲学。
好了,第一章的内容就到这里。导航系统是个大话题,我们后面会一步步拆解每个模块。记住,别急着跑通整个流程,先把每个模块的原理搞明白。磨刀不误砍柴工,这句话在机器人领域尤其适用。