购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

二、ROS

1.ROS概述

硬件技术的飞速发展在促进机器人领域快速发展和复杂化的同时,也对机器人系统的软件开发提出了巨大挑战。机器人平台与硬件设备越来越丰富,致使软件代码的复用性和模块化需求越发强烈,而已有的机器人系统又不能很好地适应需求。相比硬件开发,软件开发明显力不从心。为迎接机器人软件开发面临的巨大挑战,全球各地的开发者与研究机构纷纷投入机器人通用软件框架的研发工作当中。在近几年里,产生了多种优秀的机器人软件框架,为软件开发工作提供了极大的便利,其中最为优秀的软件框架之一就是机器人操作系统(Robot Operating System, ROS)。

伴随机器人领域的快速发展和功能复杂化,对机器人控制代码的复用性和模块化的需求越来越强烈,而已有的开源机器人系统并不能很好地适应需求。ROS起源于2007年斯坦福大学人工智能实验室与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后由Willow Garage公司全面接管并进行迭代开发和维护。

2010年,Willow Garage公司发布了开源ROS,很快就在机器人研究领域推动起学习和使用 ROS的热潮。ROS是开源的,是在机器人系统之上的一种后操作系统(或者次级操作系统)。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序之间的消息传递、程序发行包管理等;同时,它也提供一些工具和程序库用于获取、建立、编写和运行多机整合的应用。

2.ROS特点

ROS提供了一种发布和订阅的通信框架,实现简便快速地搭建分布式计算系统;提供了大量简洁的工具,实现计算系统的配置、启动、调试、可视化、测试;具备定位、控制、规划、决策等功能开发资源;提供了一个强大的技术支持社区;支持若干种类型的通信,包括基于服务的同步RPC(远程过程调用)通信、基于Topic的异步数据流通信,还包括参数服务器上的数据存储,但是ROS本身不具备实时性。

ROS的主要特点如下:

(1)点对点设计

ROS包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系。虽然一些基于中心服务器的软件框架也具备多进程和多主机的优势,但是在这些框架中,当各主机通过不同的网络进行连接时,中心服务器就会发生问题。图2-15为ROS的点对点设计示例。

图2-15 ROS的点对点设计示例

ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,适应大多数机器人遇到的计算挑战。

(2)多语言支持

在写代码的时候,大多数编程者会偏好某些编程语言。这些偏好是个人在每种语言所花的编程时间、达到的调试效果、对编程语言语法的适应、可接受的程序执行效率以及各种技术和文化的原因导致的结果。为了解决这些问题,ROS被设计成语言中立性的框架结构。ROS支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现,如图2-16所示。ROS的特殊性主要体现在消息通信层,其利用XML-RPC机制实现端对端的连接和配置。XML-RPC也实现了大多数主流编程语言的合规描述。ROS的开发者希望它能够适配各种编程的语法约定,而不是仅仅基于C语言去给各种其他编程语言提供实现接口。然而,在某些情况下,可以利用已经存在的库,封装后支持更多新的编程语言。

为了支持交叉语言,ROS利用简单的、语言无关的接口定义语言去描述模块之间的消息传送。接口定义语言使用简短的文本去描述每条消息的结构,也允许消息的合成。每种编程语言的代码产生器都会产生类似本编程语言的目标文件,在消息传递和接收的过程中通过ROS实现自动连续并行运行。

其好处是,ROS的消息处理系统完全与编程语言无关,可支持多种编程语言自由结合与适配使用。

图2-16 多种编程语言支持ROS开发

(3)精简与集成

ROS中所有的驱动和算法均为与ROS没有依赖性的、单独的库;ROS具有模块化特点,各模块中的代码可以单独编译,且编译使用的CMake工具使其很容易地实现精简的理念。

ROS将复杂的代码实现封装在各个库中,并创建了一些短小精干的应用程序以显示ROS库的功能,如图2-17所示。一方面,允许对ROS的代码进行简单移植并复用于任何新系统中;另一方面,对代码的单元测试也变得较为容易,一个独立的单元测试程序可以测试代码库中很多的特性。

图2-17 ROS的精简与集成

(4)工具包丰富

为了管理复杂的ROS软件框架,开发者利用大量的小工具去编译和运行多种多样的ROS组建,以维持一个精简的内核,避免去构建一个庞大的开发和运行环境。

小工具的主要作用是组织源代码的结构、获取和设置配置参数、图形化端对端的拓扑连接、测量频带使用宽度、及时描绘信息数据、自动生成文档等。ROS开发者的目标是把所有的代码模块化,因为损失效率的重要性远远低于系统的稳定性和管理的复杂性。

(5)免费开源

ROS所有的源代码都是公开发布的,这也是当今ROS在机器人和自动驾驶领域广泛应用的主要原因,活跃的开发者会在软件各层次进行调试并不断改正错误。ROS的开源遵循BSD许可,开发者可以根据自身系统设计需要,进行二次开发,也就是说允许各种商业和非商业的工程基于ROS进行开发。

ROS通过内置的通信系统进行数据的传递,不强制要求所有模块在相同可执行层面上相互连接。因此,利用ROS构建的系统可以较为自由地使用大量其他组件,个别模块甚至可以包含被各种协议保护的软件,这些协议包含从GPL到BSD。

3.ROS总体框架

ROS主要可分为三个级别:计算图级、文件系统级、社区级。

(1)计算图级

计算图级是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及它们所进行的数据处理,都将通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。图2-18所示为ROS的计算图级。

图2-18 ROS的计算图级

1)节点。节点是一些执行运算任务的进程。ROS利用规模可增长的方式使代码模块化:一个典型系统由许多节点组成。在这里,节点也叫作软件模块。节点的叫法使得基于ROS的系统在运行时更加形象化:当许多节点同时运行时,可以方便地将端对端的通信绘制成一个图表,在这个图表中,进程就是途中的节点,而端对端的连接关系由其中的弧线连接表现。

2)消息。节点之间通过传送消息进行通信,如图2-19所示,每一个消息都是一个严格的数据结构。

图2-19 ROS的消息

3)主题。消息以一种发布或订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据,可能同时有多个节点发布或者订阅同一个主题。

4)服务。在ROS中,一项服务用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于Web服务器,Web服务器是由URI定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一项服务,只有一项服务可以称为分类象征。例如,任意一个给出的URI地址只能有一个Web服务器。

在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊地执行,这个控制器被称为ROS控制器(ROS Master)。

ROS Master通过RPC(Remote Procedure Call,远程过程调用)协议提供登记列表和对其他计算图表的查找。没有控制器,一个节点将无法找到其他节点并交换消息或调用服务。控制节点订阅和发布消息的模型如图2-20所示。

(2)文件系统级

ROS文件系统级主要是指在硬盘上面查看的ROS源代码的组织形式,如图2-21所示。

图2-20 控制节点订阅和发布消息的模型

图2-21 ROS文件系统级的构成

ROS中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。ROS的文件系统级有以下两个重要概念:包(package)、堆(stack)。

1)包。ROS的软件以包的形式组织。每个包里包含节点、ROS依赖库、数据套、配置文件、第三方软件或者其他逻辑。ROS的包如图2-22所示,包的目标是提供一种易于使用的结构以便其软件的重复使用。总的来说,ROS的包短小精干。

图2-22 ROS的包

2)堆。堆是包的集合,它提供一个完整的功能,像“navigationstack”是一个ROS的堆,里面包含了ROS在路径规划、定位、地图、异常行为恢复等方面的包。堆与版本号关联,同时也是如何发行ROS软件的关键方式。图2-23所示为ROS的堆。

图2-23 ROS的堆

(3)社区级

ROS社区级概念是ROS网络上进行代码发布的一种表现形式,构成如图2-24所示。

图2-24 ROS社区级构成

代码库的联合系统使得协作关系亦能被分发。这种从文件系统级到社区级的设计让ROS系统库的独立发展和工作实施成为可能。这种分布式的结构使得ROS迅速发展,软件库中包的数量随时间呈指数级增加。 8u7T7M1eX3yVN7bFNfnATqwjMnv1A5YR2dQkfIW8OWXvrTANFxYt1M1t07+maV72

点击中间区域
呼出菜单
上一章
目录
下一章
×