ROS2 通过消息,服务,行为接口进行通信,它们的格式通过 IDL 定义。
消息
消息定义在 ROS 包里面的 msg 目录下,以 .msg 结尾的文本文件描述。
.msg 文件包括两个部分:字段和常量
字段
字段以行分割,每个字段包括类型和名称,以空格分割。
1
2
3
| fieldtype1 fieldname 1
fieldtype2 fieldname2
fieldtype3 fieldname3
|
例如:
1
2
| int32 my_int
string my_string
|
字段类型
字段类型包括内置类型和自定义的消息
具体支持的类型可以查看:https://index.ros.org/doc/ros2/Concepts/About-ROS-Interfaces/
1
2
3
4
5
6
7
8
9
10
| 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
|
字段名称
字段名称必须是小写字符,以下划线分割,以字符开头,不能以下划线结尾,也不能有两个连续的下划线
字段默认值
不支持字符串数组和复杂的类型。
1
| fieldtype fieldname fielddefaultvalue
|
例如:
1
2
3
4
| uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]
|
如果字符串中有双引号,要以单引号包裹,暂不支持转义。
常量
常量定义格式:
1
| constanttype CONSTANTNAME=constantvalue
|
例如:
1
2
3
4
| int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'
|
常量名称必须全部大写
服务
服务的描述在 ROS 包中的 srv 目录下以 .srv 结尾的文件中
服务包括请求和响应的消息类型,以 — 分割
下面是一个简单的服务,接收一个 string 和响应一个 string
1
2
3
| string str
---
string str
|
更复杂的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
| #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
|