课程导入: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方案。本课程将围绕这两种方案展开源码级解析。
1.3 ROS2中的SLAM建图流程
在ROS2中,一个完整的SLAM建图系统由多个节点通过话题(Topic)和服务(Service)协作完成。下图展示了典型的节点通信拓扑:
- 传感器驱动节点:发布
/scan(激光数据)、/odom(里程计)、/imu(惯性数据)等话题。 - SLAM算法节点:订阅上述话题,实时计算位姿并构建地图,发布
/map(栅格地图)和/map_metadata(地图元数据)。 - TF树:维护
map → odom → base_link → laser的坐标变换关系,是SLAM正确运行的前提。 - 地图保存节点:通过
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检查环境,最后才考虑搜索网络答案。