笔记3不涉及实际操作,主要是用自己的语言和思路简略整理了《ROS机器人开发实践》一书第2章内容。第一次看这一章的内容会有不知道在讲什么的感觉,但这一章的内容确实对后续实践操作章节的理解有非常大的帮助。
一、ROS架构:
ROS是一个优秀的机器人分布式框架。ROS架构的三个层次:基于Linux系统的OS层;实现ROS核心通信机制以及众多机器人开发库的中间层;在ROS Master的管理下保证功能节点的正常运行的应用层。
1.OS层:
ROS无法直接运行在计算机硬件上,需要依托于Linux、macOS等操作系统运行。
2.中间层:
Linux是一个通用系统,没有针对机器人开发提供的特殊中间件,因此在中间层,ROS封装了关于机器人开发的中间件,主要包括:
(1)基于TCP/UDP网络封装的TCPROS/UDPROS通信系统。
(2)一种用于进程内的通信方法Nodelet,为多进程通信提供一种更优化的数据传输方式。
(3)在通信机制上提供的大量机器人开发相关的库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。
3.应用层:
(1)ROS运行的管理者:Master(负责整个系统的正常运行)。
(2)功能包:ROS社区内共享了大量的机器人应用功能包,这些功能包内的模块以节点为单位运行。
二、重要概念:
从系统实现的角度来看:ROS可分为三个层次:计算图、文件系统、开源社区。
1.计算图:
从计算图的角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接。
(1)节点与节点管理器:
节点(Node,又称“软件模块”):一些执行运算任务的进程,一个系统一般由多个节点组成。
节点管理器(ROS Master):通过远程过程调用(RPC)提供登记列表和对其他计算图表的查找功能。ROS Master是一个管理者,没有它节点将无法找到彼此,也无法交换消息或调用服务,整个系统也将瘫痪。
(2)消息与话题:
消息:ROS中基于发布订阅通信机制传递的一种严格的数据结构,由节点处理消息并进行发送或接收,最终实现想要的功能。可通过rosmsg来查看关于消息的操作。
话题:消息以一种发布/订阅(Publisher/Subcriber)的方式传递。一个节点可以针对一个给定的话题(Topic)发布消息(这个节点称为发布者Talker),也可以关注某个话题并订阅特定类型的数据(这个节点称为订阅者Listener)。
话题是发布者节点和订阅者节点之间传输数据的管道,传输的数据叫做消息。
(3)服务:
服务是节点之间同步通信的一种方式,其中提供服务者称为服务者节点,被服务者称为客户端节点。客户端节点(Client)可以发布请求(Request),服务者节点(Server)处理后反馈应答(Response)。catkin_ws
2.文件系统:
类似于操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件放在不同的文件夹下。
(1)功能包:
功能包是ROS 软件中的基本单元,包含ROS节点、库、配置文件等。
功能包的典型文件结构如下:
1)config:放置功能包中的配置文件,由用户创建,文件名可以不同。
2)include:放置功能包中需要用到的头文件。
3)scripts:放置可以直接运行的python脚本。
4)src:放置需要编译的C++代码。
5)launch:放置功能包中的所有启动文件。
6)msg:放置功能包自定义的消息类型。
7)srv:放置功能包自定义的服务类型。
8)action:放置功能包自定义的动作指令。
9)CMakeLists.txt(必须):编译器编译功能包的规则。
10)package.xml(必须):功能包清单。
(2)功能包清单:
每个功能包都包含一个叫package.xml的功能包清单,用于记录功能包的基本信息。
(3)元功能包:
元功能包是一种特殊的功能包,只包含一个package.xml元功能包清单文件。它的主要作用是将多个功能包整合成为一个逻辑上独立的功能包,类似于集合概念。
元功能包清单的package.xml文件相较于功能包的package.xml文件,需要包含一个引用的标签。
(4)消息类型:
消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。
(5)服务类型:
服务类型定义了ROS客户端/服务器通信模型下的请求和应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。
(6)代码:
用来放置功能包节点源代码的文件夹。
3.ROS文件工程结构(工作空间catkin_ws):
代码文件需要放置到一个固定的空间内,即工作空间。
工作空间就是包含软件包的目录,存放工程开发相关文件。一个典型的工作空间(catkin_ws)包含以下目录:
1)src:源码空间
2)bulid:编译空间
3)devel:开发空间
4)install:安装空间
4.开源社区:
主要是发行版,软件源,ROS wiki,邮件列表,ROS Answer,Blog。
三、ROS的通信机制:
ROS的核心是分布式通信机制,基本通信方式分为以下三种:
1.话题通信机制(异步通信机制):
(1)话题:
节点间用来传输数据的重要总线,使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。
(2)消息:
消息是话题数据,具有一定的类型和数据结构,使用编程语言无关的.msg文件定义,编译过程中生成对应的代码。
(3)话题通信的三个角色:
1)发布者Talker:负责向订阅者发布数据。
2)订阅者Listener:负责接收发布者的数据。
3)管理者ROS Master:负责保管发布者和订阅者注册的信息,并匹配话题相同的发布者与订阅者,帮助发布者与订阅者建立连接。
(4)建立通信的过程:
1)Talker注册
2)Listener注册
3)ROS Master注册
4)Listener发送连接请求
5)Talker确认连接请求
6)Listener尝试与Talker建立网络连接
7)Talker向Listener发布数据
2.服务通信机制(同步通信机制):
(1)服务通信的三个角色:
1)客户端client:负责向服务端发送请求,并接收服务端发送的数据。
2)服务端server:负责接收处理请求,并对客户端作出相应。
3)管理者ROS Master:负责保管客户端和服务端注册的信息,并匹配话题相同的客户端与服务端,帮助客户端和服务端建立连接。
(2)建立通信的过程:
1)Talker注册
2)Listener注册
3)ROS Master进行信息匹配
4)Listener与Talker建立网络连接
5)Talker向Listener发布服务应答数据
(3)对比话题通信极致机制和服务通信机制:
3.参数管理机制:
参数类似于ROS中的全局变量,由ROS Master进行管理,其通信机制较为简单,不涉及TCP/UDP的通信。
(1)参数服务器的三个角色:
1)管理者ROS Master:管理者作为一个公共的容器保存数据。
2)参数设置者Talker:参数设置者往容器中存储数据。
3)参数调用者Listener:参数调用者读取容器中所需的数据。
(2)建立通信的过程:
1)Talker设置变量
2)Listener查询参数值
3)ROS Master向Listener发送参数值