警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

关于 ROS 2 接口

1.背景情况

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

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

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

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

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

2.信息描述规范

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

2.1 领域

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

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

例如

int32 my_int 字符串 my_string

2.1.1 字段类型

字段类型可以是

  • 内置型

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

目前支持的内置类型

类型名称

C++

Python

DDS 类型

bool

bool

buildins.bool

布尔

字节

uint8_t

buildins.bytes*

八位

烧焦

烧焦

buildins.str*

烧焦

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[] 最多 10 个字符的无限制字符串数组 每个字符串=10[<;=5] 最多五个字符串,每个字符串最多十个字符

2.1.2 字段名称

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

2.1.3 字段默认值

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

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

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

例如

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

请注意:

  • 字符串值必须以单个 ' 或双引号 ";

  • 目前字符串值未转义

2.2 常量

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

常量型 常量名称=常值

例如

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

备注

常量名称必须大写

3.服务说明规格

服务的描述和定义见 .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 一个整数

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

4.ROS 2 界面的新功能

ROS 2 IDL 与 ROS 1 IDL.大多数现有的 ROS 1 .msg.srv 在 ROS 1 的现有功能基础上,ROS 2 IDL 引入了一些新功能,即

  • 有界数组:而 ROS 1 IDL 允许使用无界数组(例如:......)、 int32[] 动物)和固定大小的数组(如 int32[5] 酒吧),ROS 2 IDL 还允许使用有界数组(如 int32[<=5] 蝙蝠).在某些使用情况下,必须对数组的大小设定一个上限,而不必承诺总是使用那么大的空间(例如,在实时系统中,需要预先分配所有在执行过程中会用到的内存)。

  • 有界字符串:而 ROS 1 IDL 允许使用无界字符串(例如、 字符串 动物),ROS 2 IDL 还允许使用有界字符串(如 string<=5 酒吧).

  • 默认值:而 ROS 1 IDL 允许使用常量字段(如......)、 int32 X=123),ROS 2 IDL 还允许指定默认值(例如 int32 X 123).默认值在构建消息/服务对象时使用,随后可通过赋值给字段来重写。您还可以为操作部分指定默认值。