ROS学习初探之自建小车模型并进行仿真(五)

实现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原理的分析

猜你喜欢

转载自blog.csdn.net/qq_48427527/article/details/108469208