您正在阅读的是旧版本但仍受支持的 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
目前支持的内置类型
类型名称 |
|||
---|---|---|---|
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 |
每个内置类型都可以用来定义数组:
类型名称 |
|||
---|---|---|---|
静态数组 |
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
包含到某一点为止所完成的步骤。