本文专门针对ROS2传递的数据结构或叫数据协议进行说明。所谓接口有几个要素:
1)命名空间 2)数据类型 3)默认值 。
所谓接口,就是被传递数据的格式。
随着在 ROS 2 Dashing 中使用 IDL 指定接口的过渡,本文已被使用 .msg / .srv / .action 文件的接口定义文章取代。
本文指定了描述用于在组件之间交换信息的数据结构的文件格式。数据结构以与编程语言无关的方式定义。请参阅其他文章以了解与编程语言特定类型和 API 的映射。
数据结构由一组字段定义。字段的顺序无关紧要。每个字段由类型和名称描述。
单个数据结构称为消息。每条消息都有一个名称。与包的名称一起,可以唯一标识一条消息。
对于请求/回复式通信,两个交换的数据结构是相关的。这些数据结构对称为服务 服务由其名称和所在的包标识。每个服务描述两条消息,一条用于请求数据结构,一条用于回复数据结构。
字段的类型可以是原始类型,也可以是其他数据结构。这些中的每一个都可以选择是动态或静态大小的数组。
1)主字段类型
类型有下列方面:
bool
byte
char
float32
, float64
int8
, uint8
int16
, uint16
int32
, uint32
int64
, uint64
string
TODO:考虑 wchar、wstring、u16string、u32string
TODO:字符串还没有指定任何编码并且传输对它是不可知的,这意味着它通常只能包含 ASCII 但所有端点也可以“同意”使用特定的编码
TODO:考虑在指定到 C++ 和 Python 的映射后删除 byte、char
1)非原始字段类型
除了原始类型之外,还可以引用其他消息来描述“复杂”字段的类型。复杂字段类型由包和消息名称标识。
2)具有静态大小的数组
一个静态数组正好有 N 个指定类型的元素。 N 必须大于 0。
3)具有动态大小的数组
动态数组可以有 0 到 N 个指定类型的元素。 N 可能没有上限,并且可能仅受内存或其他系统特定限制的限制。
4)上界
字符串和动态数组的大小可以通过上限来限制。这可以为使用动态大小数据的数据结构预分配内存。
字段可以选择指定默认值。如果未指定默认值,则使用通用默认值:
bool
it is false
0
valuestring
it is an empty string[]
数组类型的字段可以选择指定默认值。
字符串数组必须只包含符合以下规则的字符串: 可以选择用单引号 (') 或双引号 (") 引用的字符串值 双引号 (") 字符串(分别是单引号 ('))应该有任何内部双引号(分别是单引号)转义 TODO:复杂字段当前不支持默认值
常量由原始类型、名称和固定值定义。
4.1 约定:消息和服务的命名
每个文件都包含一个消息或服务。消息文件使用扩展名 .msg,服务文件使用扩展名 .srv。
两个文件名都必须使用大写的驼峰式名称,并且只能由字母数字字符组成。
字段名称必须是带有下划线的小写字母数字字符,用于分隔单词。它们必须以字母字符开头,不能以下划线结尾,并且不能有两个连续的下划线。
常量名称必须是带有下划线的大写字母数字字符,用于分隔单词。它们必须以字母字符开头,不能以下划线结尾,并且不能有两个连续的下划线。
消息和服务定义是文本文件。
字符 # 开始一个注释,它在它出现的行的末尾终止。
一行可以包含字段定义或常量定义。虽然必须使用单个空格来分隔标记,但可以选择在标记之间插入额外的空格。
字段定义具有以下结构:
<类型> <名称> <可选默认值>
常量定义具有以下结构:
<类型> <名称>=<值>
基本类型可以是以下之一:
数组说明符可以是以下之一:
根据类型,以下值有效:
真的,1
假,0
以下区间 [0, 255] 中的无符号整数值
字符:
以下区间 [-128, 127] 中的整数值
使用点 (.) 作为整数部分和小数部分之间的分隔符的十进制数。
以下区间 [- 2 ^ (N - 1), 2 ^ (N - 1) - 1] 中的整数值,其中 N 是 int 后面的位数
uint8、uint16、uint32 和 uint64:
以下区间 [0, 2 ^ N - 1] 中的无符号整数值,其中 N 是 uint 后面的位数。
string my_string "I heard \"Hello\""
--是有效的string my_string "I heard "Hello""
--是无效的string my_string "I heard 'Hello'"
--有效string my_string 'I heard \'Hello\'' 有效
string my_string 'I heard 'Hello''
--无效string my_string 'I heard "Hello"'
--有效