特别声明:本系列文章,源自猛狮团队赵虚左老师,博客发布过程中略有改动,并添加了一些自己的笔记和理解,希望更多的人能学习到这项先进的机器人技术,为祖国的智能化事业舔砖加瓦!
在ROS2中通信方式虽然有多种,但是不同通信方式的组成要素都是类似的,比如:通信是双方或多方行为、通信时都需要将不同的通信对象关联、都有各自的模型、交互数据时也必然涉及到数据载体等等。本节将会介绍通信中涉及到的一些术语。
1.节点
在通信时,不论采用何种方式,通信对象的构建都依赖于节点(Node),在ROS2中,一般情况下每个节点都对应某一单一的功能模块(例如:雷达驱动节点可能负责发布雷达消息,摄像头驱动节点可能负责发布图像消息)。一个完整的机器人系统可能由许多协同工作的节点组成,ROS2中的单个可执行文件(C++程序或Python程序)可以包含一个或多个节点。
2.话题
话题(Topic)是一个纽带,具有相同话题的节点可以关联在一起,而这正是通信的前提。并且ROS2是跨语言的,有的节点可能是使用C++实现,有的节点可能是使用Python实现的,但是只要二者使用了相同的话题,就可以实现数据的交互。
3.通信模型
不同的通信对象通过话题关联到一起之后,以何种方式实现通信呢?在ROS2中,常用的通信模型有四种:
1.话题通信:是一种单向通信模型,在通信双方中,发布方发布数据,订阅方订阅数据,数据流单向的由发布方传输到订阅方。
2.服务通信:是一种基于请求响应的通信模型,在通信双方中,客户端发送请求数据到服务端,服务端响应结果给客户端。
3.动作通信:是一种带有连续反馈的通信模型,在通信双方中,客户端发送请求数据到服务端,服务端响应结果给客户端,但是在服务端接收到请求到产生最终响应的过程中,会发送连续的反馈信息到客户端。
4.参数服务:是一种基于共享的通信模型,在通信双方中,服务端可以设置数据,而客户端可以连接服务端并操作服务端数据。
4.接口
在通信过程中,需要传输数据,就必然涉及到数据载体,也即要以特定格式传输数据。在ROS2中,数据载体称之为接口(interfaces)。通信时使用的数据载体一般需要使用接口文件定义。常用的接口文件有三种:msg文件、srv文件与action文件。每种文件都可以按照一定格式定义特定数据类型的“变量”。
1.msg文件
msg文件是用于定义话题通信中数据载体的接口文件,一个典型的.msg
文件示例如下。
int64 num1
int64 num2
在文件中声明了一些被传输的类似于C++变量的数据。
2.srv文件
srv文件是用于定义服务通信中数据载体的接口文件,一个典型的.srv
文件示例如下。
int64 num1
int64 num2
---
int64 sum
文件中声明的数据被---
分割为两部分,上半部分用于声明请求数据,下半部分用于声明响应数据。
3.action文件
action文件使用用于定义动作通信中数据载体的接口文件,一个典型的.action
文件示例如下。
int64 num
---
int64 sum
---
float64 progress
文件中声明的数据被---
分割为三部分,上半部分用于声明请求数据,中间部分用于声明响应数据,下半部分用于声明连续反馈数据。
4.变量类型
不管是何种接口文件,在文件中每行声明的数据都由字段类型和字段名称组成,可以使用的字段类型有:
-
int8, int16, int32, int64 (或者无符号类型: uint*)
-
float32, float64
-
string
-
time, duration
-
其他msg文件
-
变长数组和定长数组
ROS中还有一种特殊类型:Header
,标头包含时间戳和ROS2中常用的坐标帧信息。许多接口文件的第一行包含Header
标头。
另外,需要说明的是:
参数通信的数据无需定义接口文件,参数通信时数据会被封装为参数对象,参数客户端和服务端操作的都是参数对象。
本阶段大家对数据载体做简单的了解即可,其具体使用后续章节有详细介绍。
准备工作
1.请先创建工作空间ws01_plumbing
,本章以及第3章代码部分内容存储在该工作空间下。
2.实际应用中一般建议创建专门的接口功能包定义接口文件,当前教程也遵循这一建议,预先创建教程所需使用的接口功能包(需要注意的是,目前为止无法在Python功能包中定义接口文件),终端下进入工作空间的src
目录,执行如下命令:
ros2 pkg create --build-type ament_cmake base_interfaces_demo
该功能包将用于保存本章教程中自定义的接口文件。