在前一节中,简单介绍了移动机器人的3D建模,并在gazebo三维仿真环境中实现了简单的移动。这一节采用gmapping包实现机器人的SLAM(同时定位与地图建立)。使用上一节构建的机器人3D模型,在gazebo三维仿真环境中移动,并为此环境构建一个二维地图。


概述

移动机器人在未知的环境中进行导航时,接收来自里程计,传感器流的信息,构建工作环境的地图模型,然后再根据地图和目标位姿信息来导航、定位。

ROS导航功能包集是ROS系统最强大的特性之一,可以实现机器人的自主导航和运动,但只能用于双轮差分驱动或者完全轮驱动的机器人。导航功能包集假定机器人以特定方式配置以便运行。下图显示了此配置的概述。白色组件是ROS提供的导航所必需的组件,灰色组件是ROS提供的可选组件,你要做的是为每个机器人平台创建蓝色组件。详见http://wiki.ros.org/navigation/Tutorials/RobotSetup

以下是你需要做的:
1. 让机器人发布关于所有关节和传感器位置关系的信息(tf);
2. 让机器人发送线速度和角速度信息(odom);
3. 接收激光雷达的信息来实现完成地图构建和定位(sensor sources);
4. 创建机器人的基础控制器,负责将线速度和转向角度信息发布给硬件平台(base controller)。

gmapping包采用了粒子滤波算法,提供基于激光的SLAM(同时定位和地图建立),节点名为slam_gmapping。使用slam_gmapping,可以从移动机器人收集的激光和位姿关系数据创建二维栅格地图。即订阅了tf (tf/tfMessage) 和scan (sensor_msgs/LaserScan) 主题,发布map_metadata (nav_msgs/MapMetaData) 和map (nav_msgs/OccupancyGrid) 主题。详见http://wiki.ros.org/gmapping


使用gazebo创建变换(tf)

tf是ROS中的一个功能包,它可以让用户随着时间的推移跟踪多个坐标系。tf维护在时间上缓冲的坐标变换树结构中的坐标系之间的关系,并且使得用户在任何时间点可以任意转换两个坐标系之间的点和向量。在一个机器人系统中,需要用tf将各种数据的坐标系串联起来,变成一个树形结构(每个节点只能有一个父节点,可以有多个孩子节点),以便后面通讯和显示。

在上一节机器人的3D建模中,已经配置了机器人本体各组件之间的坐标变换关系,它们之间的变换都为静态变换。在本节中,需要配置odom到机器人基座标系base_footprint之间的坐标变换关系,此变换为动态变化。odom是一个很好的固定坐标系,在机器人的起点位姿上,机器人的姿态相对odom而言是随时间经常变动的。在gazebo环境中可以使用Gazebo 插件(plugins)来配置odom到base_footprint的变换。

Gazebo 插件可以为URDF模型提供更强大的功能,并且可以为传感器输出和电机输出绑定ROS消息和服务。插件可以添加到URDF的任何主要元素 —robot,link或joint,具体取决于插件的范围和目的。要完成向URDF中的特定元素添加插件,必须在gazebo元素中包含plugin标记。
以下是URDF中robots元素的插件示例:

<gazebo  (reference =“x”)><plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">... plugin parameters ...</plugin>
</gazebo>

在上面的例子中,插件被添加到robot元素中,因为与其他gazebo元素和属性类似,如果没有指定reference =“x”(link、joint等),则假设reference是整个robot。name为插件的名称,filename为插件所适用的共享库。详见http://gazebosim.org/tutorials?tut=ros_gzplugins

在上一节中构建的机器人模型为滑移转向(skid-steer)机器人,所以我在模型文件中添加了skid_steer_drive_controller插件,代码如下:

<gazebo><plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so"><alwaysOn>true</alwaysOn><updateRate>100.0</updateRate><robotNamespace>/</robotNamespace><leftFrontJoint>base_to_wheel1</leftFrontJoint><rightFrontJoint>base_to_wheel3</rightFrontJoint><leftRearJoint>base_to_wheel2</leftRearJoint><rightRearJoint>base_to_wheel4</rightRearJoint><wheelSeparation>0.2</wheelSeparation><wheelDiameter>0.1</wheelDiameter><torque>2</torque><commandTopic>cmd_vel</commandTopic><odometryTopic>odom</odometryTopic><odometryFrame>odom</odometryFrame><robotBaseFrame>base_footprint</robotBaseFrame><broadcastTF>1</broadcastTF></plugin>
</gazebo>

其中torque设置轮子的扭矩力,wheelSeparation设置左右轮子之间的距离,wheelDiameter设置轮子直径,commandTopic设置订阅的控制指令主题,odometryTopic设置机器人发布的里程计主题,odometryFrame设置odom坐标系,robotBaseFrame设置机器人基坐标系,broadcastTF设置是否发布tf变换。该插件的源码见
http://docs.ros.org/hydro/api/gazebo_plugins/html/gazebo__ros__skid__steer__drive_8cpp_source.html

设置完成后,可以在节点运行的时候通过$ rosrun tf view_frames来查看tf坐标变换树的结构。
所生成的tf坐标变换树结构如下图所示:

友情提醒:坚决、千万、绝对不要在已经加载你的机器人模型的情况下保存gazebo环境,不要问我是怎么知道的!


仿真实现

首先启动机器人模型:

<launch><!-- these are the arguments you can pass this launch file, for example paused:=true --><arg name="paused" default="true"/><arg name="use_sim_time" default="true"/><arg name="gui" default="true"/><arg name="headless" default="false"/><arg name="debug" default="false"/><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find nav_sim)/urdf/wall.world"/><arg name="use_sim_time" value="$(arg use_sim_time)"/><arg name="debug" value="$(arg debug)" /><arg name="gui" value="$(arg gui)" /></include><!-- Load the URDF into the ROS Parameter Server --><arg name="model" default="$(find nav_sim)/urdf/myrobot.xacro" /><param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" /><!-- Run a python script to send a service call the gazebo_ros to spawn a URDF robot --><node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"args="-urdf -model robot -param robot_description -z 0.00"/> <node name="rviz" pkg="rviz" type="rviz" args="-d $(find nav_sim)/urdf/nav.rviz"/><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/></launch>

接着启动gmapping节点:

<launch><node name="slam_gmapping" pkg="gmapping" type="slam_gmapping" ><remap  from="scan" to="/robot/laser/scan"/><param name="base_link" value="base_footprint"/></node></launch>

然后启动键盘控制节点移动机器人使其扫描周围环境并建图:

$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

最后,使用map_server保存地图:

$ rosrun map_server map_saver -f map

生成的地图如下图所示:

整个建图过程的视频见:http://v.youku.com/v_show/id_XMTg2NDkxNDAwOA==.html

【ROS】移动机器人导航仿真(2)——SLAM(gmapping)相关推荐

  1. move_base学习(一)之双激光差动式移动机器人导航仿真

    使用move_base实现双激光差动式移动机器人导航仿真 一.引言 二.加载机器人模型 三.双激光融合 四.gmaping建图 五.move_base导航部分 六.参考文献 一.引言   本文主要对m ...

  2. ROS学习笔记08、机器人导航仿真(slam、map_server、amcl、move_base与导航消息介绍)

    文章目录 前言 一.导航概述 1.1.导航模块 1.2.导航之坐标系 二.导航实现 准备工作(安装导航包和新建工程包) 2.1.SLAM建图 2.1.1.认识gmapping 2.1.2.实操 2.2 ...

  3. ROS机器人导航仿真(kinetic版本)

    准备工作: ubuntu 16.04系统;ROS kinetic版本;ROS包turtlebot,导航包rbx1,模拟器arbotix,可视化rviz 1.安装ubuntu 16.04系统与安装ROS ...

  4. 机器人导航(仿真)(一)——SLAM建图

    导航实现01_SLAM建图 参考视频:[奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程_哔哩哔哩_bilibili 参考文档:http://www.autolabor.com ...

  5. 古月 ROS移动机器人实战 二维slam地图构建 笔记

    二维slam地图构建 Gmapping功能包 一种粒子滤波算法,将定位与建图分离,先进行定位.再进行建图,适合构建小场景环境下的地图信息. 需要机器人提供里程计信息作为先验知识. 虽然可以降低对激光雷 ...

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

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

  7. ROS机器人SLAM学习:自建虚拟世界与Gazebo定位与导航仿真

    gazebo 中能仿真真实世界,包括很多物理属性,比如惯性,碰撞等.对于没有真实机器人和场地条件的情况下,作用十分强大. 在本篇文章中,我会介绍如何在Gazebo中实现小车的定位与导航仿真,我会将所用 ...

  8. 在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第十二章 机器人导航(仿真)

    系列文章目录 第一章 ROS空间创建.helloworld的实现.开启多个节点 第二章 话题通信 第三章 服务通信 第四章 参数服务器 第五章 常用指令 第六章 通信机制实操 第七章 ROS通信机制进 ...

  9. turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程

    turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图--全过程 ROS中的地图 使用rosbag记录数据 rosbag record rosbag play ...

最新文章

  1. gevent.joinall()开启协程
  2. cf 559a **
  3. java 释放指针_C库释放来自Rust的指针
  4. excel 2010 group and subtotal function
  5. 目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
  6. linux中权限的介绍,Linux文件权限的入门介绍
  7. TCP/IP协议详解内容总结(怒喷一口老血)
  8. Flash知识点总结
  9. c#ftp操作全解:创建删除目录,上传下载文件,删除移动文件,文件改名,文件目录查询
  10. java se 6 mac_Mac OS X “打开xx软件, 你需要一个Java SE 6运行环境”问题解决
  11. (转)机器学习算法比较
  12. linux 中文件的操作
  13. 独立个人项目开发心得 - 任务切分、挑战性、实用性和半途而废
  14. java bitset javadoc,BitSet的源码研究
  15. 简单说说路由器和交换机的区别
  16. ecu的c语言编程,ecu中的程序是如何编写的
  17. 一段Js代码开启任意网站的匿名在线聊天室
  18. matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...
  19. 卫生事业单位计算机科学与技术,卫生事业单位考试-计算机科学与技术的知识点.doc...
  20. 曾经的大学德育论文,致敬天津理工大学

热门文章

  1. Linux各发行版的前世今生
  2. 初中物理公式总结大全(pdf可下载)
  3. 这一招可以让pdf整篇自动翻译,pdf翻译的方法分享
  4. [含论文+源码等]微信小程序电影购票+后台管理系统源码
  5. python库的下载安装_Python库的安装
  6. Indigenous students at U of T honoured for efforts in language revitalization, health equity
  7. 怎样用ecognition软件实现同一幅图片上的不同区域的多尺度分割
  8. html缓存ios,iOS-H5离线包本地缓存CCCandyWebCache
  9. squid+icap测试配置
  10. jquery传输文件到后端,后端处理数据。