简介

Gmapping是一个基于2D激光雷达使用RBPF(Rao-Blackwellized Particle Filters)算法完成二维栅格地图构建的SLAM算法。

优点

gmapping可以实时构建室内环境地图,在小场景中计算量少,且地图精度较高,对激光雷达扫描频率要求较低。

缺点

随着环境的增大,构建地图所需的内存和计算量就会变得巨大,所以gmapping不适合大场景构图。一个直观的感受是,对于200x200米的范围,如果栅格分辨率是5cm,每个栅格占用一个字节内存,那么每个粒子携带的地图都要16M的内存,如果是100粒子就是1.6G内存。

算法安装

sudo apt-get install ros-kinetic-gmapping       #根据您ROS的版本,自行更改即可

发布话题与服务

名称 类型 描述
TOPIC tf tf/tfMessage 用于激光雷达坐标系,基座标系,里程计坐标系之间的变换
订阅 scan sensor_msgs/LaserScan 激光雷达扫描数据
TOPIC map_metadata nav_msgs/MapMetaData 发布地图Meta数据
发布 map nav_msgs/OccupacyGrid 发布地图栅格数据
~entropy std_msgs/Float64 发布机器人位姿分布熵的估计
Service dynamic_map std_msgs/GetMap 获取地图数据

gmapping需要订阅机器人关节变换话题/tf激光雷达扫描数据话题/scan,将会发布栅格地图话题/map。 关于/tf又分为两个部分,gmapping功能包中的TF变换如下图所示:

必需的TF变换 TF变换 描述
必需的TF变换 scan fram --> base_link 激光雷达与基座标系之间的变换,一般由robot_state_publisher或static_transform_publisher发布
base_link --> odom 基座标系与里程计坐标系之间的变换,一般由里程计节点发布
发布的TF变换 map --> odom 地图坐标系与机器人里程计坐标系之间的变换,估计机器人在地图中的位姿

gmapping算法的必备条件,/tf、/odom、/scan,就可以通过算法发布/map了。

更改参数

启动算法的gmapping.launch文件如下,这里需要根据各自的情况,对下面文件中注释的部分进行更改,更改内容根据自己的情况。 该启动的launch文件放在任意一个功能包的launch的文件夹中都可以,也可以新建一个功能包,因为按照二进制方式安装gmapping算法是没有这个文件的。

<launch>
    <arg name="scan_topic" default="scan" />                  <!-- 根据自己发布scan名称进行修改 -->
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
        <param name="base_frame" value="base_footprint"/>     <!-- 根据自己的基座标系名称进行修改 -->
        <param name="odom_frame" value="odom"/>               <!-- 根据自己的里程计坐标系名称进行修改 -->
        <param name="map_update_interval" value="4.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>

启动算法

前提是已经启动了小车及传感器,发布了tf、odom、scan

roslaunch robot_test gmapping.launch      #这里的gmapping.launch放在robot_test功能包下

gmapping算法使用与详细解释)

最后修改:2023 年 11 月 10 日
如果觉得我的文章对你有用,请随意赞赏