ROS基础
本章讲解ROS中最基础的概念,不明白这些概念是没法学懂ROS的,学习了这些概念,后面我们将通过实操来在实践的过程中进一步体会
ROS是什么
ROS (Robot Operating System, 机器人操作系统)是一个提供一系列程序库和工具以帮助软件开发者创建机器人应用的软件。
它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。
简单的来说,ROS是一个机器人操作系统,是一系列软件的集合.这些软件加在一起能够实现控制机器人这个目的
在此基础上,我们可以选择合适的软件来辅助我们完成任务
1.ROS中的核心概念
节点Node
ROS将机器人需要执行的任务分解成多个小步骤,然后将每个步骤以进程的形式实现,而每个进程则称为节点
例如机器人视觉,我们将相机驱动程序打包成一个节点,然后将对相机采集到的图像处理程序打包成一个节点,最后将图像显示程序打包成一个节点,如下图
节点的特点
- 每个节点编写的编程语言不是固定的,有的可能是C++,有的可能是Python.
对于节点而言我们并不关注其具体的实现方式,我们只关注这个节点实现的功能 - 为了保证节点在不同的机器上都能运行,节点不能依赖于当前的环境,因此所有的节点都是可执行的二进制文件
- 节点不能重名
节点管理器ROS Master
继续上面机器人视觉的例子,上面的例子中我们为了实现机器人视觉这个任务,我们一共有三个节点,分别是相机驱动节点,图像处理节点和图像显示节点,
这三个节点之间也存在关系,相机驱动节点会将采集到的图像给图像处理节点,而图像处理节点将处理好的数据给图像显示节点
然而通常来说完成一个真实世界中的任务需要的节点数量很多,可能高达一两百个节点,如果对这么多的节点没有很好地管理最后就会造成混乱,因此ROS中提供了用于管理节点的ROS Master,如下图
这三个节点想要被运行就必须要在ROS Master中注册
节点管理器的特点
- 节点管理器为节点提供命名和注册服务
- 节点管理器会跟踪和记录节点之间的关系,而节点之间的关系通常是以话题和通信的形式实现的数据传输,这点将在后面讲到
- 节点管理器负责提供全局的参数,即提供参数服务器,因为在某些时候,多个节点之间可能会共用某些参数,这个时候ROS Master负责记录这些参数,并且再需要的时候提供这些参数
参数
参数指的是节点之间共享的,存储在ROS Master中的字典
例如机器人的视觉不仅需要看到当前看到的图像,还需要当前看到的角度,来让机器人明白自己看的是那个地方的图像,换而言之相机的俯仰角等参数信息,而这个信息则是三个节点共享的
参数的特点
- 参数由ROS Master统一管理,具体管理事项有:参数的添加,参数的访问等等
- 参数可以通过网络访问
- 参数适合存储静态,非二进制的配置参数
2.ROS中的通信机制
话题通讯机制 – 异步通信机制
话题通讯机制类似于UDP协议,具体来说数据发布的节点只负责进行发布数据,而数据接收的节点只负责接受数据
具体哪个节点在发布数据,哪个在接受数据则互不关心
消息Message
我们继续回到刚才机器人视觉的例子,在上面的例子中三个节点之间进行了数据的传输,即图像的传递
但是节点可以是不同的语言编写的,而不同的语言之间的存储数据的方式不一样,例如Python的列表和字典,C++中的数组和向量
不同的节点之间往往又涉及到数据的传输,为此ROS定义了标准的节点之间数据的传输格式
这些节点之间传输的以ROS标准的格式书写的数据称为消息,节点之间数据的传输靠消息
消息的特点
- 消息的具体实现是使用了与编程语言无关的
.msg
文件,在编译的过程中生成相应的代码 .msg
文件本质是纯文本文件,但是就像html,xml和json等文件一样,具有一定的格式 / 数据类型
ROS中为我们预定义好了很多数据,包括图像,雷达点云等等,当然我们也可以自己定义消息的类型
话题Topic
话题是节点之间用于传输数据的总线
他可以是一个文件夹,例如上面的摄像机的例子,相机驱动节点将采集到的图像放到一个文件夹下面,而图像处理节点读取这个文件夹的图片,这个时候这个文件夹就是一个话题
话题的特点
- 话题使用发布/订阅模型
- 一个话题的订阅者和发布者可以不唯一
订阅者Subscriber / 发布者Publisher
发布者指的是一个话题中消息的发出方,在机器人视觉的例子中就是相机驱动节点
订阅者指的是一个话题中消息的接收方,上面的例子中指的是相机驱动节点和图像处理节点
下面的图片的例子中Topic是example文件夹,话题名也是example,message是符合ROS标准的字符串
服务通信机制 – 同步通信机制
ROS中的另外一种通信机制是服务通信机制,类似于TCP协议,服务通信机制中数据的发布节点和接受节点之间必须建立稳定的联系
请求Request / 应答Answer
和消息一样,ROS对使用服务通信机制的节点之间传输的数据也定义了数据的格式
类似的,是以.srv
为后缀的纯文本文件,在编译中产生对应的代码文件
服务端Server / 客户端Client
服务端指的是发布数据的节点,而客户端指的是接受数据的节点
两种通信机制对比
ROS的文件系统
文件系统指的是文件之间的层级组织结构,在ROS中指的就是各种功能包的层级组织结构
我们可以把几个可以完成独立任务的节点打包为一个功能包,例如独立完成看和抓取和行走的功能包
然后我们将这几个功能包组成一个大的元功能包,例如上面的三个功能包打包成寻找这个元功能包
除了寻找之外,我们还可以制作跑步等元功能包,最终所有的元功能包组合在一起形成一个软件仓库
诸多软件仓库的组合就是ROS社区
功能包的组成
一个功能包通常是一个文件夹,其下有如下内容:
- 功能包清单:描述功能包的作用,作者和更新信息,第三方依赖等等
- 消息类型:功能包中自定义的消息类型
- 服务类型
- 代码
- 其他