大家好,接下来一段时间,在学习机器学习算法的同时,我也将逐步学习机器人操作系统ROS (Robot Operating System),最终将二者应用于实践。本篇文章主要是初步介绍ROS的基本知识以及安装等内容。
一、ROS简介
ROS是啥?
ROS是一个适用于机器人的开源的元操作系统,如图1所示。它提供类似操作系统所提供的功能,包括硬件抽象、底层设备控制、常用函数的实现、进程间消息传递以及包管理。它也提供用于获取、编译、编写、跨计算机运行代码所需的工具和库函数。它主要采用的是松耦合点对点进程网络,目前主要支持的还是Ubuntu系统,Mac OS X支持等。
如图1所示:计算机的操作系统将计算机硬件封装起来,而应用软件运行在操作系统之上,不用管计算机具体应用的是什么类型的硬件产品;同理,ROS对机器人的硬件进行了封装,不同的机器人、不同的传感器,在ROS里可以用相同的方式表示(topic等),供上层应用程序(运动规划)调用等。
ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计(即节点),并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈 (Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。但是ROS本身并没有实时性。
为啥选ROS?(这个内容请参考Top Liu的博文:机器人程序设计之如何正确入门ROS)
首先,目前机器人开发,软件开发的比重越来越大,而软件开发的时候软件框架的选择,是软件架构设计中一个重要的决策,直接决定了软件开发的直接效率,以及后续功能的实现程度。目前除了ROS,还有很多类似的机器人软件框架,包括Player、YARP、Orocos、CARMEN、Orca、MOOS,以及Microsoft Robotics Studio。
为什么使用ROS呢?ROS有四大优点:1、松散耦合的机制方便机器人软件框架的组织;2、最丰富的机器人功能库,方便快速搭建原型;3、非常便利的数据记录、分析、仿真工具,方便调试;4、学界和产业界的标准,方便学习和交流。 使用一句话总结,使用ROS,能够方便迅速地搭建好机器人原型。当然,它的性能不是最优的,但是这四条优点足以保障它在机器人操作系统里面的地位。
另外:1、ROS使用了BSD许可证,这是一个非常宽松的开放许可证,允许在商业和闭源产品使用,这对于开发产品的创业公司是比较重要的一点;2、ROS是最庞大的使用者群体,是事实上的机器人标准,这是麻省理工在一篇文章中给出的评论。然后在2016年ROS大会数据显示,目前在使用操作系统做开发的人员用户超过35万,其中活跃用户美国占第一位,中国占第二位;3、在学术研究领域,基本上机器人算法都会给出ROS版本的源程序。最早在2009年ROS发布的“ROS: an open source Robot Operating System” 论文,目前已经被引用了2871次;4、企业界:目前已经有很多机器人公司采用了ROS系统来开发一些应用于全新市场的产品,如ClearPath、Rethink、Unbounded、Neurala、Blue River、Big-i,最典型的就是Willow Garage的PR2机器人。投资机构也对创业公司给予了极大的支持,仅2015年相关风险投资机构就在基于ROS操作系统的机器人公司投资了超过1.5亿美元。Nvidia、博世、高通、英特尔、宝马以及大 疆等大公司也纷纷推出ROS接口。
ROS主要特点:
1)点对点设计
一个使用ROS的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系,如图2所示。虽然基于中心服务器的那些软件框架也可以实现多进程和多主机的优势,但是在这些框架中,当各电脑通过不同的网络进行连接时,中心数据服务器就会发生问题。ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
2)多语言支持
ROS现在支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。
3)精简与集成
ROS建立的系统具有模块化的特点,各模块中的代码 可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。ROS基本将复杂的代码封装在库里 ,只是创建了一些小的应用程序为ROS显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。 作为一种新加入的有优势,单元测试当代码在库中分散后也变得非常的容易,一个单独的测试程序可以测试库 中很多的特点。ROS利用了很多现在已经存在的开源项目的代码,比如说从Player项目中借鉴了驱动、运动 控制和仿真方面的代码,从OpenCV中借鉴了视觉算法方面的代码,从OpenRAVE借鉴了规划算法的内容,还有很 多其他的项目。在每一个实例中,ROS都用来显示多种多样的配置选项以及和各软件之间进行数据通信,也同 时对它们进行微小的包装和改动。ROS可以不断的从社区维护中进行升级,包括从其他的软件库、应用补丁中 升级ROS的源代码。
4)具有丰富的工具包,且免费开源。
如何学习ROS?
要想学ROS,应该从哪里入手,它的先后顺序是怎样的呢?ROS由四大部分构成,第一个是基础结构,这些通讯机制是如何实现的;第二个是工具,包括仿真工具、调试工具等;第三个是体现它功能的package;第四个就是社区,如何去上面下载、发布代码,和其他开发者交流学习。
ROS-设计思想:分布式架构
设计思想主要是分布式架构,将机器人的功能和软件,做成一个个节点,然后每个节点通过topic进行沟通,但你这些节点可以部署在同一台机器上,也可以部署在不同机器上,还可以部署在互联网上。
ROS-核心概念
ROS核心概念如下:
1)Nodes->节点
节点是各自独立的可执行文件,能够通过话题、服务或参数,与服务器或其他进程(节点)通信。ROS通过使用节点的方式将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。同时,节点允许了ROS系统能够布置在任意多个机器上并同时运行。关于节点需要注意的事项,节点在系统中必须有唯一的名称;节点可以使用不同的库进行编写,如roscpp和rospy,其中roscpp基于C++,rospy基于Python。
2)Messages and Topics->消息与话题(或主题)
节点之间通过topic机制进行通信,topic机制是一个一对多的Publish/Subscribe 模式: 同一个话题也可以有很多个订阅者,它的底层传输依靠的是TCP/IP,也可以是UDP。topic具体传输的message,具有一定的类型和数据结构,包括ROS提供的标准类型,和用户自定义类型。
3)Services and Parameters->服务与参数
除了topic,ROS还提供另一种一对一的机制,也就是Service/Client,当你需要直接与节点通信并获得应答时,将无法通过话题实现,这时需要使用该服务。
4)ROS Master->ROS管理器
Master向ROS系统中其他节点提供命名和注册服务,跟踪和记录话题的发布者和订阅者,使ROS 节点之间能够相互查找。一旦节点找到了彼此,就能建立一种点对点的通信方式。
5)Stacks and packages->堆栈与功能包
那么如何组织代码呢?这主要依靠功能包(Package) ,ROS中软件组织的基本形式,用于创建ROS程序。功能包包含源代码和功能包清单(Manifest) 。功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。功能包清单是一个manifests.xml文件,通过这个文件能够实现对功能包的管理。
ROS核心模块包括通信结构基础、机器人特性功能以及工具集。通信结构基础包括消息传递、记录和回放消息、远程过程调用、分布式参数系统;机器人特性功能包括标准机器人消息,机器人几何库,机器人描述语言,抢占式远程过程调用,诊断,位置估计、定位与导航;工具集包括命令式工具、可视化工具以及图形化接口。详情见图3
ROS-核心工具
ROS拥有很多第三方的核心工具的支持,或者说Package。比较常见的是这五个工具:Gazebo是一个三维仿真环境;OpenCV是计算机视觉库,PCL是点云库,MoveIt!是机械臂的规划控制库,Industrial是工业上会用的库。另外MRPT,是一个非常好的机器人编程工具箱。然后,如果对实时控制要求比较高的话,可以考虑The Orocos Project。
ROS常用命令工具包括rostopic (Topics)、rosservice (Services)、rosnode (Nodes)、rosparam (Parameters)、rosmsg (Messages)、rossrv (Services)和roswtf (General debugging)。
ROS用的最多的可视化工具是rqt(集成图像交互界面)和 rviz(3D 可视化工具)。
ROS具有非常强的数据存储/回放功能,也就是使用bag存储topic(例如现实中的传感器数据),以后调用bag的topic数据则不必每次都在现实中运行机器人,速度非常快。
ROS log系统记录软件运行相关信息,便于以后的调试。
仿真环境由易到难主要有这三个:Turtlesim、ArbotiX、Gazebo。Turtlesim是一个QT开发的2D轨迹显示界面,只能显示运动轨迹;ArbotiX是含有一个差速驱动机器人的rviz模拟器,机器人运动及topic数据的3D显示,但不包含物理学引擎;Gazebo是功能齐全的3D物理模拟器,不过缺点是非常重,对内存和显卡要求高,慎入
ROS-版本选择
目前,ROS是一年推出一个版本。通过下载统计,我们发现现在使用最多的还是Indigo,所以对于初学者,建议还是使用这个版本,因为这是目前使用人数最多、坑最少的版本。而如果Linux编程能力比较强的,可以使用Kinetic,它可以一直支持到2021年。然后,你在选择Ubuntu版本时,要与ROS版本需匹配。引用原文一个图表示:
另外,ROS的IDE以及Linux,直接贴TOP Liu的原图,见图5-6:
对于大众学习者、普通开发者、机器人算法开发者,在2017年仍推荐使用ROS。对于软件架构的学习者、强调实时性的开发者,建议关注ROS2.0 。另外,我在知乎上对于这个问题也有详细的回答,有兴趣的可以去ROS和ROS2.0现在到底该学习哪个呢?。
最后,摆放一些个ROS常用网站:ROS学习中文网站,ROS Indigo入门系列博客、TOP Liu大神也提到,可以根据ROS学习中文网站上的tutorials入门,主要是学习初级教程。剩下的就是各种实战。
开启ROS学习进程!加油