干货:机器人开源操作系统ROS

  导读

  前不久,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 衷心地希望这款机器人的介绍对大家有帮助,同时希望听到来自大家的宝贵意见,一起探讨。

  参考资料

  【1】http://www.ros.org/

  题图和文图来源于 ros.org

  更多前沿技术和创新产品,请关注微信公众号:IntelligentThings,或者联系作者个人微信:JohnZh1984

声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
推荐阅读