ROS应用程序通常通过以下两种类型之一的接口进行通信:消息和服务。ROS使用简化的描述语言来描述这些接口。此描述使ROS工具可以轻松地为多种目标语言中的接口类型自动生成源代码。
在本文档中,我们将介绍支持的类型以及如何创建自己的msg / srv文件。
消息描述在ROS包中msg/
目录下.msg后缀
的文件中定义。 .msg
文件由两部分组成:字段和常量。
每个字段由一个类型和一个名称组成,用空格分隔,即:
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
例如:
int32 my_int
string my_string
2.1.1字段类型
字段类型可以是:
目前支持的内置类型:
类型名称 | C ++ | Python | DDS type |
---|---|---|---|
bool | bool | builtins.bool | boolean |
byte | uint8_t | builtins.bytes* | octet |
char | char | builtins.str* | char |
float32 | float | builtins.float* | float |
float64 | double | builtins.float* | double |
int8 | int8_t | builtins.int* | octet |
uint8 | uint8_t | builtins.int* | octet |
int16 | int16_t | builtins.int* | short |
uint16 | uint16_t | builtins.int* | unsigned short |
int32 | int32_t | builtins.int* | long |
uint32 | uint32_t | builtins.int* | unsigned long |
int64 | int64_t | builtins.int* | long long |
uint64 | uint64_t | builtins.int* | unsigned long long |
string | std::string | builtins.str | string |
每个内置类型都可用于定义数组:
类型名称 | C++ | Python | DDS type |
---|---|---|---|
static array | std::array |
builtins.list* | T[N] |
unbounded dynamic array | std::vector | builtins.list | sequence |
bounded dynamic array | custom_class |
builtins.list* | sequence |
bounded string | std::string | builtins.str* | string |
*所有比ROS定义更宽松的类型都可以通过软件在范围和长度上强制执行ROS约束
使用数组和有界类型的消息定义示例:
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_string_up_to_ten_characters each
string<=10[<=5] up_to_five_strings_up_to_ten_characters_each
2.1.2字段名称
字段名称必须是带有下划线的小写字母数字字符,用于分隔单词。它们必须以字母字符开头,它们不能以下划线结尾,也不能有两个连续的下划线。
2.1.3字段默认值
可以将默认值设置为消息类型中的任何字段。当前字符串数组和复杂类型(即上面的内置类型表中不存在的类型,不适用于所有嵌套消息)不支持默认值
通过向字段定义行添加第三个元素来完成定义默认值,即:
fieldtype fieldname fielddefaultvalue
例如:
uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]
注意:
'
引号或双引号定义"
每个常量定义类似于具有默认值的字段描述,但该值永远不能以编程方式更改。通过使用等于'='的符号来指示该值赋值,例如
constanttype CONSTANTNAME=constantvalue
例如:
int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'
注意:常量名称必须为大写
服务描述在ROS包srv/
目录中的.srv
的文件中定义。
服务描述文件由请求和响应消息类型组成,由'---'分隔。与'---'连接在一起的任何两个.msg文件都是合法的服务描述。
这是一个非常简单的服务示例,它接受一个字符串并返回一个字符串:
string str
---
string str
我们当然可以变得更复杂(如果你想引用来自同一个包的消息,你不用提到包名):
#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
您无法在服务中嵌入其他服务。