SLAM(Simultaneous Localization and Mapping)也称为CML(concurrent mapping and localization),即同时定位与地图构建。 机器人SLAM问题要解决的是:机器人在未知环境中从未知位置开始移动,在移动过程中依据位置估计和地图进行自身定位,在定位基础上同步增量建立地图,而实现自主定位和导航。
1 概述
本包包含了ROS封装了的OpenSlam GMapping,gmapping功能包提供了基于激光的SLAM,在ROS系统中使用slam_gmapping节点表示。 通过该节点用户可以用机器人在移动过程中激光传感器获取的数据创建2D栅格地图。
2 外部文档
有关OpenSlam网站GMapping的介绍请访问这里。
3 slam_gmapping节点
slam_gmapping节点通过消息sensor_msgs/LaserScan获取数据并建立地图。该创建的地图可以通过ROS主题或者服务方式获取。
3.1 节点订阅主题
tf (tf/tfMessage)
用于激光器坐标系,基座坐标系,里程计坐标系之间转换。
scan (sensor_msgs/LaserScan )
激光器扫描数据
3.2 节点发布主题
map_metadata (nav_msgs/MapMetaData)
周期性发布地图metadata数据
map (nav_msgs/OccupancyGrid)
周期性发布地图
~entropy (std_msgs/Float64)
发布机器人姿态分布熵的估计
3.3 服务
dynamic_map (nav_msgs/GetMap)
调用该服务可以获取地图数据
3.4 参数
~inverted_laser (string, default:"false")
- (已经已出在 版本 1.1.1; 用transform data 替换它) 激光器是right side up (scans are ordered CCW),还是 upside down (scans are ordered CW)?
- 处理的扫描数据门限,默认每次处理1个扫描数据(可以设置更大跳过一些扫描数据)
- 机器人基座坐标系
- 地图坐标系
- 里程计坐标系
- 地图更新频率
- 最大可测距离.
- endpoint匹配标准差
- 用于查找对应的kernel size
- 平移优化步长
- 旋转优化步长
- 扫描匹配迭代步数
- 用于扫描匹配概率的激光标准差
- 似然估计为平滑重采样影响使用的gain
- 每次扫描跳过的光束数.
- 为获得好的扫描匹配输出结果,用于避免在大空间范围使用有限距离的激光扫描仪(如5m)出现的jumping pose estimates问题。 当 Scores高达600+,如果出现了该问题可以考虑设定值50。
- 平移时里程误差作为平移函数(rho/rho)
- 平移时的里程误差作为旋转函数 (rho/theta)
- 旋转时的里程误差作为平移函数 (theta/rho)
- 旋转时的里程误差作为旋转函数 (theta/theta)
- 机器人每旋转这么远处理一次扫描
- Process a scan each time the robot rotates this far
- 如果最新扫描处理比更新慢,则处理1次扫描。该值为负数时候关闭基于时间的更新
- 基于重采样门限的Neff
- 滤波器中粒子数目
- 地图初始尺寸
- 地图初始尺寸
- 地图初始尺寸
- 地图初始尺寸
- 地图分辨率
- 用于似然计算的平移采样距离
- 用于似然计算的平移采样步长
- 用于似然计算的角度采样距离
- 用于似然计算的角度采样步长
- 变换发布时间间隔.
- 栅格地图栅格值 (i.e., set to 100 in the resultingsensor_msgs/LaserScan).
传感器最大范围。如果在传感器距离范围内没有障碍物应该在地图上显示为自由空间。 maxUrange < 真实传感器最大距离范围 <= maxRange.
3.5 需要的tf转换
<the frame attached to incoming scans> →base_link
通常是一个固定值,通过 robot_state_publisher, 或者 tf static_transform_publisher.周期性广播
base_link →odom
通常由里程计系统提供
3.6 提供的tf转换
map → odom
地图坐标系中机器人当前姿态估计