1. 前言

笔者以前是机械专业,对于计算机方面的学习是少之又少,接触机器人的学习之后,比如路径规划、算法等,发现很难入门,不过慢慢摸爬滚打之后还是有了一些认识,俗话说的好,学习最好的方法就是复述,复述学习法也是我推荐大家采用的一种学习方法,能够写下这篇博客也是鼓起勇气来写的,为的是理清自己所学的知识体系,能够让完全不懂计算机的人也能够看懂什么是ROS,若是有同学对部分地方有异议还望提出,我也会随着学习ROS的深入逐渐将以往自己写的BLOG进行完善。

2. 站在哲学领域看ROS

虽说是自己对ROS的概述,但是还是避免不了参考很多牛人的博客,自己主要参考了古月居博主的博客,大家如果学习ROS也建议大家多去逛逛他的博客,很受用。
为什么要从哲学领域看ROS呢,其实我自己有两个观念,第一是我们若想真正训练我们自己的思维方式,必须对事物的本质能够有强烈的好奇心,其次,哲学也是任何科学探索的本质,所有的科学真理问题,都将回归到哲学上的三个终极问题:
1.我从哪里来?
2.我活着为了什么?
3.将来去哪里?
西方有一本书《圣经》完全解释了这三个问题,而且这三个问题也与越来越多的现代历史考古以及科学领域形成了统一的逻辑,所以哲学还是挺有意思的,让人们认清事物最原始的本质。

(1)ROS从何处来?
从下面这张图片来看,ROS是2007年诞生与斯坦福大学,斯坦福大学,世界名校,而且是专业研究机器人的,目前也在从事人工智能的研发,ROS诞生于这样的贵族,可见ROS的发展还是非常有前途的。
从这张图片来看,ROS是2007年诞生与斯坦福大学,斯坦福大学,世界名校,而且是专业研究机器人的,目前也在从事人工智能的研发,ROS诞生于这样的贵族,可见ROS的发展还是非常有前途的
(2)ROS来到这个世界的目的是什么?
这个问题可得询问斯坦福大学的机器人专家了,为什么开发了这样一个机器人操作系统,不过目前大家也都知道了。最初人们是想设计制造一个复杂的机器人,这个机器人能够类似于人一样能够感知,自我导航,能够自我控制去做一些复杂的工作。面对这么复杂的工作,在研发过程中肯定需要很多各样的有效资源的共享,但是目前很多资源要么难以共享,要么共享的资源之间不能直接拿过来用,所以,急需这样一个能够整合资源的框架和接口,使得资源之间能够共享使用,换个专业点的话说,就是使得各种功能、各种软件的重复利用率增加。因此为了 满足这一功能和作用,我们研发了ROS(robotics operating system)机器人操作系统,虽然表面上叫做操作系统,但是并不是真正的操作系统,说白了,就是一个框架,一个平台。
(3)ROS将来会去哪里?发展如何发展?
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的总体目标,也就是提高软件复用率,下面我们主要介绍它的五个特点和四位一体。

在这里插入图片描述

3.1.1五个特点

(1)点对点设计
看到这个标题,如果不了解计算机通讯,是看不懂的,其实这个就是说的就是ROS的一个核心东东,也就是节点,节点这个东西为什么是核心呢,其实节点还有两个名字,**节点就是功能,节点就是计算机术语中常说的进程,**泛泛地可以这么理解,一个机器人有多个功能,因此也就有了多个节点,因此,如果一个机器人的各个功能被分开,也就是一个个的节点,那ROS进行软件的复用就会方便的多。

是不是看了这段话还是一脸懵逼?可能有的人是的吧,比如如果我第一次学习ROS看到这句话我也会觉得一脸懵逼,在此处我举一个比较形象的栗子吧:我们使用的手机有主机、充电器、耳机这三个部分,这三个部分各有各的功能,也就可以被看做是手机(机器人)的一个个节点(功能、进程),这样将一个个功能节点分开的设计能让我们提高耳机、充电器的复用率,比如你朋友手机没电了,可以借你的充电器用,假如你耳机坏了,可以去找你同学借耳机用,这样,一个机器人的一部分功能(充电器、耳机)可以方便的复用,岂不快哉,而假如不采取这种点对点设计,充电器耳机与主机设计成一体,整个手机就只能你一个人用,你同学想借充电器或者你想去借耳机就根本就借不了了。
在这里插入图片描述

经过上述的介绍你可能就会懂了,还不懂的话就留言吧!

(2)多语言支持
这个好理解,上面第(1)点我们介绍了ROS是有多个节点的,节点之间可能会有联系,但是联系又没有那么紧密,每个节点都是一个功能,它们可以分别使用不同的编程语言进行编程,如C++、Python、Java等编程语言,无论采用哪种编程语言进行编程,最后节点之间进行信息交互的时候都可以通过与语言无关的一个接口进行连接

(3)架构精简,集成度高
这个特点说明的主要是ROS的一个宏观描述,就是描述ROS这一操作系统还是一个看起来结构比较简单,操作不难,而且功能集成丰富,大家字面理解就行。

(4)组件化工具包丰富
这个字面理解就是说ROS有很多功能强大的工具,比如仿真界面工具rviz,仿真环境gazebo,rqt_plot图形化显示工具等,现在这些工具大家可能不懂具体能干什么,不过这些工具在大家学习到ROS的过程中都会碰到,而且是经常使用的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(5)免费且开源
这个更好理解,ROS目前是免费的,并不像很多软件一样需要收费,因此我们只能用破解版,但是ROS正版就是免费的,很好,而且这个软件开源,ROS上你可以从全世界各大牛人分享的东东中找对自己有用的东西拿过来用,很方便。

3.1.2四位一体

在这里插入图片描述
对ROS进行总结便形成了ROS四位一体的格局,首先是ROS的通讯机制,这个大家都知道了,点对点通讯。其次是ROS具备很多开发工具,比如rviz等。接着,ROS的功能也非常多,在ROS中是以一个叫做功能包的形式存在的(注:此处的功能和节点不能混为一谈,大家可以理解为一个大功能,而节点可以理解为一个个小功能),其应用功能设计视觉导航、运动规划多个方面。最后,ROS也不是一个单独的软件,它所存在的环境有各大牛人,各大公司,全世界都在使用它,相当于一个活跃的生态系统。

3.2ROS纵向介绍

ROS的纵向介绍主要从小到大,从深到浅进行介绍,整个ROS系统分为以下三个层次,如图
在这里插入图片描述

3.2.1计算图层

这个层次最深,主要是描述程序是如何运行的,也就是ROS当中很细节的层次,这个层次我们主要介绍几个概念,这几个概念分别是节点、节点管理器、话题、服务。
(1)节点
这个前面已经介绍过,就是指功能,或者说是进程,也可以当做一个个软件模块,不再赘述。
(2)节点管理器
节点管理器说白了就是管理节点的,跟指挥中心一样,类似于每一个固定电话是一个节点,那节点管理器就是基站,总站。
在这里插入图片描述
(3)话题
这个就比较重要了,涉及到ROS的通讯,前面说过,ROS的通讯机制是点对点通讯,也就是一个个节点之间的通讯,ROS节点之间的主要通讯方式是两种,这个话题通讯就是一种,另外一种是接下来会介绍到的第(4)点中的服务通讯,话题通讯和服务通讯是主要的通讯方式,这两种通讯方式的区别如下图所示,大家可以先看下面对这两种通信方式的具体介绍之后再来看这张表进行对比。
在这里插入图片描述

首先介绍ROS的话题通讯,ROS的话题通讯信息流图如下:
在这里插入图片描述
看到这幅图可能是懵逼的,接下来我们详细介绍。

假设一个节点需要某种类型的信息,假设这种类型是“bar”,也就是我们所说的话题,那这个节点必须接收这种话题的信息,我们把这个节点称之为接收者或者订阅者(listener),因此它会向节点管理器(ROS Master)求助,节点管理器(ROS Master)然后便会帮助这个接收者(listener)找正在发布这种话题“bar”的节点,这个节点我们称之为发布者(talker)找到之后便会帮助这两个节点建立连接,然后通讯。

总体上来说一下步骤(图中步骤是七个,此处精简为五个步骤):
**第一步:**信息的发布者(talker)和接收者(listener)都必须向节点管理器(ROS Master)注册自己的信息,就跟人员登记一样,节点管理器需要知道你这个节点的地址等信息,为什么需要知道呢,因为ROS的节点在实际机器人设计中,可能都存在于一个计算机之中,也可能分布于不同的计算机,因此需要地址等信息来对节点进行确定;
**第二步:**节点管理器在确定需要通信的两个节点之后就会对两个节点的信息进行匹配;
**第三步:**接收者(listener)向发布者(talker)发送自己的TCP通讯协议以及连接请求;
**第四步:**发布者(talker)确定连接请求,然后将自己的TCP地址发送给接收者(listener);
**第五步:**两个节点正式建立连接,并以TCP协议进行数据传输。

从以上步骤可以看出,五个步骤全部都是在进行通信,通信的过程中有一个字眼叫做协议,至于这个概念,我们先来看百度百科。
在这里插入图片描述
其实也就是说相当于一个规则,我们生活在社会上需要遵守规则,家有家规,公司有公司的规定,你不是公司的人,公司的门卫是不会轻易让你进公司的,所以在通信领域,也必须有协议,两个节点需要通信,什么时候通信,采用什么语言等均在协议中说明。
在这里插入图片描述
在话题通信中使用的协议有RPC协议和TCP协议,不同的协议用处不一样。

(4)服务
在第(3)点介绍中,我们讲解话题通信的主要过程,我们是以两个节点之间的通信为例进行讲解,但是实则,话题通信可以多个节点与多个节点进行通信,比如一个节点发布一种话题的信息,有五个节点都需要这种信息,则这五个节点都可以订阅并且接收这种信息。

服务通信是单向的,大家可以很容易理解,信息流只能是由发布者流向接收者,而且节点之间的通信是有延迟的,并不同步,针对这两个缺陷,这个小点介绍的服务通信则满足了双向同步的通信,此外,服务通信两端的节点一个叫服务器(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双系统,写的非常详细。
Windows7上安装Ubuntu双系统
安装完成Ubuntu系统之后就可以在Ubuntu系统上打开终端(终端是一个黑色的窗口,任何界面直接按键盘快捷键Ctrl+Alt+T即可打开终端界面。),然后按照ROS wiki官网的ROS安装教程安装ROS,大家记得选择你所安装的Ubuntu版本以及你想安装的ROS的版本。

3.3.2ROS安装后的文件夹介绍

ROS安装之后的安装目录默认在“计算机/opt/ros/”安装目录下,如下图所示,大家打开之后会看到下面这五个文件夹。
在这里插入图片描述
ROS下面共有五个文件夹,然后其他几个文件都是一些脚本文件,至于什么是脚本文件,可以理解成为方便让系统找到一些命令程序、软件包所在位置的文件,比如我们这里有五个文件夹,如果系统需要执行其中某个文件夹下的命令 ,那必须找到这个文件夹,而脚本文件就帮助系统找到这个文件夹的位置。五个文件夹中比较重要的是include文件夹、lib文件夹、share文件夹,下面具体介绍这五个文件夹。
(1)bin文件夹
如下图所示,文件夹下面保存的基本是一些可执行的程序和命令,很多都是在ROS的终端界面可以直接运行的命令行,而如果需要在终端中调用命令行运行命令,就必须找到这个命令行程序,也就需要找到bin文件夹,也就需要前面所说的脚本文件,此外,还需要设置环境变量,设置环境变量的方法很简单,系统为我们已经准备好了脚本文件,我们只用将这些脚本添加到ROS的终端配置文件里面即可。
在这里插入图片描述
(2)etc文件夹
这个文件夹用的少,主要是ROS 的一些配置文件。

(3)include文件夹
这个文件夹比较重要,里面放置的是头文件,这个大家就比较熟悉了,学过C语言的都知道,每次我们在写程序的第一行就是#include <stdio.h>,这个里面就包含了一个头文件。
ROS里面的某一具体的头文件属于某一具体的功能包,如果一个功能包需要依赖另外一个功能包,也就是要与另外一个功能包建立联系,那必须要包含另外那个功能包的头文件,功能包的头文件在功能包安装的时候就被存放于这个文件夹。

(4)lib文件夹
这个文件夹放置的就是一些可执行程序

(5)share文件夹
这个文件夹放置的全部是ROS里面已经安装的功能包,主要包含功能包的各种信息,包括其接口、配置信息等。

注意:如果我们需要真正的操作搭建机器人,我们并不是直接在上述这个ROS文件夹下进行的,我们需要额外建立一个文件夹,称之为工作空间,然后我们在那个工作空间下会创建自己的功能包,进行一系列开发工作。

4. 小结

讲到这里也暂时告一段落了,ROS的学习是一个漫长的过程,它始终是一个平台,一个工具,我们学习它也需要知道我们为什么学,我们是要去完成一个什么样的任务,这个很重要,而不是为了学ROS而去学习ROS,不要看到别人都在学习ROS我们也效仿别人去学习它,我们得有一个具体的任务,然后有一套自己具体的理论,最后用这个工具来帮助我们实现。

关于ROS的学习方法,最好还是先看一下ROSwiki上面的教程的初级部分,也就是初学者部分,然后打住,可以看看古月居博主的视频教程,然后自己在网上找找牛人的博客,自己亲手敲代码实践,实践出真知,祝大家学习进步!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐