ROS 2 index翻译(四)——关于ROS 2接口

1.背景
ROS应用程序通常通过以下两种类型之一的接口进行通信:消息和服务。ROS使用简化的描述语言来描述这些接口。这些描述使ROS工具可以轻松地为多种目标语言的接口类型自动生成源代码。

在本文档中,我们将描述支持的类型以及如何创建自己的消息/服务文件。

2.消息描述说明
消息描述在ROS文件包中的"msg/"目录下的".msg"文件中定义。 .msg文件由两部分组成:字段和常量。
2.1字段
每个字段由一个类型和一个名称组成,用空格分隔,即:

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3

例如:

int32 my_int
string my_string

2.2.1字段类型
字段类型可以是:

  • 内置式类型
  • 消息描述自身定义的名称,例如“geometry_msgs / PoseStamped”

目前支持的内置类型:
 

类型名称  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

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

类型名称 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字段名称
字段名称必须是小写字母和数字,可用下划线分隔。它们必须以字母开头,不能以下划线结尾,也不能有两个连续的下划线。

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

通过向字段定义行添加第三个元素来定义默认值,即:

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/

posted on 2019-02-28 11:00  tuxinbang  阅读(706)  评论(0)    收藏  举报

导航