追风少年 发表于 2022-11-1 15:20:06

开源机器人:上手Gazebo和ROS 2

本文要点包括:

● 多莉(Dolly)是虚拟机器人羊,是Gazebo和ROS 2的实用入门示例。
● 机器人操作系统(ROS)的最新版本ROS 2既提供了熟悉的工具和功能,同时又扩展了新的用例。
● Gazebo是工业界和学术界使用的功能强大的机器人仿真软件,可以计算物理量、生成传感器数据和提供便捷的接口。
● 开源软件正在降低机器人技术的准入门槛并加速其发展。
● 世界各地的机器人专家都在各种机器人应用中使用Gazebo和ROS,这些应用包括从类人机器人和无人机到仓库机器人和自动驾驶汽车。

多莉是一只机器人羊。多莉可以跟着您走,同时还可以携带您的重物。多莉有两个可让机器人转动的电动轮,以及一个激光扫描仪来检测前方的物体。它还有一些代码可以在激光扫描线范围内发现距离最近的物体(假定是您)并控制车轮跟随该物体。



多莉并不是真正的机器人。它是一个简单的仿真机器人,创建出来用于展示世界各地机器人专家都在使用的一些强大开源工具。尽管Dolly本身非常简单,但它与许多更复杂的机器人(例如自动驾驶汽车、仓库机器人、工业机械臂、四轴飞行器、人形机器人甚至国际空间站中的机器人队)共享其大部分代码。所有这些机器人共同的软件堆栈就是ROS,即机器人操作系统。 但是,准确地说,Dolly并不是运行现在大多数人听到的“ ROS”一词时会理所当然认为的ROS(即ROS 1)。实际上,Dolly是运行在被称为“ROS 2”的最新一代ROS之上的!
与之前的ROS 1一样,ROS 2也是用于机器人应用程序的开源软件开发套件。ROS 2的开发由开放机器人公司(Open Robotics)领导,该公司还维护多莉生活于其中的机器人仿真软件Gazebo,以及其他一些开源机器人软件和硬件。这些项目均是基于BSD和Apache 2.0等开源许可证进行分发的,这使得它们对学术界和工业界都很有吸引力。
一、机器人软件
取决于您所问的人,“机器人”一词的定义往往会有所不同,但是运行ROS并在Gazebo中仿真的机器人其关键特征就是致动(actuation)。因此,这里不谈论聊天机器人或者垃圾邮件处理机器人;这里正在谈论的是在物理上能够与环境交互、移动自己甚至其他物体的机器人。而且它们也不是盲目移动的发条玩具;这些机器人配备了传感器,使它们能够观察周围世界的变化。综上所述,这些机器人有逻辑地利用这些传感器观察结果来做出明智的决定,以决定下一步要做什么动作来完成某个特定任务。这就是所谓的“感知-思考-行动”(STA)循环,而Dolly机器人软件的组织正好反映了该循环的三个部分。
ROS 2的开发目标是为工业界和学术界提供一个标准的软件平台,以支持他们从研究和原型设计到部署和生产的整个机器人研发过程。 ROS 2构建于ROS 1的成功基础之上,而ROS 1如今已在全世界的各种机器人应用中使用。从ROS 1到ROS 2的过渡其中一个重要部分就是保持ROS的核心概念和工具,这些概念和工具迄今为止已使ROS在机器人领域如此成功。这些众所周知的概念之一就是“节点”概念,“节点”是一个负责非常具体任务的计算单元。多莉的感知-思考-行动循环中的每个部分都被映射为一个节点。 “激光(laser)”节点感知世界,“跟随(follow)”节点处理“激光”节点扫描获得的数据以发现前方距离最近的物体并生成一个具有移动方向的指令,而“差分驱动(diff-drive)”节点则按照该指令移动车轮(之所以称为差分驱动,是因为多莉是一个差分驱动轮式机器人)。随着Dolly的移动,其激光读数发生变化,并且该循环再次开始。为了简单起见,Dolly机器人软件只有三个节点,但是大型机器人应用程序可能有数百个节点协同工作,每个节点负责一项明确定义的任务。



ROS中最基本的通信方式使用一种多对多、经由称为“话题”的信道的发布者-订阅者机制。激光节点在“ scans”话题上发布扫描数据,而跟随节点则订阅该话题;反过来,跟随节点在“cmds”话题上发布移动指令,而差分驱动节点则会订阅该话题。Dolly只使用了话题,但除了这种单向通信方式之外,ROS还提供了一种请求-响应机制的“服务(services)”和用于触发更长期行为的“动作”通信方式。
当使用这些通信模式时,ROS开发人员倾向于尽可能使用标准化的消息,这使得在各个项目之间共享节点变得很方便。在这种分布式体系结构中,节点不在乎与之交谈的其他节点是谁,而仅在乎正在使用哪个话题、服务或动作。这意味着,如果某天某人决定卸下多莉的轮子并将其换成螺旋桨以将其变成一只飞羊,那么他们就不需要改动激光节点或跟随节点。他们只需要将差分驱动节点变换为其他节点,该节点以与机器人新身体相匹配的方式解释cmds话题上的移动指令。
易于代码重用是ROS的最大优势之一,因为它使得开发人员可以最大限度地利用彼此的工作成果。通过在ROS生态系统中的现有软件之上进行构建,开发人员可以专注于其具体应用程序的独特方面。实际上,实现Dolly机器人软件只需要编写跟随节点,该节点的代码少于100行。激光节点和差分驱动节点由gazebo_ros_pkgs提供,gazebo_ros_pkgs是一个标准的ROS软件包,可在特定于仿真的逻辑和非特定逻辑之间架起桥梁。当Dolly准备成为一个物理机器人时,这些节点将由特定于硬件的驱动程序和控制器代替,但是跟随节点可以保持相同,因为它发布和订阅的都是标准消息。但您可以想象,这个跟随节点并不是最聪明的机器人逻辑。实际上,多莉无法将人与树区分开来。在实际的应用程序中,开发人员应该会利用社区提供的其他功能,例如导航堆栈,这会使Dolly能够在仿真世界中自主移动。
上面提到的所有通信模式都已从ROS 1迁移到ROS 2,而且得到了改进。ROS 1使用自定义通信层,而ROS 2则建立在DDS之上。 DDS是一个工业标准,已在诸如航空和核电等关键任务应用中得到验证。您可以在InfoQ上的这篇文章中阅读有关DDS集成的更多详细信息。
除了消息传递系统外,ROS 2还提供了功能强大的开发人员工具。例如,RViz是ROS话题的可视化工具,在应用程序开发和调试过程中非常珍贵。RViz具有3D场景,可以将来自应用程序任何部分的数据显示在一起,例如点云数据和坐标系数据。RViz还提供控制界面,例如3D标记,可以将其拖动以移动真实机器人。RQt是另一个方便的图形工具,它使开发人员可以快速组合各个小部件以与他们的机器人应用程序的任何方面进行交互,无论它是否为仿真的。下图显示了RViz中Dolly的激光扫描数据(左侧)和Gazebo中显示仿真可视化的视图(右侧)。 RViz将以相同的方式显示扫描数据,无论这些扫描数据是仿真的还是来自物理硬件的。



二、仿真
Dolly居住在Gazebo软件内,Gazebo是执行物理计算,生成合成传感器数据并提供便捷接口的机器人仿真软件。接口范围从图形工具到C++ API,使用户和开发人员可以更快地实现其目标。Gazebo软件的目的是成为物理机器人的最佳可能纯软件替代品。Gazebo的一些用途包括新机器人的原型制作,新算法和行为的开发,持续集成测试和培训。
在仿真中,物理引擎处理Dolly与环境的交互方式。这包括诸如重力将多莉拖至地面、车轮与人行道之间的接触以及施加在车轮上的扭矩等行为。Gazebo并没有实现它自己的物理引擎;相反,它提供了一个允许集成多个物理引擎的抽象层。这样,开发人员只需一次性对机器人进行描述和编程,然后在运行时选择最合适的物理引擎进行仿真。默认情况下,Gazebo使用Open Dynamics Engine(ODE)作为其物理引擎,但它还提供对Bullet,DART和Simbody物理引擎的支持。
Dolly配备了单个传感器即激光扫描仪,但Gazebo支持十多个传感器,例如彩色相机和深度相机,IMU和GPS,等等。开发人员还可以通过C++ API创建新的传感器。像相机和激光扫描仪这样的传感器使用Ogre3D渲染引擎生成仿真世界图像,而像IMU和声纳这样的传感器则利用物理引擎。仿真传感器的一个缺点就是,与物理传感器相比,它们往往过于完美。因此,传感器API的一个重要方面就是应该具有将各种类型的噪声添加到生成的数据中并干扰其更新速率的能力。
Gazebo具有丰富的图形界面,可以帮助用户构造、自省仿真并与仿真进行交互。例如,多莉的城市环境是组合使用eRuby脚本、Gazebo用户界面(UI)3D视图和可提供场景中每个模型的相关详细信息的小工具而构建出来的。在运行仿真时,3D视图也是直观显示激光扫描数据以及对其他各种数据(例如关节位置、质心甚至惯性矩等)进行自省的便捷方法。在迭代算法时,这种提供场景X射线鸟瞰图的仿真能力非常有用,而且这种能力在现实世界中即使不是不可能实现,也是很难实现的。



Gazebo还让开发人员可以像在现实世界中一样与机器人进行交互。从理论上讲,您可以戴上某种VR眼镜,并使用控制器像某些机器人专家喜欢踢真实机器人那样踢Dolly。请注意,这里绝对不鼓励虐待机器人。相反地,您应该使用稍微更精细的方法,例如用一个3D箭头来推机器人以检查其恢复行为。也可以移动仿真世界中的人、添加另一个机器人、更改城市布局…,这些对您的具体项目开发有所帮助的任何模型。
在Gazebo中仿真世界是使用仿真描述格式Simulation Description Format(SDF)进行描述的。SDF是一种XML格式,可以规定仿真的各个方面,包括从多莉的波浪状尾巴上的弹性(spring)到阳光的颜色。用户可以将在线数据库中的3D模型与自己的自定义模型结合起来,以为其机器人创建各种仿真环境。实际上,多莉周围的整个城市环境都是由Ignition Fuel在线数据库中的免费模型组成的。Dolly本身是一个自定义模型,可以通过Gazebo的用户界面或直接在其SDF文件中调整和改进其所有详细信息。
Dolly示例是使用Gazebo可以做的一个最简单仿真,但在线上有各种各样精心制作的示例。例如DARPA的虚拟机器人挑战赛(Virtual Robotics Challenge),NASA的太空机器人挑战赛(Space Robotics Challenge)和即将到来的DARPA地下机器人挑战赛(Subterranean Challenge)等基于仿真的竞赛都是一些很好的例子。此外,一些机器人制造商也免费分发其Gazebo仿真机器人,例如Fetch Robotics公司的仓库机器人和Parrot公司的无人机。
为了解决新的用例,Open Robotics的团队正在积极研发Gazebo的下一代产品,即Ignition。这种重构将Gazebo分解为更小、更可重用的库,它具有用于物理引擎和渲染引擎的抽象层,支持运行跨云上计算机的分布式大型仿真,并使用现代GUI库(QtQuick)和传输库(ZeroMQ)。
三、克隆Dolly
现在Gazebo和ROS 2距离您仅几步之遥。您可以克隆Dolly,并按照说明获取并启动一个简单示例。ROS Index和Gazebo Tutorials上也有各种教程,涵盖了各种各样的功能和用例。您可以在ROS Discourse和Gazebo Community网站上的社区中找到更深入的讨论,以及在ROS Answers和Gazebo Answers网站上找到对相关技术问题的答案。最后但并非最不重要的一点是,观看来自ROSCon的视频,这是ROS开发人员的年度会议,并请确保预定一个将在澳门举办的ROSCon 2019的席位。
关于作者
Louise Poubel是Open Robotics的软件工程师,致力于为机器人技术开发免费和开源工具,例如机器人仿真软件Gazebo和机器人操作系统(ROS)。
*英语原文地址:https://www.infoq.com/articles/ros-2-gazebo-tutorial/

附录:
附录一:Louis Poubel演讲视频
1. 哔哩哔哩网站https://www.bilibili.com/video/av98662526/
2. Youtube网站https://www.youtube.com/watch?v=Gwbk6Qf_TqY

附录二:Dolly机器人软件包安装与使用
Dolly机器人软件包是用于启动Dolly演示的软件包,该演示使用ROS 2和Gazebo仿真软件或Ignition仿真软件。
1、版本选择
Dolly软件包可以在以下系统上正常运行:
分支ROSGazebo-classicIgnition操作系统crystalCrystalGazebo 9×Ubuntu BionicdashingDashingGazebo 9×Ubuntu Bionic, macOS SierraeloquentEloquentGazebo 9, 11CitadelUbuntu BionicfoxyFoxyGazebo 11CitadelUbuntu Focal2、软件包
该存储库包含以下软件包:
● dolly:元软件包,提供所有其他软件包。
● dolly_follow:提供具有跟随逻辑的节点。
● dolly_gazebo:提供用于Gazebo-classic仿真软件的机器人模型,仿真世界和的启动脚本。
● dolly_ignition:提供用于Ignition仿真软件的机器人模型,仿真世界和启动脚本。
3、安装
鼓励您从源代码构建Dolly软件包,以了解如何开发自己的软件包。但是,如果您只是想快速尝试一下该仿真演示,也可以使用二进制文件进行安装。
(1)从二进制文件进行安装
Dolly软件包已经发行了以下几个ROS发行版的二进制安装包:
ROS发行版二进制安装包Dashingros-dashing-dolly, ros-dashing-dolly-follow, ros-dashing-dolly-gazeboEloquentros-eloquent-dolly, ros-eloquent-dolly-follow, ros-eloquent-dolly-gazeboFoxyros-foxy-dolly, ros-foxy-dolly-follow, ros-foxy-dolly-gazebo以ROS 2 Foxy发行版为例,其安装命令为:
$ sudo apt-get install ros-foxy-dollyros-foxy-dolly-followros-foxy-dolly-gazebo
*编者注:不知因何原因,用二进制安装方法安装后并不能成功运行Dolly仿真演示,需要从源代码构建才能成功运行该演示。
(2)从源代码进行构建
对于Ubuntu Focal系统用户而言,其安装说明如下:
1)Gazebo或者Ignition中至少安装一个仿真软件;
2)安装此安装说明安装好了正确的ROS 2发行版;
3)克隆Dolly,根据您安装的ROS 2发行版选择相应的分支,下面以Foxy发行版为例进行说明:
mkdir -p ~/ws/src
cd ~/ws/src
git clone https://github.com/chapulina/dolly -b foxy
4)安装依赖包:
cd ~/ws
rosdep install --from-paths src --ignore-src -r -y
5)构建和安装:
cd ~/ws
colcon build
4、运行Dolly仿真演示
(1)使用Gazebo-classic仿真软件
如果在编译Dolly软件包时安装了Gazebo,则应该会启用Gazebo支持。其运行步骤如下:
1)设置环境变量(顺序很重要),命令为:
. /usr/share/gazebo/setup.sh
. ~/ws/install/setup.bash
*提示:如果设置环境变量后,运行命令ros2 pkg list | grep dolly_gazebo的结果为空,则表示未正确设置Gazebo支持。
2)在城市仿真世界中启动Dolly(这要花一些时间来下载模型):
        ros2 launch dolly_gazebo dolly.launch.py world:=dolly_city.world
3)在一个空的仿真世界中启动Dolly:
ros2 launch dolly_gazebo dolly.launch.py world:=dolly_empty.world
(2)使用Ignition仿真软件
1)设置环境变量:
. ~/ws/install/setup.bash
*提示:如果设置环境变量后,运行命令ros2 pkg list | grep dolly_ignition的结果为空,则表示未正确设置Ignition支持。
2)在一个车站仿真世界中启动Dolly:
ros2 launch dolly_ignition dolly.launch.py
附录二英语原文地址:https://github.com/chapulina/dolly
页: [1]
查看完整版本: 开源机器人:上手Gazebo和ROS 2