ros2 话题与服务接口定义

欢迎光临程序代写小店https://item.taobao.com/item.htm?spm=a230r.1.14.59.255028c3ALNkZ0&id=586797758241&ns=1&abbucket=15#detail

 

ROS是一个分布式的机器人软件框架,涉及多节点之间的数据通信,绝大部分是基于话题或者服务完成的。

话题和服务在节点之间打通了一条隧道,其中来往的车辆就是需要传输的数据。每个数据长什么样,使用什么样的数据结构,可以使用ROS中已有的定义,也可以根据需求使用语言无关的接口自己定义,在编译过程时,再基于接口定义生成多种语言的代码。

这是ROS中非常重要、非常基础的功能,为ROS的松耦合提供了基础,在ROS2中依然保留了这项接口定义的功能。本篇我们就来看看ROS2中关于接口定义的方法。

一、话题接口定义

ROS2中的话题接口称为消息,描述文件以.msg结尾,放置在功能包的msg文件夹下,包含字段(fields)和常量(constants)两部分。

1. 字段

字段使用以下方式定义,包含类型和名称,使用空格分开:

fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3

如:

  1. <span style="color:#333333">int32 my_int</span>
  2. <span style="color:#333333">string my_string</span>

这里的字段类型可以使用ROS中的标准数据结构定义:

Image

也可以使用功能包中已有的消息定义,如: “geometry_msgs/PoseStamped”等。

还可以定义数组,包括数组的长度和范围:

variable-length array[] fixed-length array[C], bounded-length array[<=C]

如:

  1. <span style="color:#333333">int32[] unbounded_integer_array</span>
  2. <span style="color:#333333">int32[5] five_integers_array</span>
  3. <span style="color:#333333">int32[<=5] up_to_five_integers_array</span>
  4. <span style="color:#333333">string string_of_unbounded_size</span>
  5. <span style="color:#333333">string<=10 up_to_ten_characters_string</span>
  6. <span style="color:#333333">string[<=5] up_to_five_unbounded_strings</span>
  7. <span style="color:#333333">string<=10[] unbounded_array_of_string_up_to_ten_characters each</span>
  8. <span style="color:#333333">string<=10[<=5] up_to_five_strings_up_to_ten_characters_each</span>

另外,使用以下结构,每个字段还可以设置一个默认值:

fieldtype fieldname fielddefaultvalue

如:

  1. <span style="color:#333333">uint8 x 42</span>
  2. <span style="color:#333333">int16 y -2000</span>
  3. <span style="color:#333333">string full_name "John Doe"</span>
  4. <span style="color:#333333">int32[] samples [-200, -100, 0, 100, 200]</span>

2. 常量

常量类似程序中的宏定义,和上边的默认值有点像,只是不允许修改。

constanttype CONSTANTNAME=constantvalue

如:

  1. <span style="color:#333333">int32 X=123</span>
  2. <span style="color:#333333">int32 Y=-123</span>
  3. <span style="color:#333333">string FOO="foo"</span>
  4. <span style="color:#333333">string EXAMPLE='bar'</span>

* 这里需要注意,字段的名称必须是大写字母组成。

二、服务接口定义

服务接口的描述文件以.srv结尾,放置在功能包中的srv文件夹里。

服务描述文件中包含请求和应答两个部分的消息定义,中间使用“---”分开:

string str --- string str

可以调用已有的消息接口定义,如:

  1. <span style="color:#333333">#request constants</span>
  2. <span style="color:#333333">int8 FOO=1</span>
  3. <span style="color:#333333">int8 BAR=2#request fields</span>
  4. <span style="color:#333333">int8 foobar</span>
  5. <span style="color:#333333">another_pkg/AnotherMessage msg</span>
  6. <span style="color:#333333">---</span>
  7. <span style="color:#333333">#response constants</span>
  8. <span style="color:#333333">uint32 SECRET=123456#response fields</span>
  9. <span style="color:#333333">another_pkg/YetAnotherMessage val</span>
  10. <span style="color:#333333">CustomMessageDefinedInThisPackage value</span>
  11. <span style="color:#333333">uint32 an_integer</span>

* 这里需要注意,服务接口中可以调用消息接口,但是不能嵌套调用服务接口!

三、话题接口配置示例

这里创建一个描述通信录事项的消息定义,在功能包中创建msg文件,并在其中创建Contact.msg文件内容:

  1. <span style="color:#333333">bool FEMALE=true</span>
  2. <span style="color:#333333">bool MALE=false</span>
  3. <span style="color:#333333">string first_name</span>
  4. <span style="color:#333333">string last_name</span>
  5. <span style="color:#333333">bool gender</span>
  6. <span style="color:#333333">uint8 age</span>
  7. <span style="color:#333333">string address</span>

为了将以上定义编译成不同编程语言对应的文件,还需要配置package.xml和CMakeLists.txt。

1. package.xml

在package.xml文件中添加以下内容:

  1. <span style="color:#333333"><buildtool_depend>rosidl_default_generators</buildtool_depend></span>
  2. <span style="color:#333333"><exec_depend>rosidl_default_runtime</exec_depend></span>
  3. <span style="color:#333333"><member_of_group>rosidl_interface_packages</member_of_group></span>

2.CMakeLists.txt

在CMakeLists.txt文件中添加以下内容:

  1. <span style="color:#333333">find_package(rosidl_default_generators REQUIRED)</span>
  2. <span style="color:#333333"> </span>
  3. <span style="color:#333333">set(msg_files</span>
  4. <span style="color:#333333">"msg/Contact.msg"</span>
  5. <span style="color:#333333">)</span>
  6. <span style="color:#333333"> </span>
  7. <span style="color:#333333">rosidl_generate_interfaces(${PROJECT_NAME}</span>
  8. <span style="color:#333333">${msg_files}</span>
  9. <span style="color:#333333">)</span>
  10. <span style="color:#333333"> </span>
  11. <span style="color:#333333">ament_export_dependencies(rosidl_default_runtime)</span>

 

四、服务接口配置示例

srv文件类似,在srv文件夹下创建AddTwoFloats.srv文件,内容如下:

  1. <span style="color:#333333">float64 a</span>
  2. <span style="color:#333333">float64 b</span>
  3. <span style="color:#333333">---</span>
  4. <span style="color:#333333">float64 sum</span>

CMakeLists.txt文件中添加:

  1. <span style="color:#333333">set(srv_files</span>
  2. <span style="color:#333333">   "srv/AddTwoFloats.srv")</span>
  3. <span style="color:#333333"> </span>
  4. <span style="color:#333333">rosidl_generate_interfaces(${PROJECT_NAME}</span>
  5. <span style="color:#333333">   ${msg_files}</span>
  6. <span style="color:#333333">   ${srv_files}</span>
  7. <span style="color:#333333">)</span>

 

五、编译生成代码文件

最后,就可以编译功能包了,定义的接口会生成对应的程序文件,自动放置在install文件夹中,例如以上接口示例生成的头文件如下:

Screenshot from 2019-01-20 23-55-05

Screenshot from 2019-01-20 23-56-01

Screenshot from 2019-01-20 23-56-20

有了这些程序文件,后续我们就可以在程序中调用啦!

 

 

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/87948971