用Gmapping构建一张地图

  • Gmapping功能包介绍
  • 使用Gmapping功能包的一些准备
    • /tf
      • 雷达和机器人基座标
      • 里程计
    • /scan
  • 使用Gmmaping功能包
  • 得到的地图

Gmapping功能包介绍

参见wiki官网 Gmapping功能包.其中包括了Gmapping功能包订阅发布的话题,参数等。

使用Gmapping功能包的一些准备

根据官网介绍,Gmapping订阅了两个话题:/tf/scan

/tf

tf指的是坐标变换,就是将机器人各组件的相对位置关系表示出来,对于Gmapping而言,它需要三个tf:雷达机器人基坐标里程计

雷达和机器人基座标

对于雷达机器人基座标,我们可以有两种发布的方法。
第一种:通过urdf建立机器人模型,然后写一个launch文件将模型文件载入并发布机器人的状态信息给tf。urdf是一种机器人建模的一种方法,具体参见urdf wiki官网
launch文件示例如下:

<?xml version="1.0"?>
<launch><!--param name="/use_sim_time" value="true"/ --><arg name="model" /><!-- 加载机器人模型参数 --><param name="robot_description" command="$(find xacro)/xacro --inorder $(find robot_description)/src/urdf/robot_model.xacro" /><!-- 设置GUI参数,显示关节控制插件 --><param name="use_gui" value="false"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态  --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><!-- 运行robot_state_publisher节点,发布tf  --><node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /><!-- 运行rviz可视化界面 --><node name="rviz" pkg="rviz" type="rviz"  />
</launch>

第二种:调用tf的API,编写代码发布tf。具体参见 tf API wiki官网。

里程计

里程计发布的是base_link → odom坐标变换,其中base_link是上面所说的机器人基坐标,odom是世界坐标系中固定的一个坐标。里程计反映的是机器人行驶的轨迹,本质也是坐标变换,这个坐标变换通常是由机器人的速度与时间计算出来的(也有视觉里程计等,原理完全不一样),所以里程计的发布实际上是不断地读取速度和时间信息,计算成坐标填充到ROS的消息里。
时间信息可以由ROS帮我们计算,而速度信息需要结合机器人的实际情况,通常由电机编码器将速度反馈给电机驱动器的控制板(也就是所谓的下位机),然后由控制板发布给上位机。
以Arduino Uno作为控制板为例,发布里程计的示例代码如下:

/* * rosserial Planar Odometry Example*/#include <ros.h>
#include <ros/time.h>
#include <tf/tf.h>
#include <tf/transform_broadcaster.h>ros::NodeHandle  nh;geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;double x = 1.0;
double y = 0.0;
double theta = 1.57;char base_link[] = "/base_link";
char odom[] = "/odom";void setup()
{nh.initNode();broadcaster.init(nh);
}void loop()
{  // drive in a circledouble dx = 0.2;double dtheta = 0.18;x += cos(theta)*dx*0.1;y += sin(theta)*dx*0.1;theta += dtheta*0.1;if(theta > 3.14)theta=-3.14;// tf odom->base_linkt.header.frame_id = odom;t.child_frame_id = base_link;t.transform.translation.x = x;t.transform.translation.y = y;t.transform.rotation = tf::createQuaternionFromYaw(theta);t.header.stamp = nh.now();broadcaster.sendTransform(t);nh.spinOnce();delay(10);
}

/scan

/scan中发布的是激光雷达传感器的信息,这些信息用于描述周围障碍物。
该话题的发布需要结合激光雷达本身的数据来发布,消息格式参见wiki官网
发布话题的代码示例如下

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>int main(int argc, char** argv){ros::init(argc, argv, "laser_scan_publisher");ros::NodeHandle n;ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>("scan", 50);//A real application would pull the following data from their laser driverunsigned int num_readings = 100;double laser_frequency = 40;double ranges[num_readings];double intensities[num_readings];int count = 0;ros::Rate r(1.0);while(n.ok()){//generate some fake data for our laser scan,//Populate the dummy laser data with values that increase by one every second.for(unsigned int i = 0; i < num_readings; ++i){ranges[i] = count;intensities[i] = 100 + count;}ros::Time scan_time = ros::Time::now();//populate the LaserScan message,//Create a scan_msgs::LaserScan message and fill it with the data//that we've generated in preparation to send it over the wire.sensor_msgs::LaserScan scan;scan.header.stamp = scan_time;scan.header.frame_id = "laser_frame";scan.angle_min = -1.57;scan.angle_max = 1.57;scan.angle_increment = 3.14 / num_readings;scan.time_increment = (1 / laser_frequency) / (num_readings);scan.range_min = 0.0;scan.range_max = 100.0;scan.ranges.resize(num_readings);scan.intensities.resize(num_readings);for(unsigned int i = 0; i < num_readings; ++i){scan.ranges[i] = ranges[i];scan.intensities[i] = intensities[i];}//Publish the message over ROSscan_pub.publish(scan);++count;r.sleep();}
}

使用Gmmaping功能包

/tf/scan话题都准备好后,我们就可以用一个launch文件来使用Gmapping功能包了。
launch文件示例如下:

<?xml version="1.0"?>
<launch><!--Run robot model -- ><include file="$(find robot_description)/launch/display.launch" /><!--Publish odom--><node name="odom_pub" pkg="odom_pub"  type="odom_pub_node"><!--Run lidar--><node name="lidar"   pkg="lidar"  type="lidar_node"><!--Run Gmapping--><node name="slam_gmapping" pkg="gmapping" type="slam_gmapping" output="screen"><remap from="scan" to="/scan"/></node>
</launch>

得到的地图

运行Gmapping后,进入rviz可以看到建图的实时进程。等地图建好后,可以用map_server功能包来保存地图,使用map_server的命令如下:

rosrun map_server map_saver map:=/<Map Topic> -f PATH_TO_YOUR_FILE/mymap

保存完成后得到如下所示的一张栅格图

ROS 导航——SLAM之用Gmapping构建一张地图相关推荐

  1. 机器人学习--ROS/AMCL实现初始化粒子撒满整张地图和分步收敛

    问题描述: ROS 移动机器人建图后,用Navigation导航包执行 起始位置到 目标位置的路径规划和导航行走的过程中. 机器人导航初始化的时候,刚加载地图,如何让移动机器人执行 全局定位 glob ...

  2. SLAM学习:Gmapping建图下地图变形更新速度慢问题

    一.问题描述 首先,我在用Gmapping建图的时候发现扫描出来的地图更新速度很慢然后还有就是地图的完整性不高容易变形扭曲,我们在一般在路径规划前需要用适当的建图算法把地图创建出来然后保存方可进行全局 ...

  3. ROS笔记(22) Gmapping

    ROS笔记(22) Gmapping 1. Gmapping 2. slam_gmapping节点 3. gmapping的配置 4. gmapping的启动 5. SLAM仿真 1. Gmappin ...

  4. ROS机器人SLAM学习:Gazebo定位与导航仿真

    ROS机器人SLAM学习:Gazebo定位与导航仿真 一. 在 gazebo 中构建一个用于建图和导航的虚拟环境,可以使用 Building Editor工具创建,也可以使用其他功能包中已有的虚拟环境 ...

  5. ros 雷达 slam 导航 文件分析

    ros 雷达 slam 导航 文件分析 robot_slam_laser.launch robot_lidar.launch lidar.launch raplidar.launch karto.la ...

  6. ROS下用gmapping 构建实验室地图的实现

    ROS下用gmapping 来实现构建实验室地图 由于move_base类已经配置好,可用了,所以就来尝试用gmapping构建地图了,看看效果.下面来说下具体的过程. Gmapping 构建地图需要 ...

  7. ROS 导航安装及实现(二十二)

    目录 简介 准备工作 导航实现01_SLAM建图 1.gmapping简介 2.gmapping节点说明 2.1订阅的Topic 2.2发布的Topic 2.3服务 2.4参数 2.5所需的坐标变换 ...

  8. ROS入门 SLAM

    这一部分主要对应网课里面的第九章,介绍了一些ROS中为SLAM准备的包和一些基础的SLAM应用. 一.地图 暑假的时候看过一些SLAM的基础介绍,SLAM无非就是定位加上建图.建图的过程,可以在RVi ...

  9. ROS系统SLAM基础学习:gazebo仿真机器人自主导航

    ROS系统SLAM基础学习:gazebo仿真机器人自主导航 move_base节点配置 amcl节点配置 导航仿真 导航SLAM仿真 自主探索SLAM仿真 自主导航:避障 遇到的问题及解决方法和总结 ...

最新文章

  1. windows10下编译dllib报错: ERROR: Failed building wheel for dlib
  2. 【非公开】机顶盒相关
  3. python 列表操作详解,Python列表解析操作实例总结
  4. linux fb设备驱动,linux设备驱动归纳总结(八):1.总线、设备和驱动
  5. P2272 [ZJOI2007]最大半连通子图
  6. NCH ClickCharts(流程图绘制软件)v4.10 汉化免费版
  7. 如何破解加密PDF文档
  8. Android 屏幕旋转流程分析
  9. PHP通过PHPMailer类库实现QQ邮箱发送方法
  10. lineageos信号叉号_安卓手机刷lineageOS后电信卡不能通话解决办法
  11. react中的keep-alive功能
  12. 跟老杜手撕Spring6教程(三)Spring的入门程序
  13. 测试环境Hosts设置
  14. 计算机病毒金山毒霸,金山毒霸网络版成为计算机病毒的客星
  15. 用python编写密码安全性_用大数据python保护密码
  16. 一文给你讲透 ARP 协议原理!
  17. 关于xxl-job-admin使用中指定账号密码时的坑
  18. 黑苹果N卡NVIDIA Web驱动合集,随时更新!
  19. String to jpg
  20. 排查处理Failed to find latest MicroserviceVersionMeta, appId=chw-apaas, microserviceName=fileservice

热门文章

  1. java 卡表_关于JVM的卡表和写屏障
  2. 腕部肌电图对肌肉疲劳回归分析的验证
  3. #来陀螺问答,问大V#矿业专场优质问答精选
  4. 【算法】LeetCode:字符串篇
  5. 【‘Integer(int)‘ 已经过时了】
  6. 中学教学常用计算机软件,中学计算机教学法
  7. Gurobi过期了怎么办
  8. Atlas 200 DK 系列--初级篇--MindStudio常见操作
  9. MFC多人在线聊天室
  10. 传智黑马武汉校区学生总结 史上最强500G JAVA全套视频教程网盘