参考链接:https://github.com/bunchofcoders/basic_bocbot


本文为使用ROS 2和Gazebo9搭建仿真机器人详细指南。

确保已按如下说明安装ROS和Gazebo:

  • ROS 2安装。 二进制软件包的安装足以满足该项目的需求,但是如果感兴趣,还可以选择从源代码搭建Dashing或Eloquent均可。
  • Gazebo安装。推荐9+以上版本。

尽管此项目基于Ubuntu 18.04说明,但如果是其他安装了ROS 2和Gazebo 9的系统,这些说明同样适用,比如Windows 10、Mac OS等,同时通过学习和实践,将会了解到它们的API、命令和过程大致相同。

本文假定已经具备以下基础:

  • 具有C++和Python编程基础知识的开发人员,或者
  • 已经知道ROS 1并期望转移到ROS 2开发,可以直接跳到下面的机器人

目录

  • 介绍
    • 机器人
    • ROS
    • Gazebo
  • 机器人
  • 设置

介绍

为什么要学习机器人技术?

机器人应用已经越来越普遍。除了在制造过程中很常见之外,近年来,儿童玩具、智能吸尘器、自动驾驶汽车、无人驾驶飞机等不胜枚举。这些只是几个例子,将来还会有更多例子。不感兴趣,不愿学习,没关系,它们一样会进入到你的生活中,无处不在……

怎么呢?

在搭建实际的机器人之前,可能需要先使用模拟器来测试新想法。对模拟机器人满意之后,就可以继续搭建实际的机器人了。

ROS提供了搭建机器人各种组件并在它们之间建立安全通信的框架,Gazebo提供了仿真工具,可以使用实际场景测试算法和机器人设计。

本文能学到什么?

学习如何将ROS2和Gazebo9组合在一起,创建具有四轮(差动模型)、摄像头和激光扫描传感器的机器人,并在模拟的环境中测试其操作。

先熟悉一些基本概念。

机器人

无论要搭建哪种类型的机器人,机器人都需要执行感知决策行动的三个步骤,属于输入-控制-输出这类结构。

  • 感知

就像我们人类通过眼睛、耳朵、鼻子和触摸感知或感知周围的环境一样,机器人使用一个或多个传感器感知周围的环境。可能已经知道的一些传感器如雷达、激光扫描、照相机、激光雷达、温度传感器、声纳、化学检测传感器等。

  • 决策

根据来自传感器的输入和机器人的当前状态,机器人可以执行一些决策。决策可以简单地回答是或否的天气问题,也可以简单地在不同星球上未知地形的路径上行驶。

  • 行动

机器人可以根据使用输入做出的决定执行各种动作。例如,从一个地方移动到另一个地方,移动机器人手臂等各种部件,将消息发送到另一机器人,加快、减速、停止等。

本文中将了解ROS2如何提供执行这三个基本过程的框架

ROS

机器人操作系统不是如Linux或Windows那样的操作系统,而是一个位于操作系统之上的框架,可为开发和运行机器人的各种组件提供便利。

就像Microsoft基础类(MFC)是用于Windows中C++开发和运行桌面应用程序的框架一样,ASP.Net也是用于开发和运行网站的框架。同样,ROS是一个框架,并提供使用C++和Python等开发和运行机器人的工具和库。

ROS 2是ROS 1的下一个版本。大多数概念在ROS 2中仍然相同,与ROS 1保持一致,但是各个组件之间的设计和通信有了显着改进。ROS 2使用DDS。

学习ROS 1会有所帮助,但不是必需的。由于一些概念文档仍在ROS 1维基中。如下是一些了解ROS的有用链接。

  1. ROS 1教程
  2. ROS 2教程
  3. 节点概念
  4. ROS 2中的节点
  5. 主题
  6. 服务端/客户端
  7. 发布器/订阅器
  8. 服务质量
  9. 编译系统colcon

Gazebo

Gazebo是ROS使用最广泛的模拟器。在线上有许多非常好的教程。如下是一些入门指南。

  • 教程:http://gazebosim.org/tutorials
  • ROS:https://subscription.packtpub.com/book/hardware_and_creative/9781783554713/1/ch01lvl1sec11/simulators-of-ros

假设现在已经熟悉ROS和Gazebo,那么将它们融合应用。

机器人

目标是根据从传感器收集的输入执行一些操作(驱动机器人)。将按照以下步骤进行操作。

1 在Gazebo模拟器中搭建简单的室内环境(请参见下图)

2 搭建机器人(mobot)

  • 底盘(蓝色)
  • 4个轮子(灰色)
  • 相机(红色)
  • 激光雷达(黑色)

3 编写C++节点处理相机和激光雷达扫描输入

4 编写C++节点将命令发送到轮子以驱动机器人

机器人

世界环境 (室内)


设置:

具体步骤如下。

打开一个新的终端并更新ROS 2安装配置,这样ROS2命令可以使用。

relaybot@TPS2:~$ source /opt/ros/dashing/setup.bash

relaybot@TPS2:~$ echo $ROS_DISTRO

dashing

创建工作区

relaybot@TPS2:~$ mkdir -p mobot/src

relaybot@TPS2:~$ cd mobot/src/

1.在Gazebo模拟器中搭建室内环境

创建mobot包

relaybot@TPS2:~/mobot/src$ ros2 pkg create --build-type ament_cmake mobot

going to create a new package

package name: mobot

destination directory: /home/relaybot/mobot/src

package format: 3

version: 0.0.0

description: TODO: Package description

maintainer: ['relaybot <zhangrelay@sohu.com>']

licenses: ['TODO: License declaration']

build type: ament_cmake

dependencies: []

creating folder ./mobot

creating ./mobot/package.xml

creating source and include folder

creating folder ./mobot/src

creating folder ./mobot/include/mobot

creating ./mobot/CMakeLists.txt

relaybot@TPS2:~/mobot/src$ cd mobot/

relaybot@TPS2:~/mobot/src/mobot$

为室内环境的world文件新建文件夹:

relaybot@TPS2:~/mobot/src/mobot$ mkdir worlds

relaybot@TPS2:~/mobot/src/mobot$ cd worlds/

relaybot@TPS2:~/mobot/src/mobot/worlds$ gedit mobot_room.world

Gazebo中的世界文件包含模拟环境中的所有对象。这些对象是机器人模型、环境、照明、传感器和其他对象等。

Gazebo使用SDF xml文件格式来保存模拟配置。世界文件通常具有.world扩展名。

mobot_room.world代码(补充):

  • ​​​​​​​mobot_room.world-ROS2Gazebo9附1​​​​​​​

此时,运行如下命令在Gazebo中启动世界环境:

relaybot@TPS2:~/mobot/src/mobot/worlds$ gazebo mobot_room.world

另外,可以按照以下教程创建自定义世界环境。

  • 建立世界环境
  • 在世界环境中创造建筑物

请确保在世界环境的文件保存为mobot_room.world在mobot/src/mobot/worlds文件中。

2.搭建机器人

现在,已熟悉用来描述仿真对象的SDF文件。ROS使用通用机器人描述格式(URDF)对机器人进行建模,该机器人在xml中描述了各种动态和运动学特性。可以点击此处了解更多信息简单的URDF如下:

<?xml version="1.0"?><robot name="two_link_robot"><!--Links--><link name="link_1"><visual><geometry><cylinder length="0.5" radius="0.2"/></geometry></visual></link><link name="link_2"><visual><geometry><box size="0.6 0.1 0.2"/></geometry></visual></link><!--Joints--><joint name="joint_1" type="continuous"><parent link="link_1"/><child link="link_2"/></joint></robot>

在URDF中定义各种机器人元素时,功能很丰富。为了单独管理各种xacro组件并重用它们,ROS提供了一个名为(XML Macro)的程序包,可以将不同的URDF文件组合到一个文件中。它还提供了模板工具来定义这些文件中的变量。使用.xacro扩展名保存这些文件。可以点击此处了解有关XACRO的更多信息。

创建两个xacro文件,一个用于描述机器人,另一个用于描述在下面简要说明的Gazebo插件,用于在仿真中进行交互。

为使Gazebo插件正常工作,请确保已安装以下ROS 2软件包。

gazebo_dev

gazebo_msgs

gazebo_plugins

gazebo_ros

gazebo_ros_pkgs

可以通过运行以下命令进行检查:

$ ros2 pkg list

与Gazebo接口的ROS 2软件包集包含在名为gazebo_ros_pkgs的元软件包中。

注意:所有ROS功能包都使用如下形式ros-<distro>-<package-name>,ros-发行版-功能包名

3.Gazebo插件

插件是一段代码,被编译为共享库并插入到仿真中。该插件可通过标准C++类直接访问Gazebo的所有功能。

插件很有用,因为它们具有如下功能:

  • 让开发人员控制Gazebo的几乎任何方面
  • 是易于共享的独立例程
  • 可以从正在运行的系统中插入和删除

可以点击此处了解有关插件的更多信息。

除了使用自定义插件,也可以使用gazebo_ros_pkgs提供的现有插件。具体使用如下:

滑行转向差动驱动控制器可实现移动机器人控制,由libgazebo_ros_diff_drive.so提供,详情请点击此处。

相机控制器可读取相机在模拟中捕获的图像,由libgazebo_ros_camera.so提供,此处点击有更多详细信息。

激光雷达控制器从读取激光扫描仪中的点云数据,由libgazebo_ros_ray_sensor.so提供,此处点击有更多详细信息。

在/opt/ros/dashing/lib目录中找到这些库。

在mobot.gazebo文件中定义这些控制器所需的各种属性。

为urdf文件创建目录。

$ cd ~/mobot/src/mobot

$ mkdir urdf

$ cd urdf

$ gedit mobot.gazebo

将以下代码粘贴到mobot.gazebo文件

mobot.gazebo代码补充:

  • mobot模型-ROS2Gazebo9附2

现在,在mobot.urdf.xacro文件中定义机器人描述。

$ cd urdf

$ gedit mobot.urdf.xacro

将以下代码粘贴到mobot.urdf.xacro文件。

mobot.urdf.xacro代码补充:

  • mobot模型-ROS2Gazebo9附2​​​​​​​

Xacro代码说明:

在mobot.urdf.xacro文件中

  • 创建链接robot_footprint,chassis,front_left_wheel,front_right_wheel,back_left_wheel,back_right_wheel,camera和hokuyo激光传感器
  • 通过指定以下关节将它们连接在一起,robot_footprint_joint连接chassis和robot_footprint。轮子通过front_left_wheel_joint连接到chassis,front_right_wheel_joint,back_left_wheel_joint,back_right_wheel_joint。camera和hokuyo分别由camera_joint与hokuyo_joint连接到chassis
  • 通过xacro使用行引用的文件中,<xacro:include filename="mobot.gazebo"/>导入了mobot.gazebo文件,在其中指定了插件的配置。
  • 指定libgazebo_ros_diff_drive.so控制器配置机器人运动,它们的轮距和直径,扭矩产生的时间和频率发布等,里程计通过/odom更新。还指定/cmd_vel订阅速度命令的主题。
  • 同样,对于libgazebo_ros_camera.so插件配置,指定了相机属性,并重新映射了由插件发布的原始主题,发布RGB图像,发布/mobot/camera/image,相机的信息发布/mobot/camera/image/camera_info。
  • 配置libgazebo_ros_ray_sensor.so为使用hokuyo激光传感器发布数据/mobot/scan。如果未指定名称空间,<namespace>/mobot</namespace>则数据将在/scan主题中发布。以上插件都是如此。

此时,~\mobot_ws\src\mobot目录应如下所示:

relaybot@TPS2:~/mobot/src/mobot$ tree

.

├── CMakeLists.txt

├── include

│   └── mobot

├── package.xml

├── src

├── urdf

│   ├── mobot.gazebo

│   └── mobot.urdf.xacro

└── worlds

└── mobot_room.world

5 directories, 5 files

colcon编译过程中调用xacro

需要配置编译过程调用xacro工具,从mobot.urdf.xacro和mobot.gazebo文件生成urdf文件。为此,需要编辑CMakeLists.txt文件以指定依赖项。

# Generate .urdf files from .urdf.xacro files
# 从.urdf.xacro文件生成.urdf文件
find_package(xacro REQUIRED)
# Xacro files Xacro文件
file(GLOB xacro_files urdf/*.urdf.xacro)foreach(it ${xacro_files})# remove .xacro extension 删除.xacro扩展string(REGEX MATCH "(.*)[.]xacro$" unused ${it})set(output_filename ${CMAKE_MATCH_1})# create a rule to generate ${output_filename} from {it} 从{it}创建一条${output_filename}规则xacro_add_xacro_file(${it} ${output_filename})list(APPEND urdf_files ${output_filename})
endforeach(it)# add an abstract target to actually trigger the builds 添加一个抽象目标实际触发编译
add_custom_target(media_files ALL DEPENDS ${urdf_files})

此外,需要配置编译过程安装urdf、worlds和meshes目录到install文件夹中。因为所有的软件包都将有ROS环境中的安装目录提供,所以在编译软件包时创建该目录。在CMakeLists.txt中添加以下。

install(DIRECTORY worlds  DESTINATION share/${PROJECT_NAME})install(DIRECTORY urdfDESTINATION share/${PROJECT_NAME})#install(DIRECTORY meshes
#  DESTINATION share/${PROJECT_NAME})

可以从下面复制整个CMakeLists.txt

CMakeLists.txt代码补充:

  • CMakeLists部分-ROS2Gazebo9附3

此时,可以编译程序包啦!开启新终端,请确保更新为ros环境。

$ source /opt/ros/dashing/setup.bash

$ cd ~/mobot

$ colcon build

Starting >>> mobot

Finished <<< mobot [1.08s]

Summary: 1 package finished [1.15s]

$

配置mobot.urdf文件urdf在编译后在目录中生成。

要在Gazebo中看到机器人,需要创建启动(launch)文件夹和启动文件。可以在此处了解ROS 2中的启动系统。

$ cd ~/mobot/src/mobot

$ mkdir launch

$ cd launch

$ gedit world.launch.py

在启动文件中,将做两件事。

  1. 使用预定义的设置和启动Gazebo mobot_room.world
  2. 调用gazebo提供的spawn_entity服务以生成mobot.urdf在世界上定义的机器人。

将以下代码粘贴到world.launch.py中。

world.launch.py代码补充:

  • world.launch.py部分-ROS2Gazebo9附4

在CMakeLists.txt添加以下代码实现编译后安装到启动文件夹。

install(DIRECTORY launchDESTINATION share/${PROJECT_NAME})

此部分已经在附3中,添加完成了。

最终~\mobot\src目录结构应如下所示:

relaybot@TPS2:~/mobot/src/mobot$ tree

.

├── CMakeLists.txt

├── include

│   └── mobot

├── launch

│   └── world.launch.py

├── package.xml

├── src

├── urdf

│   ├── mobot.gazebo

│   ├── mobot.urdf

│   └── mobot.urdf.xacro

└── worlds

└── mobot_room.world

编译并启动:

$ cd ~/mobot

$ colcon build

在启动mobot之前,必须更新bash文件。mobot工作区bash文件将程序包mobot添加到现有ros环境中,使它可使用各种ros2命令,就像其他ros程序包一样。

$ source install/setup.bash

$ ros2 launch mobot world.launch.py

注意:可以使用Tab键完成补全所有ros2命令,在键入ros2后,按Tab键查看可用选项。

应该看到如下图所示的机器人和世界环境。恭喜!此时已经成功在ROS2和Gazebo9搭建了第一个仿真机器人。下一节将学习ROS2各种命令。


使用机器人操作系统ROS 2和仿真软件Gazebo 9搭建机器人教程(一)相关推荐

  1. 计算机操作系统(OS)安装机器人操作系统(ROS)实现物联网功能

    博客中大量介绍了将Ubuntu等Linux系统借助机器人操作系统ROS实现机器人控制设计开发和物联网功能案例,并可基于OpenAI等实现人工智能相关训练. 这篇博文围绕windows系统展开,之前也写 ...

  2. 关于机器人操作系统(ROS)学习前须知二三

    ROS基础资料 1.什么是ROS? ROS(机器人操作系统,Robot Operating System),是专为机器人软体开发所设计出来的一套电脑作业系统架构.它是一个开源的元级操作系统(后操作系统 ...

  3. <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS

    <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS 前言 一.为什么需要ROS 二.ROS的总体设计 1.一个目标 2.五个特点 3.四位一体 三.ROS的系统实现--三个层次 ...

  4. 机器人操作系统ROS(1)

    ROS总体设计 ROS五个特点 点对点设计 一个使用ROS的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系,如图2所示.虽然基于中心服务器的那些软件框架也 ...

  5. 一文读懂自动驾驶中的机器人操作系统ROS

    一.什么是机器人操作系统ROS 1.ROS(Robot Operating System)是一个操作系统 ROS是对机器人的硬件进行了封装,不同的机器人.不同的传感器,在ROS里可以用相同的方式表示( ...

  6. 机器人操作系统ROS 编程开发--详细总结

    最近工作涉及到自动驾驶的,需要学习ROS,学习中总结了一些知识点,分享给大家. ROS基本介绍 机器人操作系统ROS,是一种分布式处理框架(又名Nodes),ROS常用C++和python编程语言开发 ...

  7. 机器人操作系统ROS(4)话题编程

    此节的前提是已经创建好工作空间,请参考 工作空间 一.话题通讯模型 二.话题编程实现 1. 实现发布者(Talker) a.在~/catkin_ws/src/learning_communicaton ...

  8. 从零打造一个机器人002【初识机器人操作系统--ROS】

    从零打造一个机器人002[初识机器人操作系统–ROS] 1.ROS是什么 ROS是一个适用于机器人的开源的元操作系统.其实它并不是一个真正的操作系统,其底层的任务调度.编译.寻址等任务还是由Linux ...

  9. 机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载

    原文:机器人操作系统ROS-深度相机+激光雷达实现vSLAM建图与导航_wx5d23599e462fa的技术博客_51CTO博客 这次将带大家学习如何使用深度相机实现机器人的视觉SLAM建图及导航. ...

最新文章

  1. PAT甲级1029 Median:[C++题解]贪心、二路归并
  2. void Update ( ) 更新 void FixedUpdate ( )
  3. docx文档怎么排列图片_格式转换太麻烦?仅需一行命令,搞定图片、音频、视频、文本批量转换!...
  4. Bailian4094 秘密会谈【水题】
  5. django项目介绍
  6. echarts 圆环图渐变
  7. PayPal开发前台生成订单和后台生成订单
  8. 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
  9. (2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案
  10. 现在的我,不想做管理
  11. Teach yourself Programing in Ten Years(翻译+原文链接)
  12. Android实现语音识别成中文
  13. Java解析idToken
  14. hdu2550百步穿杨 解报告
  15. upc Buy an Integer#二分
  16. C++主函数简要介绍
  17. MASK_RCNN与YOLO系列算法初学者笔记(摘抄自其他)
  18. Prometheus启动成功访问页面显示Service Unavailable
  19. ARM+FPGA运动控制卡 运动控制卡方案 运动控制卡方案 运动控制卡
  20. python基于百度智能云实现批量身份证信息识别(附完整代码,可直接使用)

热门文章

  1. 社招进京东真的很难吗?小伙毕业2年有幸获得京东内推,3面技术官直接拿下offer!
  2. 【mongoDB基础篇①】安装与常用操作语句
  3. SVN使用(windows)
  4. 2023年一月份图形化四级打卡试题
  5. 【登录时验证码一直错误】阿里云SLB负载均衡,如何session共享
  6. 短视频剪辑技巧,4法则创作热门视频
  7. JUDE/Professional中文版
  8. 前端接入阿里云外呼SDK
  9. android源码编译失败,编译android源码遇到错误及其解决方法
  10. 作为师兄,给电子信息相关毕业生的一些简历建议