导读:前不久,John 为大家介绍过物联网开源操作系统,或许大家还记忆犹新。今天,要介绍的是一款机器人领域的开源操作系统: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提供了一种标准的方法,产生、搜集和统计机器人的诊断信息。让开发者可以很容易了解机器人的状态,并且可以决定如何处理出现的问题。
姿态评估、本地化和导航
另外,ROS也提供了一些更加强大功能,可以帮助你启动你的机器人项目。这些ROS软件包,可以解决一些基础问题例如姿势评估、地图中定位,构建地图和移动导航。
第三,工具
ROS 其中一个最强大的功能就是工具,这些工具支持内省、调试、绘图,以及系统状态可视化。
发布/订阅机制,让你可以自发地内省通过系统的数据流,更容易地理解和调试系统发生的问题。ROS工具利用这种内省功能,以及一些列的图形化和命令行工具,简化开发和调试。
命令行工具
ROS 可以无图形化界面的条件下使用。所有的核心功能和内省工具,都可以通过超过45种的命令行工具访问。这些命令可以启动小组结点,内省主题、服务和行动,记录和回放数据,以及其他许多情况。如果你愿意使用图形化工具,rviz 和 rqt 则提供了相似的功能。
rviz
rivz 可能是最著名的ROS工具,它提供了通用功能,对于许多传感器数据类型和URDF描述的机器人,进行三维视觉化。
rviz 可以可视化处理许多消息类型,例如雷达扫描、三维点云、摄像头图像。它也可以使用tf 库,按照你选择的坐标系,显示所有的传感器数据,同样也可以将机器人呈现出来。在同一个应用中,视觉化所有的数据可以让开发者很快看到机器人所看到的东西,从而可以区分传感器失调或者机器人模型失准引发的问题。
rqt
rqt,是一个基于QT框架的工具,用于开发机器人图形化接口。你可以创建定制接口,组成和配置内置rqt插件的扩展库,用于标签、多画面和其他布局。你也可以通过编写自己的rqt插件,你引入新的接口。
rqt_graph 插件,提供了ROS系统的内省和可视化,展示他们之间的结点和连接,让你可以便于调试和理解运行系统及其组成。
rqt_plot 插件,让你可以监测编码器、电压或者随着时间而变化的数字。rqt_plot插件让你可以选择绘图后端(例如matplotlib、Qwt、 pyqtgraph),以最好地满足需求。
rqt_topic 和 rqt_publisher 插件,可用于主题和监测。前者,允许你监测和内省系统内发布的任何主题。后者,让你可以发布自己的消息到任何主题,促进系统的专门实验。
对于数据的记录和回放,ROS使用“包”格式 。包文件可以通过rqt_bag 插件创建和图形化访问。插件可以将数据记录到包,从包中选择特定的主题回放,可视化包内容,包括显示图片和绘制随着时间推移的数值。
结语
ROS,刚刚度过9岁生日。这款机器人开源操作系统在机器人的感知、物体识别、脸部识别、姿势识别、运动、运动理解、结构与运动、立体视觉、控制、规划等多个领域都有相关应用。
John 衷心地希望这款机器人的介绍对大家有帮助,同时希望听到来自大家的宝贵意见,一起探讨。