ROS2学习(八).ROS概念 - ROS 2接口(Ros2 interface)

19 篇文章 10 订阅
4 篇文章 0 订阅

背景

ROS应用程序通过消息、服务和操作三种类型的接口来进行通信。
ROS2使用即接口定义语言(IDL)来描述这些接口,这种接口定义语言非常简单。
IDL使得ROS工具可以较轻易地自动生成多种目标语言接口类型的源代码。

接口包括

  • msg消息.msg文件是描述ROS消息字段的简单文本文件。 它们用于为不同语言的消息生成源代码。
  • srv服务.srv文件是用于描述服务的。 它们由请求和响应两部分组成。 请求和响应都是一个消息声明。
  • action操作.action文件描述操作。 它们由目标、结果和反馈三个部分组成。 每个部分都是一个消息声明。

消息描述规范

消息被定义于ROS包的msg/目录下的.msg文件中,.msg由fields字和constants常量两部分构成。

Fields字段

每个field由一个type类型和一个name名称组成,由空格隔开,格式如下:

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3

例如:

int32 my_int
string my_string

Fields type字段类型

字段类型包括

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

内置类型:

Type nameC++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
wstringstd::u16stringbuiltins.strwstring

内置类型均可支持数组如下:

Type nameC++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

如下例:

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

Fields name字段名称

字段名称必须是小写字母、数字和字符,用下划线用于分隔单词。须以字母字符开始,不能以下划线结束,并且不能有两个连续的下划线。

Fields default value字段默认值

消息类型中的任意字段均可设置默认值。
目前尚不支持字符串数组和复杂类型的默认值。

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

fieldtype fieldname fielddefaultvalue

例:

uint8 x 42
int16 y -2000
string full_name “John Doe”
int32[] samples [-200, -100, 0, 100, 200]

注意

  • 字符串值需要以单引号’或双引号"进行定义
  • 目前字符串不支持转义符

Constant常量

常量定义使用类似带有默认值的字段描述的方式来定义。这个值永远无法通过编程方式更改。常量采用等号’ = '表示进行赋值:

constanttype CONSTANTNAME=constantvalue

例:

int32 X=123
int32 Y=-123
string FOO=“foo”
string EXAMPLE=‘bar’

注意
常量名必须使用大写字符

服务描述规范

服务被定义于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

我们不能在服务中循环嵌套使用服务。

ROS 2的新功能

ROS 2 IDL与ROS 1 IDL密切相关。大多数现有的ROS 1 .msg和.srv文件在ROS 2可以继续使用。 在ROS 1现有功能集的基础上,ROS 2 IDL引入了一些新功能,即:

  • 有界数组 : 尽管ROS 1 IDL允许无界数组(如int32[] foo)和固定大小的数组(如int32[5] bar), ROS 2 IDL进一步允许有界数组(如int32[<=5] bat)。
    有界数组能够为数组的大小设置一个上限(例如在一个实时系统中,你需要预先分配在执行期间将使用的所有内存)。
  • 有界字符串:ROS1 IDL允许无限制的字符串(例如字符串foo), ros2 IDL进一步允许有界字符串(例如字符串<=5 bar)。
  • 默认值:尽管ROS 1 IDL允许常量字段(例如,int32 X=123), ROS 2 IDL进一步允许指定默认值(例如,int32 X 123)。 默认值在构造消息/服务对象时使用,随后可以通过赋值给字段来重写。 您还可以为action部分指定默认值。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值