实现gmapping
ROS开源社区中有很多SLAM算法,可以直接使用或者进行二次开发,其中最为常用和成熟的是gmapping功能包。其他的还有hector–slam和谷歌的cartographer包等等。
gmapping功能包集成了Rao–Blackwellized粒子滤波算法,为开发者隐去了复杂的内部实现【1】。
gmapping融合了深度信息、IMU信息、里程计信息实现在位置环境中的即时定位与地图建模,适用与面积较小的平缓地面封闭环境,这里有篇文章介绍了gmapping与hector–slam和谷歌的cartographer区别与优缺点等。文章链接
接下去我们进行gmapping
一、下载gmapping功能包
打开终端,输入:
sudo apt-get install ros-kinetic-gmapping
二、创建navigation包并配置launch文件
作为一名合格的掉包侠,这里我直接把古月老师的mbot包拿过来并改成自己的了,如下图所示:当然也可以不用拿,也可以直接用mbot包实现自己小车的gmapping,只要路径没问题,话题一致即可。
我们打开tianbot_navigation/launch/gmapping.launch文件,我们看到配置如下:
<launch>
<arg name="scan_topic" default="scan" />
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
<param name="odom_frame" value="odom"/>
<param name="map_update_interval" value="5.0"/>
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxRange" value="5.0"/>
<param name="maxUrange" value="4.5"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<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.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/>
<param name="xmin" value="-1.0"/>
<param name="ymin" value="-1.0"/>
<param name="xmax" value="1.0"/>
<param name="ymax" value="1.0"/>
<param name="delta" value="0.05"/>
<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>
再创建gmapping_demo.launch文件调用上面的gmapping.launch文件并打开rviz,这里直接调用了rviz包中的rviz配置文件
<launch>
<include file="$(find tianbot_navigation)/launch/gmapping.launch"/>
<!-- 启动rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find tianbot_navigation)/rviz/gmapping.rviz"/>
</launch>
三、在gazebo中仿真SLAM
完成上述配置,我们就能在gazebo中仿真SLAM了,在终端中启动gazebo仿真环境和gmapping节点。
roslaunch tianbot_mini_description tianbotmini_laser_gazebo.launch
roslaunch tianbot_navigation gmapping_demo.launch
运行成功后,我们可以在rviz中看到红点深度信息
我们再打开键盘控制节点
roslaunch tianbot_teleop tianbot_teleop.launch
就能用键盘控制小车实现地图构建了。
当小车跑完一圈建完图后,我们打开tianbot_navigation/maps文件夹,并在此文件夹下打开终端,输入
rosrun map_server map_saver
我们发现建好的图自动命名为map.pgm保存在该文件夹下了,map.yaml是一个关于地图配置的文件,包含关联的地图数据文件、地图分辨率、起始位置、地图数据的阈值等配置参数,代码如下:
image: map.pgm
resolution: 0.050000
origin: [-15.400000, -15.400000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196
小结
本节我们实现了键盘控制小车进行gmapping,下一节博主会配置move_base和AMCL,让小车在建好的图中设置路径点并自动壁障导航;最后我们实现小车的自动探索导航。
参考资料
1.古月老师的<<ROS机器人开发实践>>
2.gmapping原理的分析