[ROS] Gmapping建图算法使用方式,gmmping话题、tf、栅格、参数分析

目录

 

Gmapping

1.安装与使用方式

3.Gmaping话题分析

4.Gmaping TF变换分析

5.Gmapping栅格分析

 6.Gmapping参数分析


Gmapping

Gmapping基于激光雷达进行构图,采用Rao-Blackwellized粒子滤波算法,需要机器人提供里程计信息。

Rao-Blackwellized推导式:https://people.eecs.berkeley.edu/~pabbeel/cs287-fa12/slides/RBPF.pdf

wiki:https://en.wikipedia.org/wiki/Rao%E2%80%93Blackwell_theorem

git:https://github.com/ros-perception/slam_gmapping

 

1.安装与使用方式

安装gmapping

apt install ros-kinetic-gmapping

安装map-server,地图导出工具

apt install ros-kinetic-map-server

功能包准备

gitee地址:https://gitee.com/alen2020/ros_gmapping.git

mbot_description:车体描述文件,urdf

mbot_gazebo:gazebo文件,用于提供虚拟地图

mbot_navigation:gmmping启动包

启动方式

#启动gazebo,创建虚拟地图
$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
#启动gmpping构图
$ roslaunch mbot_navigation gmapping_demo.launch
#启动车体控制程序
$ roslaunch mbot_teleop mbot_teleop.launch 

打开后看到rviz界面,此时可控制小车跑一圈来进行建图

 随着机器人的移动地图逐渐成型

 

 

保存地图

 构图完成后,执行命令保存地图

$ rosrun map_server map_saver -f mymap

保存之后生成两个文件,一个地图pgm,一个yaml文件

  • image: 地图名称
  • resolution: 地图分辨率,最小栅格宽度(单位米)
  • origin: 地图中左下角像素的二维姿态,为(x,y,yaw),偏航为逆时针旋转(偏航= 0表示无旋转)
  • occupied_thresh: 大于此阈值的像素被视为完全占用。
  • free_thresh: 小于此阈值的像素被认为是完全空闲的。
  • negate: 是否应该反转 白/黑   空闲/占用(阈值的解释不受影响)

 

可选参数:

mode:可以有三个值之一:trinary,scale或raw。 Trinary是默认值。

参数解释:

如果像素的COLOR值x在[0,255]范围内,我们应该如何解释这个值?首先,我们将整数x转换为一个浮点数p,转换公式具体取决于yaml中negate标志的定义。

如果negate为0,则p =(255 - x)/ 255.0。这意味着黑色(0)现在具有最高值(1.0)而白色(255)具有最低值(0.0)。

如果negate为1,则p = x / 255.0。这是图像的非标准解释。

  • trinary
  • 标准解释是三元解释,即解释所有值,使输出最终成为三个值之一。

    如果p> occupied_thresh,则输出值100以指示单元格已被占用。

    如果p <free_thresh,则输出值0以指示单元格是空闲的。

    否则,输出-1 a.k.a. 255(作为无符号字符),以指示该单元格未知

  • scale
  • 这将调整上述解释,以允许更多的输出值。

    如前所述,如果p> occupied_thresh,则输出值100,如果p <free_thresh,则输出值0。

    否则,输出99 *(p - free_thresh)/(occupied_thresh - free_thresh)

    这将允许您输出范围为[0,100]的完整渐变值。要输出-1,只需使用png的alpha通道,其中任何透明度都将被解释为未知。

  • raw
  • 此模式将为每个像素输出x,因此输出值为[0,255]。


 

 

3.Gmaping话题分析

Gmapping订阅的传感器话题,如激光类的话题的默认名为scan,建图是一定需要用传感器的数据信息的,若开启的传感器所发布的话题不为scan,需将发布话题remap到scan,或修改Gmapping订阅话题名。gmapping订阅雷达信息后,会通过计算来生成地图,以及计算地图栅格数据,从而判定哪些地方机器人可走与否。

gmapping节点订阅话题

  • tf(话题名),tf/tfMessage(类型,下同),用于激光雷达坐标系,基坐标系,里程计坐标系之间的变换
  • scan,sensor_msgs/LaserScan,激光雷达扫描数据

gmapping节点发布话题

  • map_metadata,nav_mags/MapMetaData,发布地图的Meta数据
  • map,nav_msgs/OccupancyGrid,发布地图栅格数据

gmapping服务维持

  • dynamic_map,nav_msgs/GetMap,获取地图数据

 

4.Gmaping TF变换分析

Gmapping建图的tf变换顺序为,map到_base_link的变换,base_link到里程坐标系的变换,传感器到base_link的变换

必须的TF变换

  • odom → map,地图坐标系与机器人里程计坐标系之间的变换,估计机器人在地图中的位姿
  • base_link →odom,基坐标系与里程计坐标系之间的变换,通常由里程计系统提供
  • <scan fame> → base_link,激光雷达坐标系与基坐标坐标系之间的变换,一般由robot_state_publisher或static_transform_publisher发布

 

5.Gmapping栅格分析

  • 致命障碍:栅格值为254,障碍物与机器人的中心重合,此时机器人必然与障碍物发生碰撞。
  • 内切障碍:栅格值为253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞。
  • 外切障碍:栅格值为252-128,障碍物处于机器人的轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞。
  • 非自由空间:栅格值为128~0,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区,机器人应该尽量避免进入
  • 自由区域:栅格值为0,表示此处没有障碍物,机器人可自由通过
  • 未知区域:栅格值为255,此处还没有被传感器感知到是否有障碍物,随着建图的进行,次数的栅格值将动态变化 

 

 6.Gmapping参数分析

Gmapping建图的好坏,地图质量的高低,定位导航的精确性,CPU性能的占有率,都直接与建图参数挂钩。

各参数含义:https://www.ncnynl.com/archives/201702/1364.html

 <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>

 

参考文章:

1.地图yaml分析,https://blog.csdn.net/wsc820508/article/details/81556620

  • 10
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值