1、ROS(Robot Operating System)操作系统探索总结(一)ROS 简介一、历史随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求。2010 年 Willow Garage 公司发布了开源机器人操作系统 ROS(robot operating system),很快在机器人研究领域展开了学习和使用 ROS 的热潮。ROS 系统是起源于 2007 年斯坦福大学人工智能实验室的项目与机器人技术公司 Willow Garage 的个人机器人项目(Personal Robots Program)之间的合作,2008 年之后就
2、由 Willow Garage 来进行推动。已经有四年多的时间了 (视频)。随着 PR2 那些不可思议的表现,譬如叠衣服,插插座,做早饭,ROS 也得到越来越多的关注。Willow Garage 公司也表示希望借助开源的力量使 PR2 变成“全能”机器人。PR2 价格高昂,2011 年零售价高达 40 万美元。PR2 现主要用于研究。PR2 有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的钳子。PR2 依靠底部的四个轮子移动。在PR2 的头部,胸部,肘部,钳子上安装有高分辨率摄像头,激光测距仪,惯性测量单元,触觉传感器等丰富的传感设备。在 PR2 的底部有两台 8 核的电脑作为机器人各硬
3、件的控制和通讯中枢。两台电脑安装有 Ubuntu 和 ROS。二、设计目标ROS 是开源的,是用于机器人的一种后操作系统,或者说次级操作系统。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。ROS 的首要设计目标是在机器人研发领域提高代码复用率。ROS 是一种分布式处理框架(又名 Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS 还支持代码库的联合系统
4、。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由 ROS 的基础工具实现。三、主要特点ROS 的运行架构是一种使用 ROS 通信模块实现模块间 P2P 的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步 RPC(远程过程调用)通讯、基于 Topic的异步数据流通讯,还有参数服务器上的数据存储。但是 ROS 本身并没有实时性。ROS 的主要特点可以归纳为以下几条:(1)点对点设计一个使用 ROS 的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系。虽然基于中心服务器的那
5、些软件框架也可以实现多进程和多主机的优势,但是在这些框架中,当各电脑通过不同的网络进行连接时,中心数据服务器就会发生问题。ROS 的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。(2)多语言支持在写代码的时候,许多编程者会比较偏向某一些编程语言。这些偏好是个人在每种语言的编程时间、调试效果、语法、执行效率以及各种技术和文化的原因导致的结果。为了解决这些问题,我们将 ROS 设计成了语言中立性的框架结构。ROS 现在支持许多种不同的语言,例如 C+、Python、Octave 和 LISP,也包含其他语言的多种接口实现。R
6、OS 的特殊性主要体现在消息通讯层,而不是更深的层次。端对端的连接和配置利用XML-RPC 机制进行实现,XML-RPC 也包含了大多数主要语言的合理实现描述。我们希望 ROS能够利用各种语言实现的更加自然,更符合各种语言的语法约定,而不是基于 C 语言给各种其他语言提供实现接口。然而,在某些情况下利用已经存在的库封装后支持更多新的语言是很方便的,比如 Octave 的客户端就是通过 C+的封装库进行实现的。为了支持交叉语言,ROS 利用了简单的、语言无关的接口定义语言去描述模块之间的消息传送。接口定义语言使用了简短的文本去描述每条消息的结构,也允许消息的合成,例如下图就是利用接口定义语言描述
7、的一个点的消息:每种语言的代码产生器就会产生类似本种语言目标文件,在消息传递和接收的过程中通过 ROS 自动连续并行的实现。这就节省了重要的编程时间,也避免了错误:之前 3 行的接口定义文件自动的扩展成 137 行的 C+代码,96 行的 Python 代码,81 行的 Lisp 代码和 99 行的 Octave 代码。因为消息是从各种简单的文本文件中自动生成的,所以很容易列举出新的消息类型。在编写的时候,已知的基于 ROS 的代码库包含超过四百种消息类型,这些消息从传感器传送数据,使得物体检测到了周围的环境。最后的结果就是一种语言无关的消息处理,让多种语言可以自由的混合和匹配使用。(3)精简
8、与集成大多数已经存在的机器人软件工程都包含了可以在工程外重复使用的驱动和算法,不幸的是,由于多方面的原因,大部分代码的中间层都过于混乱,以至于很困难提取出它的功能,也很难把它们从原型中提取出来应用到其他方面。为了应对这种趋势,我们鼓励将所有的驱动和算法逐渐发展成为和 ROS 没有依赖性单独的库。ROS 建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake 工具使它很容易的就实现精简的理念。ROS 基本将复杂的代码封装在库里,只是创建了一些小的应用程序为 ROS 显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。作为一种新加入的有优势,单元测试当代码在库中
9、分散后也变得非常的容易,一个单独的测试程序可以测试库中很多的特点。ROS 利用了很多现在已经存在的开源项目的代码,比如说从 Player 项目中借鉴了驱动、运动控制和仿真方面的代码,从 OpenCV 中借鉴了视觉算法方面的代码,从 OpenRAVE 借鉴了规划算法的内容,还有很多其他的项目。在每一个实例中,ROS 都用来显示多种多样的配置选项以及和各软件之间进行数据通信,也同时对它们进行微小的包装和改动。ROS 可以不断的从社区维护中进行升级,包括从其他的软件库、应用补丁中升级 ROS 的源代码。(4)工具包丰富为了管理复杂的 ROS 软件框架,我们利用了大量的小工具去编译和运行多种多样的 R
10、OS组建,从而设计成了内核,而不是构建一个庞大的开发和运行环境。这些工具担任了各种各样的任务,例如,组织源代码的结构,获取和设置配置参数,形象化端对端的拓扑连接,测量频带使用宽度,生动的描绘信息数据,自动生成文档等等。尽管我们已经测试通过像全局时钟和控制器模块的记录器的核心服务,但是我们还是希望能把所有的代码模块化。我们相信在效率上的损失远远是稳定性和管理的复杂性上无法弥补的。(5)免费并且开源ROS 所有的源代码都是公开发布的。我们相信这将必定促进 ROS 软件各层次的调试,不断的改正错误。虽然像 Microsoft Robotics Studio 和 Webots 这样的非开源软件也有很多
11、值得赞美的属性,但是我们认为一个开源的平台也是无可为替代的。当硬件和各层次的软件同时设计和调试的时候这一点是尤其真实的。ROS 以分布式的关系遵循这 BSD 许可,也就是说允许各种商业和非商业的工程进行开发。ROS 通过内部处理的通讯系统进行数据的传递,不要求各模块在同样的可执行功能上连接在一起。如此,利用 ROS 构建的系统可以很好的使用他们丰富的组件:个别的模块可以包含被各种协议保护的软件,这些协议从 GPL 到 BSD,但是许可的一些“污染物”将在模块的分解上就完全消灭掉。ROS(Robot Operating System)操作系统探索总结(二)ROS 总体框架一、 总体结构根据 RO
12、S 系统代码的维护者和分布来标示,主要有两大部分:(1)main:核心部分,主要由 Willow Garage 公司和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个 ROS 的核心部分的程序编写。(2)universe:全球范围的代码,有不同国家的 ROS 社区组织开发和维护。一种是库的代码,如 OpenCV、PCL 等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。一般是从另一个角度对 ROS 分级的,主要分为三个级别:计算图级、文件系统级、社区级。二、 计算图级计算图是 ROS 处理数据的一
13、种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。(1) 节点节点就是一些直行运算任务的进程。ROS 利用规模可增长的方式是代码模块化:一个系统就是典型的由很多节点组成的。在这里,节点也可以被称之为“软件模块”。我们使用“节点”使得基于 ROS 的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。(2) 消息节点之间是
14、通过传送消息进行通讯的。每一个消息都是一个严格的数据结构。原来标准的数据类型(整型,浮点型,布尔型等等)都是支持的,同时也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于 C 语言的结构 structs)。(3) 主题消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。(4) 服务虽然基于话题的发布/订阅模型是很灵活的通讯模式,但是它广播式的路径规划对于可以简化节点设计的同步传输模式并不适合。在 ROS 中,我们称之为一个服务,用
15、一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于 web 服务器,web 服务器是由 URIs 定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的 URI 地址只能有一个 web 服务器。在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS 的控制器(ROS Master)。ROS Master 通过 RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查
16、找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。比如控制节点订阅和发布消息的模型如下:ROS 的控制器给 ROS 的节点存储了主题和服务的注册信息。节点与控制器通信从而报告它们的注册信息。当这些节点与控制器通信的时候,它们可以接收关于其他以注册及节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时控制器也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。节点与节点之间的连接是直接的,控制器仅仅提供了查询信息,就像一个 DNS 服务器。节点订阅一个主题将会要求建立一个与出版该主题的节点的连接,并且将会在同意连接协议的基础上建立该连接。另:ROS 控制器控制服务:三
17、、 文件系统级ROS 文件系统级指的是在硬盘上面查看的 ROS 源代码的组织形式。ROS 中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。在 ROS 的文件系统级,有以下几个重要概念:包(package)、堆(stack)、(1) 包ROS 的软件以包的方式组织起来。包包含节点、ROS 依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。包的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS 的包短小精干。(2) 堆堆是包的集合,它提供一个完整的功能,像“navigation stack”。Stack 与版本号关联,同时也是如何发行 ROS 软件方式的关键。ROS 是一种分布式处理框架。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到包(Packages)和堆(Stacks)中,以便于共享和分发。下图是在包和堆在文件中的具体结构: