ros的navigation之———gmapping应用详解(in ros)

来源:互联网 发布:php判断变量是否设置 编辑:程序博客网 时间:2024/04/30 09:36

gmapping是一个比较完善的地图构建开源包,使用激光和里程计的数据来生成二维地图。
博主最近也一直在使用gmapping,在前期着实被它卡了好久,因为好多东西不明白(原谅我是ros小白)。
现在把最近的一些收获分享一下。

一、gmapping应用条件

想使用gmapping包,当然要清楚它的输入输出是什么。
在ros中这些输入输出通常表现为订阅(subscribe)和发布(publish)哪些主题(topic)。

1.gmapping的订阅

gmapping订阅的其实非常简单,只有两种
1. tf (tf/tfMessage)
2. scan (sensor_msgs/LaserScan)
解释详见:ros官方解释,大家最好点到链接里面啊仔细看一下这些message的具体形式以便深入理解。

2.gmapping的发布

  1. map_metadata (nav_msgs/MapMetaData)
  2. map (nav_msgs/OccupancyGrid)
    发布了地图的信息,比例,初始位置等

3.ros坐标系(tf转换)

很多同学发现,我已经让gmapping订阅了激光数据啊,里程计也开了,怎么地图并没有构建成功呢。
原因是ros里面有一个tf转换机制,需要用tf将各种数据的坐标系串联起来,变成一个树形结构(每个节点只能有一个父节点,可以有多个孩子节点),以便后面通讯和显示。

<the frame attached to incoming scans> → base_link
usually a fixed value, broadcast periodically by a robot_state_publisher, or a tf static_transform_publisher.
base_link → odom
usually provided by the odometry system (e.g., the driver for the mobile base)

上面是ros上的一个介绍
其实就是要将激光发布frame跟baselink和odom(里程计帧)连接起来
下面晒出我使用的tf转换代码

static tf::TransformBroadcaster laser_broadcaster;      tf::Transform laser_transform;       laser_transform.setOrigin( tf::Vector3(0.3, 0, 0.05) );        tf::Quaternion q;       q.setRPY(0, 0, 0);       laser_transform.setRotation(q);       laser_broadcaster.sendTransform(tf::StampedTransform(laser_transform, ros::Time::now(), "base_link", "laser"));\\以base_link为父节点,laser为子节点

当然这仅仅是一种方法,还有很多其他的方式,比如在launch文件里面转化。
如果你要想在rviz中看实时地图的话,还要讲odom跟map帧连接起来。
差点忘记,里程计数据要转化成tf版本的里程计数据才可以使用。

这些都做完之后,如果你的里程计和激光数据都正常,那就应该可以将gmapping跑起来了,如果还有问题不妨试一下rosrun tf view_frames 来看一下你的坐标系连接情况。
博主的坐标系图

二、运行gmapping

我总结了运行gmapping的两种方法:

1.基于命令行

rosrun gmapping slam_gmapping scan:=scan _delta:=0.1 _maxUrange:=4.99 _xmin:=-5.0 _ymin:=-5.0 _xmax:=5.0 _ymax:=5.0 _particles:=30 _srr:=0 _srt:=0 _str:=0 _stt:=0.1 _minimumScore:=10000
这段命令scan:=scan是交代了订阅的激光主题,后面都是gmapping的参数设置。

2.基于launch

<launch>  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping">    <remap from="msg_laser4gmapping" to="scan"/>    <param name="delta" value="0.1"/>    <param name="maxUrange" value="4.99"/>       <param name="xmin" value="-5.0"/>       <param name="ymin" value="-5.0"/><param name="xmax" value="5.0"/><param name="ymax" value="5.0"/><param name="particles" value="60"/><param name="srr" value="0"/><param name="srt" value="0"/><param name="str" value="0.05"/><param name="stt" value="0.05"/><param name="minimumScore" value="200"/><param name="map_update_interval" value="1"/><param name="lsigma" value="0.05"/>  </node></launch>

remap也是订阅主题,下面是参数

3.参数解释

gmapping的参数很多,详细的你可以取看我上面给的官方链接,我只讲述一下我觉得比较重要的几个参数。
1. particles (int, default: 30) 这个参数决定gmapping算法中的粒子数,因为gmapping使用的是粒子滤波算法,粒子在不断地迭代更新,所以选取一个合适的粒子数可以让算法在保证比较准确的同时有较高的速度。
2. minimumScore (float, default: 0.0) 最小匹配得分,这个参数很重要,它决定了你对激光的一个置信度,越高说明你对激光匹配算法的要求越高,激光的匹配也越容易失败而转去使用里程计数据,而设的太低又会使地图中出现大量噪声,所以需要大家好好调整。

博主扫的图
博主的激光数据并不是激光器采集的而是摄像头模拟的,所以看起来比较粗糙。

3 0