警告
您正在阅读的 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
目前支持的内置类型
类型名称 |
|||
---|---|---|---|
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 |
每个内置类型都可以用来定义数组:
类型名称 |
|||
---|---|---|---|
静态数组 |
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
).默认值在构建消息/服务对象时使用,随后可通过赋值给字段来重写。您还可以为操作部分指定默认值。