您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.

接口

背景介绍

ROS 应用程序通常通过三种接口之一进行通信: 主题, 服务行动.ROS 2 使用一种简化的描述语言--接口定义语言(IDL)来描述这些接口。通过这种描述语言,ROS 工具可以很容易地用多种目标语言自动生成接口类型的源代码。

本文件将介绍支持的类型:

  • msg: .msg 文件是描述 ROS 消息字段的简单文本文件。它们用于生成不同语言的信息源代码。

  • srv: .srv 文件描述一项服务。它们由两部分组成:请求和响应。请求和响应是消息声明。

  • 行动: .行动 文件描述的是行动。它们由三部分组成:目标、结果和反馈。每个部分本身就是一个信息声明。

信息

消息是 ROS 2 节点在网络上向其他 ROS 节点发送数据的一种方式,不需要任何回应。例如,如果一个 ROS 2 节点从传感器读取了温度数据,它就可以使用一个 温度 信息。ROS 2 网络上的其他节点可以订阅该数据并接收 温度 留言

信息在 .msg 文件中的 msg/ 目录下的 ROS 软件包。 .msg 文件由两部分组成:字段和常量。

字段

每个字段由一个类型和一个名称组成,以空格隔开,即

字段类型1 字段名称1 字段类型2 字段名2 字段类型3 字段名3

例如

int32 my_int 字符串 my_string

领域类型

字段类型可以是

  • 内置型

  • 自行定义的信息描述名称,如 "geometry_msgs/PoseStamped" (几何_msgs/PoseStamped

目前支持的内置类型

类型名称

C++

Python

DDS 类型

bool

bool

buildins.bool

布尔

字节

uint8_t

buildins.bytes*

八位

烧焦

烧焦

buildins.int*

烧焦

float32

浮动

buildins.float*

浮动

浮点64

双人

buildins.float*

双人

int8

int8_t

buildins.int*

八位

uint8

uint8_t

buildins.int*

八位

int16

int16_t

buildins.int*

uint16

uint16_t

buildins.int*

无符号短

int32

int32_t

buildins.int*

uint32

uint32_t

buildins.int*

无符号长

int64

int64_t

buildins.int*

长长长长

uint64

uint64_t

buildins.int*

无符号长

字符串

std::string

buildins.str

字符串

wstring

std::u16string

buildins.str

wstring

每个内置类型都可以用来定义数组:

类型名称

C++

Python

DDS 类型

静态数组

std::array<T, N>;

buildins.list*

T[N]

无限动态数组

std::vector

buildins.list

顺序

有界动态数组

custom_class<T, N>;

buildins.list*

序列<T、N>;

有界字符串

std::string

buildins.str*

字符串

所有比《规则》定义更宽松的类型都通过软件执行《规则》对范围和长度的限制。

使用数组和有界类型定义报文的示例:

int32[] 无限制整数数组 int32[5] 五整数数组 int32[<;=5] 字符串 string_of_unbounded_size string<;=10 字符串[<;=5] up_too_five_unbounded_strings string<;=10[] unbounded_array_of_strings_up_to_ten_characters_each string<;=10[<;=5] 最多五个字符串,每个字符串最多十个字符

字段名称

字段名必须是小写字母数字字符,用下划线分隔单词。字段名必须以字母字符开头,不得以下划线结尾,也不得有两个连续的下划线。

字段默认值

默认值可设置为信息类型中的任何字段。目前,字符串数组和复杂类型(即不在上述内置类型表中的类型;适用于所有嵌套消息)不支持默认值。

定义默认值的方法是在字段定义行中添加第三个元素,即

字段类型 字段名 字段默认值

例如

uint8 x 42
int16 y -2000字符串 全名 无名氏;
int32[] 样本 [-200, -100, 0, 100, 200]

备注

  • 字符串值必须以单个 ' 或双 "; 报价

  • 目前字符串值未转义

常数

每个常量定义就像一个带有默认值的字段描述,只是这个值永远不能通过编程更改。使用等号"="表示该值分配,例如

常量型 常量名称=常值

例如

int32 X=123
int32 Y=-123字符串 FOO="foo";
字符串 示例='bar';

备注

常量名称必须大写

服务

服务是一种请求/响应通信,客户端(请求者)等待服务器(响应者)进行简短计算并返回结果。

服务的描述和定义见 .srv 文件中的 srv/ 目录下的 ROS 软件包。

服务描述文件由请求和响应 msg 类型组成,以 ---.任意两个 .msg 文件与 --- 是法定服务说明。

下面是一个非常简单的服务示例,它接收一个字符串并返回一个字符串:

字符串 str --- 字符串 字符串

当然,我们还可以做得更复杂一些(如果您想引用同一个软件包中的信息,您就不能提及软件包的名称):

# 申请常量
int8 FOO=1
int8 酒吧=2
# 申请字段
int8 foobar another_pkg/AnotherMessage msg ---
# 响应常数
uint32 秘密=123456
# 响应字段
another_pkg/YetAnotherMessage Val CustomMessageDefinedInThisPackage 值 uint32 一个整数

您不能在一个服务中嵌入另一个服务。

行动

操作是一种长期运行的请求/响应通信,操作客户端(请求者)等待操作服务器(响应者)采取某些操作并返回结果。与服务不同的是,操作可以长期运行(数秒或数分钟),在运行过程中提供反馈,并且可以被中断。

行动定义的形式如下

<;请求类型>; <;请求字段名>;
---
<;响应类型>; <;响应字段名>;
---
<;反馈类型>; <;feedback_fieldname>;

与服务一样,请求字段在第一个三短横线 (---)。在第二个三连线之后还有第三组字段,即发送反馈时要发送的字段。

可以有任意数量的请求字段(包括零)、任意数量的响应字段(包括零)和任意数量的反馈字段(包括零)。

"(《世界人权宣言》) <请求类型>;, <响应类型>;<反馈类型>; 遵循与 <类型>; 以获取信息。""""""""""等字样。 <request_fieldname>;, <响应字段名>;<feedback_fieldname>; 遵循与 <字段名>; 留言。

例如 斐波那契 行动定义包括以下内容

int32 订单
---
int32[] 顺序
---
int32[] 顺序

这是一个操作定义,其中操作客户端将发送单个 int32 字段表示要采取的斐波那契步数,并期望操作服务器生成一个 int32 包含完整的步骤。在此过程中,操作服务器还可能提供一个包含以下内容的中间数组 int32 包含到某一点为止所完成的步骤。