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的发布
- map_metadata (nav_msgs/MapMetaData)
- 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) 最小匹配得分,这个参数很重要,它决定了你对激光的一个置信度,越高说明你对激光匹配算法的要求越高,激光的匹配也越容易失败而转去使用里程计数据,而设的太低又会使地图中出现大量噪声,所以需要大家好好调整。
博主的激光数据并不是激光器采集的而是摄像头模拟的,所以看起来比较粗糙。
- ros的navigation之———gmapping应用详解(in ros)
- [置顶] ros的navigation之———gmapping应用详解(in ros)
- ros的navigation之———gmapping应用详解(in ros)
- ros的navigation之———amcl(localization)应用详解
- ros的navigation之———move_base(导航框架)
- (ros/navigation/gmapping)导航/建地图
- (ros/navigation/gmapping)导航/建地图
- (ros/navigation/gmapping)导航/建地图
- ROS系列之初识gmapping
- 我的ROS学习之路——ROS安装
- 我的ROS学习之路—ros相关命令
- ROS系列之初识gmapping(转载)
- 【ROS】移动机器人导航仿真(2)——SLAM(gmapping)
- ROS和SLAM 【gmapping】
- ROS navigation
- ROS Navigation 学习之Clear_Costmap_Recovery
- ROS-Industrial 之 ABB_Driver ——ROS Server(1/3)
- ROS-Industrial 之 ABB_Driver ——ROS Server(2/3)
- MINA心跳协议
- POJ 2085 JAVA
- 简单修改Linux系统文件描述符限制(Too many open files)
- jquery的has、find和filter函数的异同
- HDU 2222Keywords Search (ac自动机)
- ros的navigation之———gmapping应用详解(in ros)
- oracle case when then
- 细说KVO & KVC & NSNotificationCenter那些事
- P-CNN: Pose-based CNN Features for Action Recognition (CNN篇)
- JNI简介
- 右脑开发/开天眼/打通大周天/近视眼康复
- Django网站中文件下载的实现和网页部分打印的实现。
- PL/SQL Beautifier could not parse text
- CentOS6.3搭建lnmp环境