1.背景
ROS应用程序一般经过如下两种类型之一的接口进行通讯:消息和服务。ROS使用简化的描述语言来描述这些接口。这些描述使ROS工具能够轻松地为多种目标语言的接口类型自动生成源代码。编程
在本文档中,咱们将描述支持的类型以及如何建立本身的消息/服务文件。数组
2.消息描述说明
消息描述在ROS文件包中的"msg/"
目录下的".msg"文件中定义。 .msg
文件由两部分组成:字段和常量。
2.1字段
每一个字段由一个类型和一个名称组成,用空格分隔,即:bash
fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3
例如:工具
int32 my_int string my_string
2.2.1字段类型
字段类型能够是:ui
目前支持的内置类型:
spa
类型名称 | C++ | Python | DDS 类型 |
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 |
每一个内置类型均可以用来定义数组:
code
类型名称 | C++ | Python | DDS类型 |
static array | std::array<T,N> | builtins.list* | T[N] |
unbounded dynamic array | std::vector | builtins.list* | sequence |
bounded dynamic array | custom_class<T,N> | builtins.list* | sequence<T,N> |
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字段名称
字段名称必须是小写字母和数字,可用下划线分隔。它们必须以字母开头,不能如下划线结尾,也不能有两个连续的下划线。ip
2.1.3字段默认值
消息类型中的任何字段均可以设置为默认值。当前字符串数组和复杂类型(即上面内置类型表中不存在的类型,运用于全部嵌套消息)不支持默认值。ci
经过向字段定义行添加第三个元素来定义默认值,即:
fieldtype fieldname fielddefaultvalue
例如:
uint8 x 42 int16 y -2000 string full_name "John Doe" int32[] samples [-200, -100, 0, 100, 200]
注意:
2.2常量
每一个常量定义相似于具备默认值的字段描述,但该值永远不能以编程方式更改。经过使用等于'='的符号来指示该值赋值,例如
constantype CONSTANTNAME=constantvalue
例如
int32 X=123 int32 Y=-123 string FOO="foo" string EXAMPLE='bar'
注意:
常量名称必须用大写字母。
3.服务描述(Service Description)规范
服务描述在ROS包中的srv/
目录下
的.srv
文件中定义。
服务描述文件由请求和响应消息类型组成,以“ - ”分隔。任何两个.msg文件用' - '联系在一块儿,就是合法的服务描述。
下面是一个很是简单的服务示例,它接受一个字符串并返回一个字符串:
string str --- string str
咱们固然能够变得更复杂(若是你想引用来自同一个包的消息,你就不能提到包名):
#请求常量 int8 FOO=1 int8 BAR=2 #请求字段 int8 foobar another_pkg/AnotherMessage msg --- #回应常量 uint32 SECRET=123456 #回应字段 another_pkg/YetAnotherMessage val CustomMessageDefinedInThisPackage value uint32 an_integer
不能在服务中嵌套服务。
英文原文:https://index.ros.org/doc/ros2/Concepts/About-ROS-Interfaces/