400-700-1307

机器人开源操作系统ROS

2019-01-23 17:18
今天,要介绍的是一款机器人领域的开源操作系统:ROS。
 
简介
 
 
ROS,英文全称 Robot Operating System,即机器人操作系统。它的目标是为机器人软件开发者的提供了一个灵活的框架,其中包含一些列的工具、库和约定。同时,ROS还可以为异质计算机集群,提供了类似操作系统的中间件。
 
总结起来,正如下图所示:ROS = 架构 + 工具 + 功能 + 生态系统 。
 
 
服务
 
ROS提供标准的操作系统服务例如硬件抽象、底层设备控制、常用功能实现、进程间消息传递、软件包管理。ROS基于一种图状架构,从而不同节点的进程能接受,发布,聚合各种信息(例如传感,控制,状态,规划等等)。
 
分层
 
ROS可以分成两层:低层是操作系统层(上面有描述),上层则是广大开发者贡献的功能各异的软件包例如定位绘图,行动规划,感知,模拟等等。
 
生态系统
 
ROS生态系统的软件可以分成三组:
 
  • 独立于开发语言和平台的工具,用于构建和发布基于ROS的软件。
  • ROS客户端库的实现例如 roscpp、rospy、roslisp。
  • 利用一个或者多个ROS客户端库,包含相关应用代码的软件包。
 
ROS客户端库,主要包括开发语言例如C++、Python、LISP,由于依赖于大量开源软件,所以可在类Unix系统上使用。对于这些客户端库,Ubuntu Linux 是完全支持的,而其他系统例如Fedora Linux、Mac OS X、 Microsoft Windows 是“实验性”(不是太完善的)的支持。另外,这些客户端库也得到了开发者社区的支持。
 
第三种的软件包,通常由于开发者自己开发,使用的功能和应用包括:硬件驱动、机器人模块、数据类型、计划、感知、即时定位和地图构建,仿真工具以及其他算法。
 
许可证
 
所有,独立于开发语言的工具和主要客户端库(C++,Python,LISP),都在BSD开源授权协议下发布,这些开源软件可以免费用于商用和研究目的。其他的软件包例如开发者自己开发的,使用其他开源许可授权,例如Apache 2.0、 GPL 、MIT 甚至专利许可。用户可以自行判断软件包,是否具有满足自己需求的许可证。
 
分布式和模块化
 
ROS的设计,尽可能体现分布式和模块化。
 
用户可根据自己的需求,或多或少地定制使用ROS。ROS的模块化特点,可以让你自行选择哪些部分需要ROS,哪些部分可以自己实现。
 
ROS,也具有分布式的特性,从而也培养了用户共享软件包的大型社区。它使得开发者在ROS核心系统基础上,增添许多新功能。
 
社区
 
过去几年以来,ROS已经成为全世界范围内,具有大量用户的大型社区。以前,很多用户来自于实验室,但现在,越来越多的商业用户也加入进来,特别是在工业和服务机器人领域。
 
ROS 社区十分活跃,根据统计,ROS 社区具有超过1500个电子邮件列表的参与者,3300个用户合作化开发维基文档,5700用户在社区进行ROS相关的提问和回答,一共有超过22000条的维基包,每天超过30条。问答网站有超过13000个问题,70%的回答率。
 
合作化
 
ROS则致力于在不同的机器人平台之间,简化创建机器人软件任务的复杂性。
 
其实,创建一个健壮、通用的机器人软件,并不是那么简单。从机器人的角度讲,即使对于人类来讲微不足道的问题,也会由于任务或者环境的不同,而变得很复杂。所以,靠单独的个体、实验室、机构可以自己独立处理这些任务,是无法胜任的。
 
所以,ROS就是为了鼓励协作化的机器人软件开发。ROS,就是为了让擅长不同技术领域的开发小组合作起来,彼此借鉴各自的专长,共同应对机器人所需要面对的复杂任务。
 
ROS,为大多数的机器人项目提供了很多价值,也代表了世界一流机器人的合作化的开发趋势。ROS其中一个核心价值,就是分享通用的组件。如果你觉得ROS有用,你也可以加入ROS社区。
 
核心组件
 
ROS的核心组件主要分为三部分:通信基础结构、机器人特定功能库 、工具。
 
第一,通信基础结构
 
ROS,在底层提供消息传送接口以及进程之间的通信,起到了一种中间件的作用。ROS的中间件提供这些功能:
 
  • 发布和订阅匿名消息传递
  • 消息记录和回放
  • 远程过程调用的请求和响应
  • 分布式参数系统
  • 消息传输
 
通信系统

一般来说,是实现一个全新机器人系统的首要需求。ROS内置了经过完善测试的消息系统,通过匿名发布和订阅机制,管理分布式节点之间的通信,从而节省开发者的开发时间。
 
另外,使用消息传输系统的还有一个重要优势,就是让开发者能够清楚地实现系统结点之间的接口,有利于提高封装性和代码复用程度。这些消息接口结构,会在消息接口描述语言中定义。
 
消息记录和回放
 
因为发布/订阅系统是匿名和异步的,所以数据可以被很容易地获取和回放,并不需要改动任何代码。
 
例如,你有一个任务A,从传感器中读取数据。你正在开发任务B,处理任务A产生的数据。ROS,让由任务A发布的数据很容易地记录到一个文件中,然后过一段时间,从文件中重新发布这些数据。这种消息传输抽象机制,让任务B无法得知数据的来源(来自任务A还是日志文件)。
 
这是一个十分强大的设计模式,可以显著降低开发成本、提高系统的灵活性和模块化程度。
 
远程过程调用
 
异步发布/订阅消息机制,可以满足机器大部分的通信需求。但是,某些特殊情况下,你会需要进程之间的同步请求/响应。ROS 使用“服务”,提供这种功能。和另外一个功能“主题”类似,数据在进程之间通过服务调用传输。服务调用在同样简单的消息接口描述语言中定义。
 
分布式参数系统
 
ROS中间件,通过参数服务器(一种多元、共享的字典,通过网络API访问)为任务提供分享配置信息的方法。系统让你可以轻易地改变任务配置,甚至让任务可以改变其他任务的配置。
 
第二,机器人库
 
除了核心的中间件,ROS还提供通用的机器人库,功能如下:
 
机器人标准消息定义
 
机器人几何库
 
机器人描述语言
 
可抢占远程过程调用
 
诊断
 
姿态评估
 
定位
 
绘图
 
导航
 
标准机器人消息
 
经过社区多年的讨论和开发,最终实现了标准的消息格式,覆盖了绝大部分的机器人案例。
 
这些消息定义,有的针对于几何概念例如:姿势、变换、向量;有的针对于传感器例如:摄像头、惯性测量单元和激光器;有的针对导航数据例如:量距、路径和地图,以及许多其他概念。
 
在应用中,使用这些标准消息,开发者可以让代码,无缝地和ROS生态系统的其他部分对接,例如开发工具或者功能库。
 
机器人几何库
 
 
许多机器人项目中的一个通用挑战,就是让机器人的不同部分相互协调。例如,你想联合摄像头的数据和雷达的数据,你必须知道传感器位于什么地方,具有共同的参考系,特别是针对那些具有很多活动部件的类人机器人。
 
在ROS中,我们通过 tf (变换)库来解决这个问题,它可以持续追踪机器人系统每个部件的位置。
 
tf 库,首先考虑到了效率,用于管理协调机器人的变换数据,超过100度的自由,并且更新率达到数百赫兹。tf 库可以定义静态变换,例如固定于移动基座的摄像头;还有动态变换,例如机器人手臂的联合。
 
你可以变换系统中任何两个坐标系的传感器数据。tf 库可以处理以下的情况例如:信息的生产者和消费者分布于网络中不同位置,或者信息更新的速率不同。
 
机器人描述语言
 
ROS,还可以解决另外一个通用机器人问题,就是如何以一种机器可以读懂的方式描述机器人。
 
ROS提供了一些列工具,进行机器人描述和建模,使得它可以被ROS系统其余部分读懂,这些部分包括:tf、robot_state_publisher、rviz。
 
ROS中描述机器人的格式是URDF(统一机器人描述格式),你可以使用XML文档描述机器人的物理属性,例如肢体长度、轮子大小、传感器位置和机器人每个部分的视觉外观。
 
一旦以这种方式定义,你可以很容易通过使用tf库,以及模拟器和运动规划器,让机器人完美地呈现在三维空间中。
 
可抢占的远程过程调用
 
主题(匿名发布/订阅)以及服务(远程过程调用),可以覆盖机器人中大多数的通信案例。但是,有时你需要发起一个全局寻找行为,并且检测它的进展,并且能够实现抢占,完成后还要接到通知。
 
ROS为这个使用案例,设计了动作(action)库。动作库,和服务一样,只是它们还可以报告进展,得到最终反馈。它们可以被调用者抢占。
 
你可以让机器人根据导航到达指定位置,监测它在到达过程中的进展,在途中让它停止或者重新规划路径,成功或者失败后得到通知。
 
动作库是一个十分强大的概念,它贯穿整个ROS生态系统。
 
诊断
 
 
ROS提供了一种标准的方法,产生、搜集和统计机器人的诊断信息。让开发者可以很容易了解机器人的状态,并且可以决定如何处理出现的问题。
 
姿态评估、本地化和导航