add_executable(slam_gmapping src/slam_gmapping.cpp src/main.cpp) #可执行文件
main -> startLiveSlam -> laserCallback
-> publishLoop
the frame attached to incoming scans → base_link
通常是一个固定值, 由robot_state_publisher或 tf static_transform_publisher.定期广播。
base_link → odom
通常有里程计系统提供(例如,移动机器人的驱动)
map → odom
在地图坐标系中机器人位姿的当前估计。
先讲已知精确位姿(坐标和朝向)的地图创建,机器人位置已知,通过激光雷达扫描到环境特征,即障碍物距离。可通过机器人坐标和朝向以及障碍物距离计算出障碍物的坐标,采用bresenham直线段扫面算法,障碍物所处的栅格标注为occupy,机器人所处的栅格与障碍物所处的栅格之间画直线,直线所到之处都为free。当然每个栅格并不是简单的非0即1,栅格的占据可用概率表示,若某一个栅格在激光束a扫描下标识为occupy,在激光束b扫描下也标识为occupy,那该栅格的占据概率就变大,反之,则变小。这样,机器人所处的环境就可以通过二维栅格地图来表征。
再讲如何在已知地图的情况下采用粒子滤波算法进行精确定位,一般包括以下几个步骤:
(1)给定初始位姿,初始化粒子群,采用高斯分布进行随机采样;
(2)根据运动模型模拟粒子运动;
(3)计算粒子评分 每个粒子的位姿即为假设的机器人位姿,采用bresenham直线段扫面算法,可计算出粒子当前位置与障碍物之间的栅格占据集合,计算出的栅格占据集合与给定的地图进行匹配计算,从而对每个粒子进行评分,选择得分高的粒子作为该时间点的机器人位姿。
(4)粒子群重采样
将评分低的粒子舍弃,将评分高且很接近的粒子都保留下来,并对评分高的粒子进行复制,保持粒子数量不变。