接口 [17104]

背景 [17105]

ROS应用通常通过以下三种类型的接口进行通信:主题服务。ROS 2使用一种简化的描述语言,接口定义语言(IDL),来描述这些接口。这种描述使得ROS工具能够自动生成多种目标语言的接口类型的源代码变得容易。 [17106]

在本文档中,我们将描述支持的类型: [17107]

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

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

  • action: .action 文件描述一个动作。它由三部分组成:目标、结果和反馈。每个部分本身都是消息声明。 [17110]

消息 [17111]

消息是ROS 2节点将数据发送到其他ROS节点的一种方式,不需要期望响应。例如,如果一个ROS 2节点从传感器读取温度数据,它可以使用``Temperature``消息将该数据发布到ROS 2网络上。ROS 2网络上的其他节点可以订阅该数据并接收``Temperature``消息。 [17112]

ROS包的``msg/目录中的.msg``文件描述和定义了消息。``.msg``文件由两个部分组成:字段和常量。 [17113]

字段 [17114]

每个字段由类型和名称组成,用空格分隔,例如: [17115]

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3

例如: [17116]

int32 my_int
string my_string

字段类型 [17117]

字段类型可以是: [17118]

  • 内置类型 [17119]

  • 独立定义的消息描述的名称,例如 "geometry_msgs/PoseStamped" [17120]

当前支持的内置类型: [17121]

类型名称 [17122]

C++ [17123]

Python [17124]

DDS 类型 [17125]

bool [17126]

bool [17126]

builtins.bool [17127]

boolean [17128]

byte [17129]

uint8_t [17130]

内建字节串* [17131]

八位字节 [17132]

字符 [17133]

字符 [17133]

内建字符串* [17134]

字符 [17133]

单精度浮点数 [17135]

浮点数 [17136]

内置浮点型* [17137]

浮点数 [17136]

float64 [17138]

双精度 [17139]

内置浮点型* [17137]

双精度 [17139]

int8 [17140]

int8_t [17141]

内置整型* [17142]

八位字节 [17132]

无符号8位整数 [17143]

uint8_t [17130]

内置整型* [17142]

八位字节 [17132]

有符号16位整数 [17144]

有符号16位整数 [17145]

内置整型* [17142]

短整数 [17146]

无符号16位整数 [17147]

无符号16位整数 [17148]

内置整型* [17142]

无符号短整型 [17149]

32位整型 [17150]

int32_t [17151]

内置整型* [17142]

长整型 [17152]

无符号32位整型 [17153]

uint32_t [17154]

内置整型* [17142]

无符号长整型 [17155]

64位整型 [17156]

int64_t [17157]

内置整型* [17142]

长长整型 [17158]

无符号64位整型 [17159]

uint64_t [17160]

内置整型* [17142]

无符号长长整型 [17161]

字符串 [17162]

std::字符串 [17163]

内建.字符串 [17164]

字符串 [17162]

宽字符串 [17165]

std::u16字符串 [17166]

内建.字符串 [17164]

宽字符串 [17165]

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

类型名称 [17122]

C++ [17123]

Python [17124]

DDS 类型 [17125]

静态数组 [17168]

std::array<T, N> [17169]

内置类型列表* [17170]

T[N] [17171]

无界动态数组 [17172]

std::vector [17173]

builtins.list [17174]

sequence [17175]

bounded dynamic array [17176]

custom_class<T, N> [17177]

内置类型列表* [17170]

sequence<T, N> [17178]

有界字符串 [17179]

std::字符串 [17163]

内建字符串* [17134]

字符串 [17162]

所有比其ROS定义更宽松的类型都会通过软件来强制执行范围和长度上的ROS约束。 [17180]

使用数组和有界类型的消息定义示例: [17181]

int32[] unbounded_integer_array
int32[5] five_integers_array
int32[<=5] up_to_five_integers_array

string string_of_unbounded_size
string<=10 up_to_ten_characters_string

string[<=5] up_to_five_unbounded_strings
string<=10[] unbounded_array_of_strings_up_to_ten_characters_each
string<=10[<=5] up_to_five_strings_up_to_ten_characters_each

字段名称 [17182]

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

字段默认值 [17184]

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

通过在字段定义行中添加第三个元素来定义默认值,例如: [17186]

fieldtype fieldname fielddefaultvalue

例如: [17116]

uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]

注解

  • 字符串值必须用单引号 ' 或双引号 " 定义 [17187]

  • 当前字符串值不被转义 [17188]

常量 [17189]

每个常量定义都类似于具有默认值的字段描述,但是这个值在程序中不能被改变。这个值的赋值通过等号 '=' 来表示,例如。 [17190]

constanttype CONSTANTNAME=constantvalue

例如: [17116]

int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'

注解

常量名称必须是大写字母。 [17191]

服务 [17192]

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

服务在 ROS 包的 'srv/' 目录下的 '.srv' 文件中进行描述和定义。 [17194]

一个服务描述文件由请求和响应的消息类型组成,用 '---' 分隔。任何两个 '.msg' 文件通过 '---' 连接在一起都构成一个合法的服务描述。 [17195]

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

string str
---
string str

当然,我们可以变得更加复杂(如果你想引用同一包中的消息,不需要提及包名): [17197]

# request constants
int8 FOO=1
int8 BAR=2
# request fields
int8 foobar
another_pkg/AnotherMessage msg
---
# response constants
uint32 SECRET=123456
# response fields
another_pkg/YetAnotherMessage val
CustomMessageDefinedInThisPackage value
uint32 an_integer

你不能在一个服务中嵌入另一个服务。 [17198]

动作 [17002]

动作是一种长时间运行的请求/响应通信,动作客户端(请求方)等待动作服务器(响应方)执行某些操作并返回结果。与服务不同,动作可以是长时间运行的(数秒或数分钟),在执行过程中提供反馈,并可以中断。 [17199]

动作定义的形式如下: [17200]

<request_type> <request_fieldname>
---
<response_type> <response_fieldname>
---
<feedback_type> <feedback_fieldname>

与服务类似,请求字段位于第一个三短线(---)之前,响应字段位于其后。还有第二组字段位于第二个三短线之后,用于在发送反馈时发送的字段。 [17201]

可以有任意数量的请求字段(包括零个)、任意数量的响应字段(包括零个)以及任意数量的反馈字段(包括零个)。 [17202]

<request_type>, <response_type>``和``<feedback_type>``都遵循与消息的``<type>``相同的规则。``<request_fieldname>, ``<response_fieldname>``和``<feedback_fieldname>``都遵循与消息的``<fieldname>``相同的规则。 [17203]

例如,``Fibonacci``动作定义包含以下内容: [17204]

int32 order
---
int32[] sequence
---
int32[] sequence

这是一个动作定义,其中动作客户端发送一个表示要执行的Fibonacci步数的``int32``字段,并期望动作服务器生成包含所有步骤的``int32``数组。在执行过程中,动作服务器还可以提供包含截至某一点的已完成步骤的中间``int32``数组。 [17205]