ROS1 机器人 SLAM 系列(四):Gmapping 算法详解与实战
本文将深入讲解 Gmapping 算法的原理,并通过实战演示如何使用 Gmapping 进行 2D 激光 SLAM 建图。
1. Gmapping 算法简介
1.1 什么是 Gmapping?
Gmapping 是一种基于**粒子滤波(Rao-Blackwellized Particle Filter, RBPF)**的 2D 激光 SLAM 算法。它由 Giorgio Grisetti 等人于 2007 年提出,是 ROS 中最经典、应用最广泛的 SLAM 算法之一。
主要特点:
- 基于粒子滤波的概率框架
- 适用于 2D 激光雷达
- 需要里程计信息
- 实现成熟,稳定可靠
- 适合中小规模室内环境
1.2 算法流程概述
Gmapping 算法流程:
- 里程计数据 -> 运动预测 (Motion Model)
- 粒子集合更新
- 激光雷达数据 -> 扫描匹配 (Scan Matching)
- 观测更新 (Sensor Model)
- 粒子权重计算
- 重采样 (Resample)
- 地图更新
2. 核心算法原理
2.1 粒子滤波基础
粒子滤波是一种序贯蒙特卡洛方法,通过一组带权重的粒子来近似表示后验概率分布。
基本思想:
- 每个粒子代表机器人可能的位姿
- 粒子带有权重,表示该位姿的可信度
- 通过迭代更新粒子来跟踪机器人位姿
数学表示:
P(x_t | z_{1:t}, u_{1:t}) ≈ Σ w_t^{[i]} δ(x_t - x_t^{[i]})
其中:
x_t^{[i]}是第 i 个粒子的位姿w_t^{[i]}是第 i 个粒子的权重- δ 是狄拉克函数
2.2 Rao-Blackwellized 粒子滤波
Gmapping 采用 RBPF,将 SLAM 问题分解为:
- 位姿估计:使用粒子滤波
- 地图构建:在已知位姿的条件下,使用分析方法更新地图
这种分解大大降低了计算复杂度:
P(x_{1:t}, m | z_{1:t}, u_{1:t}) = P(m | x_{1:t}, z_{1:t}) × P(x_{1:t} | z_{1:t}, u_{1:t})
2.3 运动模型
Gmapping 使用概率运动模型预测粒子位置:
// 简化的运动模型
x' = x + Δx + noise_x
y' = y + Δy + noise_y
θ' = θ + Δθ + noise_θ
其中噪声与运动量和参数(srr, srt, str, stt)相关。
2.4 扫描匹配(Scan Matching)
扫描匹配是 Gmapping 的核心技术,用于精确估计机器人位姿。
步骤:
- 获取当前激光扫描数据
- 与粒子携带的局部地图进行匹配
- 找到使匹配度最高的位姿修正
:

