1. SLAM与Nav2概述

机器人导航发展史 · SLAM技术简介 · Nav2功能包简介 · 联合导航的价值与挑战

大家好,我是你们这门课的老朋友。做了快十年机器人导航,从ROS1一路折腾到ROS2,踩过的坑比代码行数还多。今天咱们先不急着敲键盘,把SLAM和Nav2这两兄弟的来龙去脉捋清楚。你想想看,要是连它们为什么凑在一起都不明白,后面调参肯定得懵。

SLAM 与 Nav2 联合导航知识体系 🗺️ SLAM 建图 激光/视觉SLAM 栅格地图 / 拓扑地图 位姿估计 & 闭环 → 提供先验地图 实时定位 (AMCL) 地图更新 / 保存 🧭 Nav2 导航 全局规划 (NavFn / A*) 局部规划 (DWA / TEB) 代价地图 (Costmap2D) 行为树 (BT Navigator) 速度平滑 & 恢复 生命周期管理 ⚡ 联合导航 SLAM建图 → 导航复用 动态更新地图 重定位 & 全局定位 多传感器融合 故障切换 & 安全 仿真 → 实车部署 地图输入 导航反馈 三者协同:建图 → 定位 → 规划 → 控制 → 更新地图

1.1 机器人导航发展史

最早做机器人导航,大家基本靠“碰运气”。我记得2012年那会儿,实验室里一台差速底盘,装个超声波就敢说自己在做导航。说白了,那时候就是走一步看一步,撞墙了再回头。

后来有了激光雷达,再后来有了开源算法。从早期的VFH、ND,到后来ROS里集成的move_base,导航才慢慢像个正经系统。我个人习惯把这段历史分成三个阶段:

  • 史前时代(2000年前):人工示教、磁条、红外。几乎没有自主性。
  • 开源爆发期(2010-2018):ROS + gmapping + move_base 成为标配。但说实话,那时候的导航很脆弱,换个环境就趴窝。
  • 现代导航(2019至今):Nav2全面重写,行为树驱动,生命周期管理,加上SLAM从离线变成在线。嗯,这才是能用的东西。
💡 我的经验: 如果你现在还在用move_base做新项目,我建议你直接上Nav2。不是怀旧不好,而是Nav2的架构更适合产品化。我曾经在一个仓储项目里硬把move_base改得面目全非,后来切到Nav2,两周就搞定了。

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的全面升级版。但它不是简单的“换皮”,而是重新设计了架构。核心变化有三点:

  1. 行为树驱动:导航逻辑变成可配置的树,你可以像搭积木一样组合“规划”、“控制”、“恢复”。
  2. 生命周期管理:每个组件都有明确的状态机(未配置→激活→停用),系统更健壮。
  3. 插件化:全局规划器、局部规划器、代价地图……全是插件。想换算法?改个参数就行。

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导航,最后才把它们连起来。我见过太多人一上来就想搞融合,结果两个都跑不起来。