1. SLAM与Nav2概述
机器人导航发展史 · SLAM技术简介 · Nav2功能包简介 · 联合导航的价值与挑战
大家好,我是你们这门课的老朋友。做了快十年机器人导航,从ROS1一路折腾到ROS2,踩过的坑比代码行数还多。今天咱们先不急着敲键盘,把SLAM和Nav2这两兄弟的来龙去脉捋清楚。你想想看,要是连它们为什么凑在一起都不明白,后面调参肯定得懵。
1.1 机器人导航发展史
最早做机器人导航,大家基本靠“碰运气”。我记得2012年那会儿,实验室里一台差速底盘,装个超声波就敢说自己在做导航。说白了,那时候就是走一步看一步,撞墙了再回头。
后来有了激光雷达,再后来有了开源算法。从早期的VFH、ND,到后来ROS里集成的move_base,导航才慢慢像个正经系统。我个人习惯把这段历史分成三个阶段:
- 史前时代(2000年前):人工示教、磁条、红外。几乎没有自主性。
- 开源爆发期(2010-2018):ROS + gmapping + move_base 成为标配。但说实话,那时候的导航很脆弱,换个环境就趴窝。
- 现代导航(2019至今):Nav2全面重写,行为树驱动,生命周期管理,加上SLAM从离线变成在线。嗯,这才是能用的东西。
1.2 SLAM技术简介
SLAM,全称是同步定位与建图。你想想看,一个机器人被扔到陌生环境,它不知道自己在哪,也没有地图——这就是SLAM要解决的问题。一边估计自己的位姿,一边把周围环境画成地图。
主流SLAM分两派:激光SLAM 和 视觉SLAM。我个人更偏爱激光SLAM,因为稳定、精度高,尤其在室内。视觉SLAM虽然信息丰富,但光照一变就容易崩。我在一个工厂项目里吃过这个亏——白天好好的,傍晚光线一暗,视觉SLAM直接飞了。后来换成激光+IMU融合,才算稳住。
常用的开源方案:
- Gmapping:经典粒子滤波,适合小场景,计算量大。
- Cartographer:Google出品,图优化,支持闭环,我目前的主力。
- Hector SLAM:不需要里程计,但要求高频激光,无人机上用得挺多。
- ORB-SLAM3:视觉/视觉惯导,学术界宠儿,工程落地需要调参。
🔧 避坑指南 —— 我曾经在长走廊场景里用gmapping,结果地图扭曲得一塌糊涂。后来换成Cartographer并开启闭环优化,走廊笔直如尺。所以啊,选SLAM算法一定要看场景。
1.3 Nav2功能包简介
Nav2是ROS2下的导航框架,说白了就是move_base的全面升级版。但它不是简单的“换皮”,而是重新设计了架构。核心变化有三点:
- 行为树驱动:导航逻辑变成可配置的树,你可以像搭积木一样组合“规划”、“控制”、“恢复”。
- 生命周期管理:每个组件都有明确的状态机(未配置→激活→停用),系统更健壮。
- 插件化:全局规划器、局部规划器、代价地图……全是插件。想换算法?改个参数就行。
Nav2的核心模块包括:
| 模块 | 功能 | 常用插件 |
|---|---|---|
| 全局规划器 | 计算从起点到目标点的全局路径 | NavFn, Smac Planner, A* |
| 局部规划器 | 实时避障,跟踪全局路径 | DWA, TEB, Regulated Pure Pursuit |
| 代价地图 | 融合传感器数据,生成障碍物图层 | Costmap2D, Voxel Layer |
| 行为树 | 控制导航流程,处理异常 | BT Navigator, 自定义行为 |
| 定位模块 | 提供机器人在地图中的位姿 | AMCL, 融合定位 |
我个人觉得,Nav2最大的优点是“可观测”。每个模块都有状态话题,你可以用rqt看到行为树走到哪一步了。调试起来比move_base的黑盒舒服太多。
1.4 联合导航的价值与挑战
为什么要把SLAM和Nav2放在一起讲?因为在实际项目中,建图和导航从来不是割裂的。你建完图,导航要用;导航过程中,地图可能需要更新。这就是联合导航的核心价值。
- 价值1:动态环境适应 —— 仓库里的货架变了,SLAM可以局部更新地图,Nav2立刻感知。
- 价值2:重定位能力 —— 机器人被搬动?SLAM提供全局定位,Nav2不用重新建图。
- 价值3:数据闭环 —— 导航中发现的未知区域,可以反馈给SLAM,完善地图。
· 计算资源:SLAM + 导航同时跑,对CPU/内存压力大。我曾在树莓派上试过,卡成PPT。
· 坐标系统一:SLAM的map坐标系和Nav2的odom坐标系必须严格对齐,否则定位漂移。
· 地图更新策略:什么时候更新?更新多大范围?更新频率?搞不好会震荡。
· 传感器冲突:激光数据同时给SLAM和代价地图,容易产生竞争。
不过别担心,这门课就是来拆解这些挑战的。后面每一章都会针对具体问题给出工程解法。你想想看,要是联合导航那么容易,还要我们这些工程师干嘛?
📌 我的建议: 刚开始学联合导航,别追求一步到位。先单独跑通SLAM建图,再单独跑通Nav2导航,最后才把它们连起来。我见过太多人一上来就想搞融合,结果两个都跑不起来。