龙空技术网

智能系统与技术指导书,教你零基础动手创建自主移动机器人

机工数字营销 516

前言:

现在你们对“ubuntu找不到turtlebot”大致比较注意,姐妹们都需要知道一些“ubuntu找不到turtlebot”的相关内容。那么小编在网络上收集了一些关于“ubuntu找不到turtlebot””的相关知识,希望大家能喜欢,同学们快快来学习一下吧!

第1章 ROS入门

本书的主要目的是教你如何从头开始构建自主移动机器人。我们将使用机器人操作系统(Robot Operating System, ROS)对机器人进行编程,它的操作将在名为Gazebo的仿真器上进行模拟。在接下来的章节中,还会介绍机器人的机械设计、电路设计、嵌入式编程并使用ROS进行高级软件编程。

本章将从ROS基础知识开始学习,包括如何安装ROS,如何使用ROS和Python编写基础的应用程序,以及Gazebo的基础知识。本章内容是自主机器人项目的基础。如果你已经了解了ROS的基础知识,并且已经在系统上安装了ROS,那么可以跳过这一章。但是,你仍然可以在以后浏览这一章来增强对ROS基础知识的记忆。

本章将涵盖以下主题:

·对ROS的概述。

·在Ubuntu 16.04.3上安装ROS Kinetic。

·介绍、安装和测试Gazebo。

我们开始使用Python和ROS来对机器人编程吧!

1.1 技术要求

可以从以下链接获得本章中提到的完整代码:。

1.2 ROS概述

ROS是用于创建机器人应用程序的软件框架,其主要目的是提供可以用于创建机器人应用程序的功能,创建的应用程序也可以被其他机器人再次使用。ROS由一系列可以简化机器人软件开发的软件工具、软件库和软件包组成。

ROS是BSD()许可的一个完整的开源项目,可用于研究和商业应用。虽然ROS表示机器人操作系统,但它并不是一个真正的操作系统。相反,它是一个提供了真实操作系统功能的元操作系统。以下是ROS提供的主要功能:

·消息传递接口:这是ROS的核心功能,它支持进程间通信。使用这种消息传递功能,ROS程序可以与其链接的系统进行通信并交换数据。下面的章节中,我们将学习更多关于在ROS程序/节点之间交换数据的技术术语。

·硬件抽象:ROS具有一定程度的抽象,使开发人员能够创建与机器人无关的应用程序。这类应用程序可以用于任何机器人,因此开发人员只需要关心底层的机器人硬件。

·软件包管理:把ROS节点以软件包形式组织在一起,则称为ROS软件包。ROS软件包由源代码、配置文件、构建文件等组成。我们可以创建包、构建包和安装包。ROS中有一个构建系统,可以帮助构建这些软件包。ROS的软件包管理使ROS的开发更加系统化和组织化。

·第三方软件库集成:ROS框架可与许多第三方软件库集成,如OpenCV、PCL、OpenNI等。这有助于开发者在ROS中创建各种各样的应用程序。

·底层设备控制:使用机器人工作时,也可能需要使用底层设备,例如控制I/O引脚、通过串口发送数据等设备。这也可以使用ROS完成。

·分布式计算:处理来自机器人传感器的数据所需的计算量非常大。使用ROS可以轻松地将计算分配到计算节点集群中。分配计算能力使处理数据的速度比使用单个计算机更快。

·代码复用:ROS的主要目标是实现代码复用。代码复用促进了全球研发团队的发展。ROS的可执行文件叫作节点。这些可执行文件被打包成一个实体,叫作ROS软件包。一批软件包集合叫作元软件包,软件包和元软件包都可以共享和分发。

·语言独立性:ROS框架可以使用当前流行的编程语言(如Python、C++和Lisp)。节点可以用任何一种语言来编写,并且可以通过ROS框架进行无障碍通信。

·测试简单:ROS有一个内置的单元/集成测试框架rostest,用于测试ROS软件包。

·扩展:ROS可以扩展到机器人中执行复杂的计算。

·免费且开源:ROS的源代码是开放的,并且是完全免费的。ROS的核心部分,经BSD(Berkeley Software Distribution)协议许可,可以在商业领域和不开源的产品上复用。

ROS是管道(消息传递)、开发工具、应用功能和生态系统的组合。ROS中有强大的开发工具,可以调试和可视化机器人数据。ROS具有内置的机器人应用功能,如机器人导航、定位、绘图、操作等。它们有助于创建强大的机器人应用程序。

图1-1显示了ROS的组成。

图1-1 ROS的组成

更多有关ROS的信息,请参考。

1.2.1 ROS框架

ROS框架主要分成三个层级:

·ROS文件系统。

·ROS计算图。

·ROS社区。

ROS文件系统

ROS的文件系统主要介绍了硬盘上ROS文件的组织形式。其中,我们必须了解的主要有以下几个方面:

·软件包(Package):ROS软件包是ROS软件框架的独立单元。ROS软件包可能包含源代码、第三方软件库、配置文件等。ROS软件包可以复用和共享。

·软件包清单(Package Manifest):清单文件(package.xml)列出了软件包的所有详细信息,包括名称、描述、许可信息以及最重要的依赖关系。

·消息(msg)类型:消息的描述存储在软件包的msg文件夹下。ROS消息是一组通过ROS的消息传递系统进行数据发送的数据结构。消息的定义存储在扩展名为.msg的文件里。

·服务(srv)类型:服务的描述使用扩展名.srv存储在srv文件夹下。该文件定义了ROS内服务请求和响应的数据结构。

ROS计算图

ROS的计算图是ROS处理数据的一种点对点的网络形式。ROS计算图中的基本功能包括节点、ROS控制器、参数服务器、消息和服务:

·节点(Node):ROS节点是使用ROS功能处理数据的进程。节点的基本功能是计算。例如,节点可以对激光扫描仪数据进行处理,以检查是否存在碰撞。ROS节点的编写需要ROS客户端库文件(如roscpp和rospy)的支持,这将在下一节中讨论。

·ROS控制器(Master):ROS节点可以通过名为ROS控制器的程序相互连接。此程序提供计算图其他节点的名称、注册和查找信息。如果不运行这个控制器,节点之间将无法相互连接和发送消息。

·参数服务器(Parameter server):ROS参数是静态值,存储在叫作参数服务器的全局位置。所有节点都可以从参数服务器访问这些值。我们甚至可以将参数服务器的范围设置为private以访问单个节点,或者设置为public以访问所有节点。

·ROS主题(Topic):ROS节点使用命名总线(叫作ROS主题)彼此通信。数据以消息的形式流经主题。通过主题发送消息称为发布,通过主题接收数据称为订阅。

·消息(Message):ROS消息是一种数据类型,可以由基本数据类型(如整型、浮点型、布尔类型等)组成。ROS消息流经ROS主题。一个主题一次只能发送/接收一种类型的消息。我们可以创建自己的消息定义并通过主题发送它。

·服务(Service):我们看到使用ROS主题的发布/订阅模型是一种非常灵活的通信模式,这是一种一对多的通信模式,意味着一个主题可以被任意数量的节点订阅。在某些情况下,可能还需要一种请求/应答类型的交互方式,它可以用于分布式系统。这种交互方式可以使用ROS服务实现。ROS服务的工作方式与ROS主题类似,因为它们都有消息类型定义。使用该消息定义可以将服务请求发送到另一个提供该服务的节点。服务的结果将作为应答发送。该节点必须等待,直到从另一个节点接收到结果。

·ROS消息记录包(Bag):这是一种用于保存和回放ROS主题的文件格式。ROS消息记录包是记录传感器数据和处理数据的重要工具。这些包之后可以用于离线测试算法。

图1-2显示了在节点和控制器之间,ROS主题和ROS服务的工作流程。

图1-2 ROS节点和ROS控制器之间的通信

从图1-2可以看到,ROS控制器位于两个ROS节点之间。我们必须记住的一件事是,在启动ROS中的任何节点之前,应该先启动ROS控制器。ROS控制器充当节点之间的中介,以交换关于其他ROS节点的信息,从而建立通信。假设节点1希望发布名为/xyz的主题,消息类型为abc。它将首先接近ROS控制器,说:“我将发布一个名为/xyz的主题,消息类型为abc,并共享其细节。”当另一个节点,比如节点2,希望订阅消息类型为abc的相同主题/xyz时,控制器将共享关于节点1的信息,并分配一个端口来直接在这两个节点之间启动通信,而不需要与ROS控制器通信。

ROS服务的工作方式与之类似。ROS控制器类似DNS服务器,当第二个节点向第一个节点请求主题或服务时,它可以共享节点的详细信息。ROS使用的通信协议是TCPROS(),它使用的是标准TCP/IP套接字。

ROS社区

ROS社区由ROS开发人员和研究人员组成,他们可以创建和维护软件包,并交换现有软件包、新发布的软件包和其他与ROS框架相关的新信息。ROS社区提供以下服务:

·发行版本(Distribution):ROS发行版有一组特定版本的软件包。本书中使用的发行版是ROS Kinetic。还有其他可用的版本,比如ROS Lunar和Indigo,它们有一个可以安装的特定版本。在每个发行版中维护软件包更容易。在大多数情况下,发行版中的软件包相对稳定。

·资源库(Repository):在线资源库是保存软件包的地方。通常,开发人员在资源库中保存一组类似的软件包,称为元软件包。还可以将单个软件包保存在独立资源库中。我们可以简单地复制资源库并构建或复用软件包。

·ROS wiki:从ROS wiki几乎可以获得所有ROS文档。通过使用ROS wiki(),可以从最基本的概念到最高级的编程来了解ROS。

·邮件列表(Mailing List):如果想获得有关ROS的更新消息,可以订阅ROS邮件列表()。还可以从ROS Discourse()获得最新的ROS消息。

·ROS应答:这与Stack Overflow网站非常相似。你可以在这个门户中提出与ROS相关的问题,并且可能会得到来自世界各地开发人员的帮助()。

可以从ROS的官方网站上了解关于ROS的其他功能。现在,我们继续介绍ROS的安装过程。

1.2.2 在Ubuntu上安装ROS

根据前面的讨论,我们了解到ROS是元操作系统,需要安装在主机系统上。ROS完全支持Ubuntu和Linux,但对于Windows和OS X的支持还处于实验阶段。表1-1列出了一些最新的ROS发行版本。

表1-1 ROS发行版本

下面我们将介绍在Ubuntu 16.04.3 LTS上安装名为Kinetic的ROS长期稳定支持(Long-Term Support, LTS)的发行版的过程。ROS Kinetic Kame主要针对的是Ubuntu 16.04 LTS。在查看了以下说明之后,还可以在Ubuntu 18.04 LTS上最新的LTS Melodic Morenia中找到设置ROS的说明。如果你是Windows或OS X用户,那么可以先在虚拟机(VirtualBox)上安装Ubuntu,然后再安装ROS。VirtualBox的下载链接为。

你可以在上找到完整的操作说明。

安装说明如下:

(1)配置Ubuntu资源库,允许restricted、universe和multiverse下载权限。可以用Ubuntu中的Software & Updates工具进行配置。我们可以直接在Ubuntu Unity查找菜单下进行简单搜索,然后按图1-3所示勾选选项。

图1-3 Ubuntu的Software & Updates工具

(2)将系统设置为从packages.ros.org接收ROS软件包。ROS Kinetic版本仅支持Ubuntu 15.10和16.04。使用下面的命令将packages.ros.org存储到Ubuntu的apt库列表:

(3)接下来,添加apt-key。apt-key用于管理密钥列表,apt通过密钥对软件包进行认证。经过这些密钥认证的软件包将被认为是可信的。使用下面的命令可以将apt-key添加到ROS软件包:

(4)添加了apt-key之后,必须更新Ubuntu软件包列表。使用下面的命令添加并更新ROS软件包和Ubuntu软件包:

(5)更新了ROS软件包之后,就可以开始安装软件包了。使用下面的命令安装ROS必需的软件包、开发工具和软件库:

(6)在桌面安装完成之后,可能还需要安装一些附加的软件包。每个附加安装的软件包在书中后续对应的部分都会提到。安装桌面需要花费一些时间。在ROS安装完成之后,就已经完成了大部分工作。下一步就是初始化rosdep,有了它就可以很容易地安装ROS资源包的依赖项:

(7)为了在当前的bash shell下使用ROS工具和命令,可以在.bashrc文件中添加ROS环境变量。这将会在每个bash会话开始时执行。使用下面的命令添加ROS环境变量到.bashrc文件:

下面的命令将在当前shell下运行.bashrc脚本,并在当前shell下产生变化:

(8)在安装软件包的依赖项时有一个很好用的工具rosinstall,这个工具需要单独安装。它仅需要一个命令就可以帮助你下载到很多ROS软件包的资源树:

最新的LTS Melodic的安装过程类似于前面的过程。可以同时安装Ubuntu 18.04 LTS和Melodic。你可以在上找到完整的说明。

在完成ROS的安装之后,我们将讨论如何在ROS中创建示例软件包。在创建软件包之前,先要建立ROS工作区,然后在ROS工作区中创建软件包。我们将采用catkin构建系统,catkin是一系列工具的集合,用于在ROS中创建软件包。catkin构建系统能够从源代码生成可执行文件或共享库。ROS Kinetic使用catkin构建系统来创建软件包。下面,我们先来看看catkin是什么。

1.2.3 什么是catkin

catkin是ROS的官方编译构建系统。在catkin之前,ROS用rosbuild系统来构建软件包。在最新版本的ROS中,catkin代替了rosbuild。catkin结合了CMake宏命令和Python脚本来提供和CMake同样的通用工作流程。catkin提供了比rosbuild系统更好的软件包发布功能、更好的交叉编译功能以及更好的可移植性。有关catkin的更多信息,可以参考wiki.ros.org/catkin。

catkin工作区是一个文件夹,可以在其中对catkin软件包进行修改、构建以及安装。

现在,我们来看如何创建ROS的catkin工作区。

使用下面的命令创建名为catkin_ws的父目录和名为src的子文件夹:

使用下面的命令将目录切换到src文件夹。我们将在src文件夹中创建软件包:

使用下面的命令初始化catkin工作区:

在完成catkin工作区初始化之后,使用下面的命令能够直接(即使在没有源文件的情况下)构建软件包:

catkin_make命令用于在src目录中构建软件包。构建软件包之后,在catkin_ws目录下可以看到一个build文件夹和一个devel文件夹。可执行文件存储在build文件夹中。在devel文件夹中,有可以在ROS环境下添加工作区的shell脚本文件。

1.2.4 创建ROS软件包

在本节中,我们将介绍如何创建包含两个Python节点的示例软件包。其中一个节点用于在名为/hello_pub的主题上发布Hello World字符串消息,另一个节点订阅该主题。

在ROS中使用catkin_create_pkg命令可以创建catkin ROS软件包。

软件包会在src文件夹中创建,这个文件夹是我们在创建工作区的过程中创建的。在创建软件包之前,使用下面的命令先切换到src文件夹:

使用下面的命令创建hello_world包及std_msgs依赖项,该依赖项包含标准的消息定义。ROS的Python客户端库是rospy:

在软件包成功创建后,会返回以下信息:

在hello_world包成功创建之后,需要添加两个Python节点或脚本,用于演示主题的订阅和发布。

首先,使用下面的命令在hello_world包中创建名为scripts的文件夹:

切换到scripts文件夹,并创建名为hello_world_publisher.py和hello_world_subscriber.py的脚本,用于发布和订阅Hello World消息。下面将介绍这些脚本或节点的代码和函数。

hello_world_publisher.py

节点hello_world_publisher.py主要发布欢迎信息Hello World到主题/hello_pub中,发布频率为10Hz。

图1-4显示了两个ROS节点之间的相互作用。

图1-4 发布者和订阅者节点之间的通信

本书的完整代码还可在获得。

此节点代码的分步解释如下:

(1)如果要编写ROS Python节点,则需要导入rospy。它包含Python的API,可以与ROS的主题、服务等相互作用。

(2)要从std_msgs包中导入String消息数据类型才能发送Hello World消息。std_msgs包对标准的数据类型有一个消息定义。使用下面的命令进行导入:

(3)下面的代码创建了主题hello_pub的一个发布对象。消息类型是String,queue_size的值为10。如果设置的订阅频率太低导致来不及接收数据,可以调整queue_size选项:

(4)下面这行代码对所有ROS节点进行初始化,并给每个节点命名。如果运行过程中两个节点有相同的节点名称,那么其中一个将会关闭。如果想要同时运行这两个节点,可以如下使用anonymous=True标志:

(5)下面这行代码创建速率对象r。在对象Rate中使用sleep()方法,可以更新设定的循环速率。这里,我们设定速率为10:

(6)下面的循环将检查rospy是否构建了rospy.is_shutdown()标志。接下来,执行这个循环。按下<Ctrl+C>时,循环退出。

在循环内部,消息Hello World会被打印在终端上,并同时以10Hz的速率发布在主题hello_pub上:

(7)下面的代码对Python的_main_进行检查并调用talker()函数。代码将持续执行talker(),当按下<Ctrl+C>时,节点将关闭:

在发布主题之后,我们将介绍如何订阅主题。接下来的部分介绍订阅hello_pub主题的相关代码。

hello_world_subscriber.py

订阅主题的代码如下:

下面是当消息到达hello_pub主题后执行的一个回调函数。data变量包含了来自主题的消息,使用函数rospy.loginfo()可以将其打印出来:

下面分步介绍以hello_world_subscriber为名称启动节点,同时开始订阅/hello_pub主题:

(1)消息的数据类型为String,当消息到达主题后,执行一个名为callback的回调函数:

(2)下面的代码让节点保持在线,直到节点被关闭:

(3)下面的代码是Python代码的主体部分,调用listener()方法来订阅/hello_pub主题:

(4)在保存了两个Python节点之后,需要使用chmod命令更改执行权限:

(5)在更改了文件权限之后,使用catkin_make命令构建软件包:

(6)下面的命令添加当前ROS工作区路径到所有终端,这样就能够在这个工作区内访问ROS软件包:

图1-5是订阅和发布节点的输出画面。

图1-5 Hello World节点的输出画面

(1)首先,在启动节点之前需要运行roscore。不同节点之间需要通过roscore命令或ROS控制器进行通信。所以,第一条命令如下:

(2)在执行roscore之后,使用下面的命令运行每个节点:

·发布节点:

·订阅节点。该节点订阅了hello_pub主题,如下面的代码所示:

以上,我们介绍了ROS的一些基础知识。下面我们将介绍什么是Gazebo,以及在ROS中如何使用Gazebo。

1.2.5 什么是Gazebo

Gazebo是一个免费的开源机器人仿真器,可以用它来测试我们自己的算法,设计机器人,以及在不同的仿真场景下测试机器人。Gazebo可以准确有效地在室内和室外环境中模拟复杂的机器人。Gazebo的内置物理引擎使我们可以构建高质量图形并提升渲染效果。

Gazebo有以下功能:

·动态仿真:使用Gazebo的物理引擎可以进行机器人的动力学仿真,例如,使用ODE(Open Dynamics Engine)()、Bullet()、Simbody()以及DART()等。

·先进的3D图形显示:Gazebo使用OGRE框架(),以提供高质量的渲染、灯光、阴影及纹理效果。

·传感器支持:Gazebo能够支持大部分传感器,包括激光测距仪、Kinect型传感器、2D/3D相机等。在仿真时也可以选择模拟噪声来测试音频传感器。

·插件:可以为机器人、传感器以及环境控制开发自定义插件。插件可以访问Gazebo的API。

·机器人模型:Gazebo提供当前主流的机器人模型,例如PR2、Pioneer 2 DX、iRobot Create和TurtleBot。我们也可以构建自定义机器人模型。

·TCP/IP传输:可以在远程计算机上运行仿真程序,通过Gazebo的接口运行基于套接字的消息传递服务。

·云仿真:使用CloudSim框架()在云服务器上运行仿真程序。

·命令行工具:扩展的命令行工具可用来检查和记录仿真过程。

Gazebo安装

Gazebo安装后可以作为ROS的独立应用程序使用,也可以作为集成应用程序使用。在本章中,我们将在ROS中使用Gazebo进行机器人行为仿真,使用ROS框架测试编写的代码。

如果想自己尝试安装最新的Gazebo独立仿真器,可以按照上给出的步骤进行安装。

我们不需要单独安装Gazebo和ROS,因为Gazebo是内置于完整版的ROS桌面安装程序中的。

把Gazebo集成到ROS上的ROS软件包叫作gazebo_ros_pkgs,就是在独立的Gazebo之外的包装器。该软件包为Gazebo环境下的机器人仿真提供了必要的接口,并通过使用ROS的消息服务实现。

使用下面的命令可以在ROS Indigo中完整安装gazebo_ros_pkgs:

在ROS接口测试Gazebo

假定ROS的环境已配置完成,可以使用以下命令在启动Gazebo之前运行roscore:

使用以下命令来通过ROS运行Gazebo:

Gazebo运行两个可执行文件,分别是Gazebo服务器和Gazebo客户端。Gazebo服务器将执行仿真过程,Gazebo客户端则运行Gazebo的GUI。使用上面的命令,Gazebo的服务器和客户端将并行运行。

Gazebo的GUI屏幕截图如图1-6所示。

图1-6 Gazebo仿真器

运行Gazebo之后,将生成下列主题:

使用下面的命令,可以分别运行Gazebo的服务器和客户端:

·运行Gazebo服务器:

·运行Gazebo客户端:

1.3 本章小结

本章介绍了机器人操作系统(ROS),主要目的是让你了解什么是ROS,它的功能,如何安装,ROS中的基本概念以及如何使用Python编程。除此之外,还介绍了名为Gazebo的机器人仿真器,它可以和ROS一起工作。我们还介绍了如何安装和运行Gazebo。下一章将介绍差分驱动机器人的基本概念。

1.4 习题

1. ROS的重要功能是什么?

2. ROS有哪些不同层次的概念?

3. 什么是ROS catkin构建系统?

4. ROS的主题和消息是什么?

5. ROS的计算图有哪些不同的概念?

6. ROS控制器的主要功能是什么?

7. Gazebo的重要功能是什么?

标签: #ubuntu找不到turtlebot #ubuntu安装indigo #ubuntu配置pcl #ubuntu安装openni