ros slam_gmapping 算法梳理

gampping 建图:

slam_gmapping包也是依赖开源openslam_gmapping库。
源代码网址:
slam_gmapping:https://github.com/ros-perception/slam_gmapping
openslam_gmapping:https://github.com/ros-perception/openslam_gmapping
gmapping 是一种基于粒子滤波的算法,它依赖于里程计数据。

缺点:因为严重依赖里程计数据,因此无法适应不平坦的区域(无人机场景),在大场景中,粒子数较多,特别消耗硬件资源。
因此,适用场景为室内小场景,平坦地面的环境。
源码结构组织:
gmapping 底层计算调用的是openslam-gmapping 里的算法

1、SlamGMapping类
三个构造函数:
(1)、SlamGMapping():
默认构造函数完成map_to_odom 的tf初始,激光话题订阅,变换线程,随机种子,以及初始化。
(2)、SlamGMapping(ros::NodeHandle& nh, ros::NodeHandle& pnh):

(3)、SlamGMapping(long unsigned int seed, long unsigned int max_duration_buffer):
2、初始化函数init():
(1)、生成GridSlamProcesssor对象以及tf广播对象
(2)、设置Gmapping参数
3、启动函数 startLiveSlam(),开启建图
(1)、发布三个话题:
/entropy:机器人姿态
/map:建图数据 用网格数描述,其值为0~255
/map_metadata:地图描述信息
(2)、发布一个服务:
/dynamic_map:获取地图数据,
(3)、订阅
LaserScan
tf转换后的数据
(4)、开启一个线程
不断广播map_to_odom
4、getOdomPose函数
获取机器人的初始位置(一般仅执行一次)
5、LaserCallback
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、initMapper函数 的传入参数为scan
一旦第一次获取到scan数据,就会调用initMapper函数,将slam里的参数传递到 openslam 里 ,设定坐标系,坐标原点,以及采样函数随机种子的初始化等等,里面还调用了 GridSlamProcessor::init 函数,这个初始化了粒子数,子地图大小。

(1).利用监听tf_ 获取激光相对于基座的位姿laser_pose
(2).创建一个激光上方1m的点up(base_frame下 (0,0,lase_pose.z+1)),然后转化为相对于激光的坐标
(3).如果up的z轴坐标和1有相差,则说明激光未安装水平。则初始化失败
(4).获取激光中心位置 ,并将原始激光数据赋值给laser_angles (类型为vector);
(5).初始化激光传感器模型对象RangeSensor ,里程计模型对象OdometrySensor
(6).利用getOdomPose 设置初始激光位姿,设置失败则设为zero(0,0,0)
(7).设置处理器的匹配参数,更新距离、更新频率、采样范围、采样步骤等参数
(8).调用采样一次函数,设置随机种子

7、 addScan函数
addScan(scan, odom_pose)
处理当前的激光数据和里程计位姿。addScan这个函数
要转到pf的核心代码了 ,将调用processScan(reading)。processScan核心函数

(1).如果角度增量为负,反转数据顺序.将scan距离数据放置到double数组中,若出现不合理值,则均置为最大值
(2).生成RangeReading 对象
(3).调用激光数据处理对象即processScan

8、updateMap

(1).生成ScanMatcher对象,matcher初始化包括 ,激光参数,范围参数,产生地图true
(2).取最优粒子,根据权重和weightSum 判断(最大).计算平均值(熵),若大于0,发布
(3).若地图初始为(0,0,0)
(4).得到机器人最优的携带地图路径,重新计算栅格单元的概率.
(5).地图尺寸,可能需要膨胀
(6).确定地图的未知区域,自由区域,障碍.即占据概率大于阈值,为障碍设置为100.概率小于0,为自由区设置为-1.未知为0
(7).发布map话题

SLAM(Simultaneous Localization and Mapping)是一种在机器人、无人机等自主导航系统中同时进行位置估计和环境建模的关键技术。它主要用于解决移动平台在未知环境中如何确定自己的位置以及构建周围环境地图的问题。SLAM算法通常包含两个主要部分:位姿估计(Position and Orientation Estimation)和地图构建(Mapping)。 1. 位姿估计:利用传感器数据(如激光雷达、摄像头或GPS),通过特征匹配、卡尔曼滤波、扩展卡尔曼滤波或粒子滤波等方法,计算出机器人当前的位置和姿态(例如在三维空间中的X、Y、Z坐标和方向)。 2. 地图构建:机器人在移动过程中,不断地更新和融合传感器收集的数据,形成对环境的动态模型,通常是通过建立点云、栅格地图或图结构(如半迪卡尔网格地图或概率图模型)来表示。 实现一个简单的SLAM算法涉及以下步骤: - **初始化**:设定初始估计,如初始位置和地图。 - **传感器数据处理**:读取传感器数据,并进行预处理,如滤波、配准。 - **特征检测与匹配**:识别环境中的特征点并进行匹配,比如在图像中寻找特征点。 - **地图更新**:使用匹配的特征点,更新地图,可能是添加新点、更新点云或优化地图结构。 - **位姿估计**:基于特征匹配或直接定位(如视觉SLAM中的特征匹配或深度学习方法)进行当前位置估计。 - **误差校正**:通过闭环检测(如重访先前观测到的地方)来纠正位姿估计的误差。 - **优化**:通过优化算法(如粒子滤波、图优化)整合所有信息,提高估计和地图的精度。 实现SLAM算法通常需要深入理解传感器工作原理、计算机视觉、机器学习以及优化理论。如果你想深入了解,可以从以下几个方面入手学习: 1. **基础数学**:线性代数、概率论、统计学、优化理论(如卡尔曼滤波、粒子滤波)。 2. **SLAM原理**:特征点检测与匹配、地图构建方法。 3. **编程语言**:Python(常用的SLAM库如ORB-SLAM, LOAM, Gmapping等)或C++(更底层的控制)。 4. **特定领域知识**:视觉SLAM、激光SLAM、多传感器融合等。 5. **开源框架**:研究和实践开源SLAM项目,如Ros(机器人操作系统)上的各种SLAM组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值