一、安装Gmapping
sudo apt-get install ros-noetic-gmapping
命令行直接安装编译好的gmapping。
二、gmapping 参数问题及launch文件的修改
1、相关说明
slam_gmapping 节点
- slam_gmapping节点通过消息sensor_msgs/LaserScan获取数据并建立地图。
- 该创建的地图可以通过ROS主题或者服务方式获取。
节点订阅的主题
- tf (tf/tfMessage),用于激光器坐标系,基座坐标系,里程计坐标系之间转换。
- scan (sensor_msgs/LaserScan ) ,激光器扫描数据
节点发布的主题
- map_metadata (nav_msgs/MapMetaData),周期性发布地图metadata数据
- map (nav_msgs/OccupancyGrid),周期性发布地图数据
- ~entropy (std_msgs/Float64),发布机器人姿态分布熵的
重要参数说明:
-
particles (int, default: 30) gmapping算法中的粒子数,因为gmapping使用的是粒子滤波算法,粒子在不断地迭代更新,所以选取一个合适的粒子数可以让算法在保证比较准确的同时有较高的速度。
-
minimumScore (float, default: 0.0) 最小匹配得分,这个参数很重要,它决定了对激光的一个置信度,越高说明对激光匹配算法的要求越高,激光的匹配也越容易失败而转去使用里程计数据,而设的太低又会使地图中出现大量噪声,所以需要权衡调整
2、launch 文件示例
<launch>
<arg name="scan_topic" default="scan" /> //laser的topic名称,与自己的激光的topic相对应
<arg name="base_frame" default="base_link"/> //机器人的坐标系
<arg name="odom_frame" default="odom"/> //世界坐标
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">//启动slam的节点
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="$(arg odom_frame)"/>
<param name="map_update_interval" value="0.01"/> //地图更新的一个间隔,地图更新速度,0.01s
<param name="maxUrange" value="16.0"/> // 雷达的最大扫面距离,设置为雷达扫,扫描的真实距离
<param name="maxRange" value="5.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="3"/>
<param name="lstep" value="0.05"/> //optimize机器人移动的初始值(距离)
<param name="astep" value="0.05"/> //optimize机器人移动的初始值(角度)
<param name="iterations" value="5"/> //icp的迭代次数
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/> //为0,表示所有的激光都处理,尽可能为零,如果计算压力过大,可以改成1
<param name="minimumScore" value="30"/> //很重要,判断scanmatch是否成功的阈值,过高的话会使scanmatch失败,从而影响地图更新速率
<param name="srr" value="0.01"/> //以下四个参数是运动模型的噪声参数
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.05"/> //机器人移动linearUpdate距离,进行scanmatch
<param name="angularUpdate" value="0.0436"/> //机器人选装angularUpdate角度,进行scanmatch
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="8"/> //很重要,粒子个数
<param name="xmin" value="-50.0"/> // map 的初始大小
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
<param name="delta" value="0.05"/> // map resolution
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
运行launch文件即可在rviz界面看到相关地图。
3、保存地图
利用map-server进行保存地图,首先安装map-server。
sudo apt-get install ros-noetic-map-server
运行下面指令进行保存地图。
rosrun map_server map_saver -f ~/mymap // 保存在根目录下