gmapping功能包集成了Rao-Blackwellized粒子滤波算法,为开发者隐去了复杂的内部实现。下图所示的是gmapping功能包的总体框架。
gmapping功能包订阅机器人的深度信息、IMU信息和里程计信息,同时完成一些必要参数的配置,即可创建并输出基于概率的二维栅格地图。 gmapping功能包基于openslam社区的开源SLAM算法。 在ROS的软件源中已经集成了gmapping相关功能包的二进制安装文件,可以使用如下命令进行安装:
<code class="prism language-bash has-numbering">$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> ros-kinetic-gmapping </code>
gmapping功能包向用户开放的接口如下。 话题和服务 gmapping功能包中发布/订阅的话题和提供的服务如表所示。
坐标变换 gmapping功能包提供的坐标变换如表所示。
还有很多参数,这里就不说了。
gmapping节点的配置与运行
接下来的主要任务是使用gmapping功能包实现机器人的SLAM功能。SLAM算法已经在gmapping功能包中实现,我们无需深入理解算法的实现原理,只需关注如何借助其提供的接口实现相应的功能。 把下面的这两个launch文件放在雷达功能包的launch目录下就可以,当然其他也可以~ gmapping.launch 使用gmapping的第一步就是创建一个运行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>
在启动slam_gmapping功能包的同时,需要配置很多gmapping节点的参数。如果你熟悉SLAM算法,这些参数可能对你并不陌生,但是,若你不了解SLAM算法,也不用担心,这些参数都有默认值,大部分时候使用默认值或使用ROS中相似机器人的配置即可,等待SLAM功能实现后再考虑参数优化。 我们需要重点检查两个参数的输入设配置。 1)里程计坐标系的设置,odom_frame参数需要和机器人本身的里程计坐标系一致。 2)激光雷达的话题名,gmapping节点订阅的激光雷达话题名是“/scan”,如果与机器人发布的激光雷达话题名不一致,需要使用进行重映射。 gmapping_demo.launch 创建一个启动gmapping例程gmapping_demo.launch文件,主要代码如下:
<launch>
<include file="$(find my_robot_navigation)/launch/gmapping.launch"/>
<!—— 启动rviz ——>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_robot_navigation)/rviz/gmapping.rviz"/>
</launch>
以上launch文件包含两部分内容。 1)启动之前创建的gmapping节点。 2)启动rviz界面,查看传感器和地图构建的实时信息。 现在,SLAM功能已经就绪! 下面就可以建图了,
如果在建图之前的基础工作没做好,可以看一下我之前的博客,网上也有很多资源。 我弄的时候遇到一个问题,大家遇到可以看一下