ROS2入门教程-接口
ROS2入门教程-接口
说明:
- 介绍ROS2的接口
背景:
- ROS程序一般通过一种或两种接口进行通信:消息和服务
- ROS使用了一种简化的描述语言来描述这些接口。
- 这种描述语言使得ROS的工具更加容易的自动生成对应语言的源代码。
- 在这篇文章中,我们将介绍支持的类型和如何创建你的 msg/srv文件
消息描述说明
- 消息的描述文件是在ROS软件包msg文件夹内的.msg文件。 .msg文件有两个部分:变量域(Fields)和常量(constants)
- 这里将Field翻译成变量域以和constants做作对比区分。
变量域
- 每一个域包含两个部分, 类型和名称。
- 中间用空格隔开,例如
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
- 示例:
int32 my_int
string my_string
变量域类型
变量域的类型可以是一下几种
- 内部定义类型
- 有用户自己定义的类型,比如 "geometry_msgs/PoseStamped"
内部定义的类型现在支持一下几种:
Type name | 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 |
- 每种内部定义类型都可以用来定义数组
Type name | C++ | Python | DDS type |
---|---|---|---|
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
变量域名称
- 变量域名称必须以小写字母开始,同时以下划线作为单词的分割符。
- 不能以下划线结束,也不允许有两个连续的下划线。
变量域默认值
- 默认值可以设置成变量域类型所允许的任意值。
- 当前默认值还不能支持字符串数组和复杂类型。
- 也就是没有出现在内部定义类型里面的,同样也适用于所有的嵌套消息
- 定义默认值可以通过在变量域定义中添加第三个元素来实现。
- 也就是:
变量域名称 变量域类型 变量域默认值
- 示例:
uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]
特别说明:
- 字符串类型默认值必须用单引号或者双引号括起来
- 当前的字符串类型是没有被转义的
常量
- 常量的定义就好像有默认值的变量域定义。除了常量的值是永远不能由程序改变的。
- 常量通过等号进行赋值。
- 比如:
常量类型 常量名称=常量值
- 示例:
int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'
- 特别说明:常量名必须是大写
服务定义说明
- 服务描述由位于ROS包下的srv文件夹内的.srv文件定义。
- 一个服务描述文件包含了一个请求和一个回应的消息类型。
- 之间用---分割。
- 任意的两个消息类型连接起来,并在中间用---分割都是一个合法的服务描述。
- 下面是一个非常简单的服务的例子。
- 这个服务接收一个字符串然后返回一个字符串:
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
- 不能在一个服务中嵌入另外一个服务。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号