ROS 接口(消息与服务)

1.背景

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

在本文档中,我们将介绍支持的类型以及如何创建自己的msg / srv文件。

2.消息说明规范

消息描述在ROS包中msg/目录下.msg后缀的文件中定义。 .msg文件由两部分组成:字段和常量。

2.1领域

每个字段由一个类型和一个名称组成,用空格分隔,即:

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3

例如:

int32 my_int
string my_string

2.1.1字段类型

字段类型可以是:

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

目前支持的内置类型:

类型名称C ++PythonDDS type
boolboolbuiltins.boolboolean
byteuint8_tbuiltins.bytes*octet
charcharbuiltins.str*char
float32floatbuiltins.float*float
float64doublebuiltins.float*double
int8int8_tbuiltins.int*octet
uint8uint8_tbuiltins.int*octet
int16int16_tbuiltins.int*short
uint16uint16_tbuiltins.int*unsigned short
int32int32_tbuiltins.int*long
uint32uint32_tbuiltins.int*unsigned long
int64int64_tbuiltins.int*long long
uint64uint64_tbuiltins.int*unsigned long long
stringstd::stringbuiltins.strstring

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

类型名称C++PythonDDS type
static arraystd::array<T, N>builtins.list*T[N]
unbounded dynamic arraystd::vectorbuiltins.listsequence
bounded dynamic arraycustom_class<T, N>builtins.list*sequence<T, N>
bounded stringstd::stringbuiltins.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常数

每个常量定义类似于具有默认值的字段描述,但该值永远不能以编程方式更改。通过使用等于'='的符号来指示该值赋值,例如

constanttype CONSTANTNAME=constantvalue

例如:

int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'

注意:常量名称必须为大写

3.服务描述规范

服务描述在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

您无法在服务中嵌入其他服务。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值