gmapping算法教程(1)-----序言

1、创作初衷

先说明一下个人情况,目前硕士在读,研究方向为激光slam。作为一名激光slam研究菜鸡,入门前不可避免的就要研究gmapping算法(大佬除外)。虽然现在已经对运行算法毫无问题,不就是rosrun ××× ××× 或者roslaunch ××× ×××,但是运行完之后呢?你真的明白这个算法了吗?是不是心里面空空如也,啥也不知道。网上当然有许多关于gmapping的解析教程等相关内容,但是我觉得都不太详细或者系统的讲解,很多都是粗枝大叶的略过(也可能有非常详细的内容,只是我没有发现,如果大家发现有这样的内容,请告诉我),让人还是对gmapping算法还是一知半解(可能我太菜了)。

因此,我将按照我的理解为大家一步一步揭开gmapping算法的神秘面纱,搞清楚一个个变量的含义用途,搞明白一行行代码的作用,搞明白一个个函数的功能,努力做到让小白也能理解。

2、致谢

首先,要感谢csdn博主 白茶-清欢,本教程参考他提供的简化版gmapping源码,其地址为 csdn 白茶-清欢: https://blog.csdn.net/zhao_ke_xue/article/details/109712355
其次,要感谢博主 无处不在的小土 ,部分内容参考了他对gmapping的讲解,他的博客地址为 https://gaoyichao.com/Xiaotu/?book=turtlebot&title=index
大家可以去看看他们的文章,相信你会对gmapping算法有更深的理解。

由于需要用到编程知识,所以我希望你在阅读接下来的代码讲解部分之前,已经掌握c/c++的知识,比如:类,结构体,继承,模板,函数重载等。

3、资料获取

大家可以关注我的微信公众号 巧学slam,回复对应关键字,即可获取以下资料
公众号将同步更新教程内容
在这里插入图片描述

由于没有实验器材,因此我使用gazebo搭建了一个阿克曼小车,上面搭载了激光雷达,imu,摄像机等,并且创建了一个简单的室内环境,来模拟真实的房间,使用上面提到的简化版gmapping算法对所建环境建图,如下图所示
在这里插入图片描述小车模型:黄色圆柱体为雷达,橘黄色方块为imu,灰色的是深度相机,绿色的是相机

在这里插入图片描述 随便搭建的房间环境

在这里插入图片描述这是使用简化gmapping算法所构建的地图,效果看着很不好,发生了明显的偏移。我只是控制小车从里到外随便走了一圈,还有算法本身的局限,所以效果不太好。不过,这不是我们目前的研究重点,只要能够实现建图就行,后面有机会的话再对此进行优化,我们的研究重点是该算法如何一步步建成这个图,这个图是怎么来的。

在接下来的教程中,我将带大家搞清楚这个过程。本人也是边学边向大家分享,如果有说错的地方,请大家指出来,大家共同进步,也欢迎你关注我的公众号,后续有更多精彩好文。

<think>好的,我现在需要回答用户关于Gmapping建图算法的问题。首先,我需要回忆一下Gmapping的基本概念和原理。Gmapping是基于Rao-Blackwellized粒子滤波的SLAM算法,主要用于机器人建图。它通过激光雷达数据和里程计信息来构建环境的地图。接下来,我应该考虑它的核心组成部分,比如粒子滤波如何应用在这里,Rao-Blackwellized的具体作用是什么,以及它与其他SLAM算法如ORB-SLAM的区别。 然后,我需要整理Gmapping的工作流程。可能包括初始化粒子、预测步骤、更新权重、重采样等步骤。这里要注意粒子滤波是如何处理机器人位姿的不确定性,并同时构建地图的。还需要提到Gmapping的优缺点,比如计算效率高,但依赖精确的里程计,以及在动态环境中的表现可能不佳。 用户提供的引用中提到了ORB-SLAM,虽然Gmapping主要使用激光雷达,而ORB-SLAM是基于视觉的,但可以对比两者的传感器类型和应用场景。另外,用户可能想知道Gmapping的实际应用和优化方法,比如如何调整粒子数量或处理计算资源限制的问题。 还需要验证一些细节,比如Rao-Blackwellized粒子滤波的具体数学表达,可能需要用LaTeX公式来展示。例如,粒子权重更新的公式,或者地图构建的概率模型。同时,要确保按照用户的要求,行内公式用$...$,独立公式用$$...$$,并且正确使用引用标记。 最后,生成相关问题时要考虑用户可能深入的方向,比如参数调整、与其他算法的比较、实时性优化等。需要确保问题有针对性,能够引导用户进一步学习或解决问题。</think>### Gmapping建图算法详解 Gmapping是一种基于**Rao-Blackwellized粒子滤波**的SLAM(Simultaneous Localization and Mapping)算法,主要用于机器人通过激光雷达(LiDAR)和里程计数据实时构建环境地图。其核心思想是将SLAM问题分解为**机器人位姿估计**和**环境地图构建**两个部分,通过粒子滤波处理位姿的不确定性,同时为每个粒子维护独立的地图。 #### 核心原理 1. **粒子滤波框架** Gmapping使用粒子滤波表示机器人的可能位姿分布。每个粒子包含: - 机器人位姿假设 $(x_t^{(i)}, y_t^{(i)}, \theta_t^{(i)})$ - 对应的环境地图 $m^{(i)}$ - 权重 $w_t^{(i)}$ 表示该粒子的可信度 2. **Rao-Blackwellized分解** 通过条件概率分解将联合后验概率表示为: $$p(x_{1:t}, m | z_{1:t}, u_{1:t}) = p(m | x_{1:t}, z_{1:t}) \cdot p(x_{1:t} | z_{1:t}, u_{1:t})$$ 这使得每个粒子的地图可独立更新,大幅降低计算复杂度[^1]。 3. **激光数据似然计算** 在权重更新阶段,通过对比实际激光扫描数据与粒子地图的匹配程度计算似然值: $$w_t^{(i)} \propto p(z_t | x_t^{(i)}, m_{t-1}^{(i)})$$ #### 算法流程 ```python # 伪代码示意 初始化粒子群(均匀分布) while 新数据到达: for 每个粒子: 根据运动模型预测位姿(里程计积分) 计算激光数据与地图的匹配度,更新权重 重采样(保留高权重粒子,淘汰低权重粒子) 根据粒子群权重融合生成最终地图 ``` #### 特点与局限 **优势** - 实时性高:优化了粒子采样策略,典型配置(30粒子)可在普通CPU上实时运行 - 地图精度高:对静态环境建图效果显著,尤其适合走廊、房间等结构化场景 - 支持增量式建图:可动态扩展未知区域 **局限性** - 依赖精确里程计:里程计误差较大时易导致地图错位 - 动态环境敏感:移动障碍物可能在地图中留下"鬼影" - 计算资源限制:粒子数量与地图分辨率需权衡,高精度需求场景需更多内存 #### 实际应用示例(ROS实现) ```python # 启动Gmapping的ROS节点典型参数配置 roslaunch gmapping slam_gmapping_pr2.launch \ scan_topic:=/lidar_scan \ base_frame:=base_link \ odom_frame:=odom \ map_update_interval:=3.0 \ maxUrange:=8.0 \ particles:=50 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值