笔者以前是机械专业,对于计算机方面的学习是少之又少,接触机器人的学习之后,比如路径规划、算法等,发现很难入门,不过慢慢摸爬滚打之后还是有了一些认识,俗话说的好,学习最好的方法就是复述,复述学习法也是我推荐大家采用的一种学习方法,能够写下这篇博客也是鼓起勇气来写的,为的是理清自己所学的知识体系,能够让完全不懂计算机的人也能够看懂什么是ROS,若是有同学对部分地方有异议还望提出,我也会随着学习ROS的深入逐渐将以往自己写的BLOG进行完善。 2. 站在哲学领域看ROS虽说是自己对ROS的概述,但是还是避免不了参考很多牛人的博客,自己主要参考了古月居博主的博客,大家如果学习ROS也建议大家多去逛逛他的博客,很受用。 (1)ROS从何处来? (2)ROS来到这个世界的目的是什么? 这个问题可得询问斯坦福大学的机器人专家了,为什么开发了这样一个机器人操作系统,不过目前大家也都知道了。最初人们是想设计制造一个复杂的机器人,这个机器人能够类似于人一样能够感知,自我导航,能够自我控制去做一些复杂的工作。面对这么复杂的工作,在研发过程中肯定需要很多各样的有效资源的共享,但是目前很多资源要么难以共享,要么共享的资源之间不能直接拿过来用,所以,急需这样一个能够整合资源的框架和接口,使得资源之间能够共享使用,换个专业点的话说,就是使得各种功能、各种软件的重复利用率增加。因此为了 满足这一功能和作用,我们研发了ROS(robotics operating system)机器人操作系统,虽然表面上叫做操作系统,但是并不是真正的操作系统,说白了,就是一个框架,一个平台。 (3)ROS将来会去哪里?发展如何发展? ROS目前应用得非常广泛,春晚的百度无人车队大家可以去搜一搜,看一看,百度花大价钱能够对ROS进行开发,说明这个东东确实还算是比较有价值的一个东东。 ROS目前能够应用的是机器人领域,包括移动机器人和机械臂,移动机器人应该是应用最广泛的,主要是应用于机器人的建模、感知、导航、规划等,其可以和普通机器人结合进而控制真实机器人,功能的确强大,而且随着目前的发展势头,其功能是越来越强大。下面简单以几个例子来说明。 从这幅图可以看出,ROS能够完成的东西还是真的挺多的哈,用其搭建的机器人完全就可以当成一个服务机器人来用了,可以叠衣服、做饭,还可以陪你玩桌球。 下面这幅图是ROS用在无人车领域,可以自动构建地图、导航和规划行进路径,和前面所说的百度无人车类似。 目前ROS能够结合的机器人也挺多的,国际上有名的工业机器人、协作机器人、服务机器人等绝大多数都已经用ROS开发过,所以在网上也是大把的资源。 但是ROS也有一些问题,就是目前实时性不是太强,所以ROS也推出了2.0版本,还有就是ROS在运行的时候容易崩溃,所以稳定性也有待提高,但是从总体上看,ROS运用在机器人领域还是蛮有优势的。 3.ROS具体介绍 其实说到具体介绍,肯定也不会太具体,本文先横向介绍ROS的整体框架,然后纵向介绍ROS系统层次,最后具体对ROS的安装以及主要文件夹的功能进行解释。(有的人可能会说“整体框架”和“系统层次”感觉差不多啊,的确,这两个词乍一看起来根本不知道在说啥,举个栗子吧,整体框架是横向广度的介绍,而系统层次是纵向深浅层次的介绍,我们既要横向看待ROS,也必须纵向看待ROS,人在不断进步的过程中也是一样,既要纵向扩展深度,也必须横向扩大视野) 3.1ROS横向介绍ROS横向介绍我们看下面这幅图,这幅图也是古月居博主总结的,前面我们说过ROS的总体目标,也就是提高软件复用率,下面我们主要介绍它的五个特点和四位一体。 (1)点对点设计 是不是看了这段话还是一脸懵逼?可能有的人是的吧,比如如果我第一次学习ROS看到这句话我也会觉得一脸懵逼,在此处我举一个比较形象的栗子吧:我们使用的手机有主机、充电器、耳机这三个部分,这三个部分各有各的功能,也就可以被看做是手机(机器人)的一个个节点(功能、进程),这样将一个个功能节点分开的设计能让我们提高耳机、充电器的复用率,比如你朋友手机没电了,可以借你的充电器用,假如你耳机坏了,可以去找你同学借耳机用,这样,一个机器人的一部分功能(充电器、耳机)可以方便的复用,岂不快哉,而假如不采取这种点对点设计,充电器耳机与主机设计成一体,整个手机就只能你一个人用,你同学想借充电器或者你想去借耳机就根本就借不了了。 经过上述的介绍你可能就会懂了,还不懂的话就留言吧! (2)多语言支持 (3)架构精简,集成度高 (4)组件化工具包丰富 (5)免费且开源 这个更好理解,ROS目前是免费的,并不像很多软件一样需要收费,因此我们只能用破解版,但是ROS正版就是免费的,很好,而且这个软件开源,ROS上你可以从全世界各大牛人分享的东东中找对自己有用的东西拿过来用,很方便。 3.1.2四位一体 对ROS进行总结便形成了ROS四位一体的格局,首先是ROS的通讯机制,这个大家都知道了,点对点通讯。其次是ROS具备很多开发工具,比如rviz等。接着,ROS的功能也非常多,在ROS中是以一个叫做功能包的形式存在的(注:此处的功能和节点不能混为一谈,大家可以理解为一个大功能,而节点可以理解为一个个小功能),其应用功能设计视觉导航、运动规划多个方面。最后,ROS也不是一个单独的软件,它所存在的环境有各大牛人,各大公司,全世界都在使用它,相当于一个活跃的生态系统。 3.2ROS纵向介绍 ROS的纵向介绍主要从小到大,从深到浅进行介绍,整个ROS系统分为以下三个层次,如图 这个层次最深,主要是描述程序是如何运行的,也就是ROS当中很细节的层次,这个层次我们主要介绍几个概念,这几个概念分别是节点、节点管理器、话题、服务。 (3)话题 这个就比较重要了,涉及到ROS的通讯,前面说过,ROS的通讯机制是点对点通讯,也就是一个个节点之间的通讯,ROS节点之间的主要通讯方式是两种,这个话题通讯就是一种,另外一种是接下来会介绍到的第(4)点中的服务通讯,话题通讯和服务通讯是主要的通讯方式,这两种通讯方式的区别如下图所示,大家可以先看下面对这两种通信方式的具体介绍之后再来看这张表进行对比。 首先介绍ROS的话题通讯,ROS的话题通讯信息流图如下: 看到这幅图可能是懵逼的,接下来我们详细介绍。 假设一个节点需要某种类型的信息,假设这种类型是“bar”,也就是我们所说的话题,那这个节点必须接收这种话题的信息,我们把这个节点称之为接收者或者订阅者(listener),因此它会向节点管理器(ROS Master)求助,节点管理器(ROS Master)然后便会帮助这个接收者(listener)找正在发布这种话题“bar”的节点,这个节点我们称之为发布者(talker)找到之后便会帮助这两个节点建立连接,然后通讯。 总体上来说一下步骤(图中步骤是七个,此处精简为五个步骤): 从以上步骤可以看出,五个步骤全部都是在进行通信,通信的过程中有一个字眼叫做协议,至于这个概念,我们先来看百度百科。 其实也就是说相当于一个规则,我们生活在社会上需要遵守规则,家有家规,公司有公司的规定,你不是公司的人,公司的门卫是不会轻易让你进公司的,所以在通信领域,也必须有协议,两个节点需要通信,什么时候通信,采用什么语言等均在协议中说明。 在话题通信中使用的协议有RPC协议和TCP协议,不同的协议用处不一样。 (4)服务 服务通信是单向的,大家可以很容易理解,信息流只能是由发布者流向接收者,而且节点之间的通信是有延迟的,并不同步,针对这两个缺陷,这个小点介绍的服务通信则满足了双向同步的通信,此外,服务通信两端的节点一个叫服务器(talker),一个叫客户端(listener),服务器还是发布数据信息的,客户端则是接收数据信息的,但是这种通信只允许有一个服务器,客户端可以有多个,服务器和客户端之间双向同步通信,采取请求和应答的模式进行通信,如下图所示。 服务通信的方式和话题通信的方式大同小异,也是节点管理器管理节点,然后采取相应的通信协议进行信息的通信,具体步骤此处也不再赘述。 对于计算图层,我们就暂时介绍到这里,其实计算图层也就是描述ROS当中的一些节点及其通讯方式。 3.2.2文件系统层接下来介绍ROS的上面的一个文件系统层次,文件系统,说白了,就不再讨论具体的程序和通讯了,而是了解各个文件的结构以及它们之间的联系,ROS的文件的组织和排列是按照功能来进行的,不同功能的文件被放置在不同的文件夹下面,**功能包(package)**是ROS的文件系统层次下一个比较基本的单元,ROS的文件系统层次也是围绕它来展开: 一个功能包分为多个部分,如下: (1)功能包清单(package manifest):这个的作用主要是记录功能包信息,包括各个功能包的信息以及发行者,还有功能包之间的依赖关系,编译的相关信息等。其实类比节点,节点管理器之于节点就好像功能包清单之于功能包,都是管理者的角色。 (2)消息类型:这个其实就是描述ROS采用话题通信的时候的消息的类型的文件,通过这个文件可以了解这个功能包的相关通信接口; (3)服务类型:这个跟(2)类似,描述服务通信的时候的服务类型的文件,通过这个文件可以了解这个功能包的相关通信接口; (4)代码:一个个的节点是通过相应的编程语言进行编写的,其代码称作源代码,存放于特定文件夹之中。 至于元功能包,其实可以理解为小功能包组成的大功能包,为了实现一个更大的功能。 3.2.3开源社区层讲到第三个层次,也就基本上是ROS中最外层的层次了,也是我们最好理解的层次,开源社区层,从前面所说的ROS的五个特点的最后一个特点“免费且开源”我们可以知道,ROS的开源可以让很多人共享资源,这个共享资源的平台也就可以称之为ROS的开源社区。 如下图所示,ROS的开源社区主要包括以下几个方面或部分,很简单的内容,也就是一些网站、博客之类的,其中软件源的意思可能难以理解一点,ROS有各种功能的功能包,ROS安装的时候只会安装固定的安装包,如果你要搭建自己的机器人,需要很多你自己需要的特定功能的功能包,你可以自己写功能包源代码,当然你也可以从开源社区中寻找,直接采用软件源的形式下载别人的功能包来参考使用。 好了,ROS纵向的介绍也介绍完毕了,下面我们来总结一下ROS的整体结构,从小到大,最小的肯定是节点,最大的就是开源社区了,节点跟细胞一样,开源社区就有如我们生活的生态系统。下面这幅图就是从小到大描述的ROS的结构层次。 从这幅图可以很清楚的看到ROS的层次性构造,最小的就是节点,节点之间主要通过话题和服务这两种方式通讯,多个节点之间连接器起来可以完成一定的功能,形成一个具有一定功能的功能包,多个具有相似功能或任务的功能包又组成一个大的元功能包,同理,多个元功能包又可以形成一个软件仓库,一个软件往往可以完成多个功能,一个ROS开源社区内部又存在多个软件仓库。 讲到这里,大家对于ROS的理解想必更深了一些。 3.3ROS安装及其主要文件夹介绍前面对ROS进行了一些口头上的描述,我们要使用ROS肯定需要在自己的电脑上安装它,接下来主要就是对ROS的安装以及安装之后所在的文件夹进行介绍。 3.3.1ROS的安装ROS是在Linux系统上运行的,一般选择Linux的Ubuntu系统进行安装,大家可以参考下面这个博客,也是笔者所作,是在原有windows7基础上安装Ubuntu双系统,写的非常详细。 ROS安装之后的安装目录默认在“计算机/opt/ros/”安装目录下,如下图所示,大家打开之后会看到下面这五个文件夹。 ROS下面共有五个文件夹,然后其他几个文件都是一些脚本文件,至于什么是脚本文件,可以理解成为方便让系统找到一些命令程序、软件包所在位置的文件,比如我们这里有五个文件夹,如果系统需要执行其中某个文件夹下的命令 ,那必须找到这个文件夹,而脚本文件就帮助系统找到这个文件夹的位置。五个文件夹中比较重要的是include文件夹、lib文件夹、share文件夹,下面具体介绍这五个文件夹。 (1)bin文件夹 如下图所示,文件夹下面保存的基本是一些可执行的程序和命令,很多都是在ROS的终端界面可以直接运行的命令行,而如果需要在终端中调用命令行运行命令,就必须找到这个命令行程序,也就需要找到bin文件夹,也就需要前面所说的脚本文件,此外,还需要设置环境变量,设置环境变量的方法很简单,系统为我们已经准备好了脚本文件,我们只用将这些脚本添加到ROS的终端配置文件里面即可。 (2)etc文件夹 这个文件夹用的少,主要是ROS 的一些配置文件。 (3)include文件夹 (4)lib文件夹 (5)share文件夹 注意:如果我们需要真正的操作搭建机器人,我们并不是直接在上述这个ROS文件夹下进行的,我们需要额外建立一个文件夹,称之为工作空间,然后我们在那个工作空间下会创建自己的功能包,进行一系列开发工作。 4. 小结讲到这里也暂时告一段落了,ROS的学习是一个漫长的过程,它始终是一个平台,一个工具,我们学习它也需要知道我们为什么学,我们是要去完成一个什么样的任务,这个很重要,而不是为了学ROS而去学习ROS,不要看到别人都在学习ROS我们也效仿别人去学习它,我们得有一个具体的任务,然后有一套自己具体的理论,最后用这个工具来帮助我们实现。 关于ROS的学习方法,最好还是先看一下ROSwiki上面的教程的初级部分,也就是初学者部分,然后打住,可以看看古月居博主的视频教程,然后自己在网上找找牛人的博客,自己亲手敲代码实践,实践出真知,祝大家学习进步! (责任编辑:) |