课程导入:ROS2与SLAM建图概述

1.1 为什么机器人需要SLAM?

当一台机器人被放置到陌生环境中时,它面临两个最基本的问题:“我在哪里?”和“周围长什么样?”。如果机器人无法回答这两个问题,那么后续的路径规划、导航避障、任务执行都将无从谈起。SLAM(Simultaneous Localization and Mapping,同步定位与建图)正是解决这一核心矛盾的技术——它让机器人在未知环境中一边移动,一边利用自身传感器数据同时估计自身位姿并构建环境地图。

在ROS2框架下,SLAM不再是实验室里的孤立算法,而是被封装为可复用的功能包、节点和接口。理解ROS2与SLAM的结合方式,是学习机器人建图源码的第一步,也是从“调包跑通”走向“读懂原理”的关键跨越。

学习提示:本课程所有源码均基于ROS2 Humble版本,使用C++与Python双语言实现。建议在学习前完成ROS2基础教程,并具备基本的Linux命令行操作能力。

1.2 SLAM建图的核心原理

SLAM问题的数学本质是一个联合状态估计问题。设机器人位姿为 \(x_{1:T}\),环境地图为 \(m\),传感器观测为 \(z_{1:T}\),控制输入为 \(u_{1:T}\),则SLAM的目标是求解后验概率:

\[ P(x_{1:T}, m \mid z_{1:T}, u_{1:T}) \]

实际工程中,根据传感器类型和算法流派,SLAM被划分为两大技术路线:

  • 激光SLAM(LiDAR-based SLAM):使用2D/3D激光雷达,通过点云配准(如ICP、NDT)估计帧间位姿变换,代表算法有Gmapping、Cartographer、LOAM系列。优点:精度高、不受光照影响;缺点:传感器成本高。
  • 视觉SLAM(Visual SLAM):使用单目/双目/深度相机,通过特征点提取与匹配(ORB、SIFT)或直接法估计位姿,代表算法有ORB-SLAM3、VINS-Mono。优点:传感器成本低、可获取语义信息;缺点:受光照和纹理影响大。

在ROS2的生态中,Gmapping(基于粒子滤波)和Cartographer(基于图优化)是最常用的两种2D激光SLAM方案。本课程将围绕这两种方案展开源码级解析。

ROS2 SLAM 建图技术路线总览 机器人本体 底盘 + 传感器 传感器组 2D激光雷达 IMU / 里程计 深度相机(可选) 数据预处理 点云滤波 畸变校正 坐标变换 Gmapping 粒子滤波 RBPF方法 Cartographer 图优化 子图 + 回环检测 栅格地图 OccupancyGrid /map 话题 位姿估计反馈 (odom → base_link) 图例: 硬件/数据源 预处理 Gmapping Cartographer 地图输出 反馈回路

1.3 ROS2中的SLAM建图流程

在ROS2中,一个完整的SLAM建图系统由多个节点通过话题(Topic)和服务(Service)协作完成。下图展示了典型的节点通信拓扑:

  1. 传感器驱动节点:发布 /scan(激光数据)、/odom(里程计)、/imu(惯性数据)等话题。
  2. SLAM算法节点:订阅上述话题,实时计算位姿并构建地图,发布 /map(栅格地图)和 /map_metadata(地图元数据)。
  3. TF树:维护 map → odom → base_link → laser 的坐标变换关系,是SLAM正确运行的前提。
  4. 地图保存节点:通过 map_saver 将 /map 话题保存为PGM图像和YAML配置文件。
关键话题与接口:
# 订阅的话题
/scan          : sensor_msgs/msg/LaserScan
/odom          : nav_msgs/msg/Odometry
/tf            : tf2_msgs/msg/TFMessage

# 发布的话题
/map           : nav_msgs/msg/OccupancyGrid
/map_metadata  : nav_msgs/msg/MapMetaData

# 服务
/static_map     : nav_msgs/srv/GetMap
/occupancy_grid : nav_msgs/srv/GetMap

1.4 课程学习目标与结构

本课程共30章,从环境搭建到源码剖析,再到自主扩展,层层递进。完成本课程后,你将具备以下能力:

能力维度 具体目标 对应章节
环境搭建 独立完成ROS2 + Gazebo + 机器人模型配置 第2-5章
基础操作 掌握rviz2可视化、TF树查看、bag录制回放 第6-9章
Gmapping源码 逐行理解粒子滤波SLAM核心代码 第10-16章
Cartographer源码 掌握子图匹配、回环检测与图优化实现 第17-24章
工程实战 多场景建图调参、地图保存与格式转换 第25-28章
扩展进阶 融合IMU、自定义SLAM节点、性能评估 第29-30章

1.5 常见误区与学习建议

误区一:只跑通Demo就以为学会了SLAM。 很多初学者在Gazebo中运行 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py 看到地图逐渐构建,便认为掌握了SLAM。实际上,这仅仅是调用了现成功能包,距离理解算法原理和源码实现还相差甚远。本课程要求你打开源码,逐行阅读,亲手修改参数观察效果变化。
误区二:忽略TF树的重要性。 SLAM建图失败时,超过60%的原因是TF树配置错误。请务必学会使用 ros2 run tf2_tools view_frames 和 rviz2 中的TF显示功能,确保 map → odom → base_link → laser 链路完整且频率正常。
学习方法建议:
  • 每学完一章,立即动手修改源码中的关键参数(如粒子数、分辨率、匹配阈值),观察地图质量变化。
  • 准备一个实验笔记本,记录不同参数组合下的地图效果截图,形成自己的调参经验库。
  • 遇到编译或运行错误时,先阅读日志信息,再使用 ros2 doctor 检查环境,最后才考虑搜索网络答案。