ros2学习(03)—服务与自定义接口

Published: less than 1 minute read, with 109 words. Post views:

ros2学习日志(3)—自定义服务接口

3.0 掷骰子游戏构想

前面我们创建了一个god节点来掷骰子,一个player节点来接收骰子点数。但这不够有意思,我们现在设想这么一个场景:

god节点掷骰子,然后player节点来猜骰子点数,如果猜对,则返回正确,如果错误,则返回错误。

这个场景与之前发布者订阅者的不同是,增加了两个节点之间的交互,即player节点需要向god节点发送一个数字,而god节点判断数字是否正确,并输出结果。

这种两个节点需要交互的场景,需要利用ros2中的服务。

3.1 场景分析

在掷骰子游戏这一场景中,player作为客户端,向god服务端发起请求(也就是发送一个数值给god服务端)。

god服务端这边接收到player的请求(request)后,判断player是否猜对骰子点数,并反馈或者响应(response)消息。

所以,这个场景下:

  • god是服务端(service),提供投掷骰子服务,并判断是否猜对;
  • player是客户端(client),发起猜骰子点数的请求(request),并接收god服务端的反馈或响应(response)。

于是,一个自然而然的服务接口出现了:

image-20220413091447830

  • 请求request是一个uint32类型的数值;1-6之间任意整型数
  • 响应response是一个bool类型的标识符;比如TRUE或FALSE

3.2 数据接口(interface)

ros2中内置了很多数据接口,可以利用ros2 interface list查看

有用于messages的,有用于services的,有用于action的

  • 注意这里面所有的接口名称,首字母都是大写
  • 首字母大写会被反复强调,很重要

image-20220408163341699

我们不去寻找是否有满足我们需求的接口,也许有,也许没有。

这里我们直接建立一个满足我们需要的自定义服务接口。

3.3 自定义服务接口

在这里,我们新建一个package来存放我们所有的自定义接口,package名称是interfaces。

ros2 pkg create interfaces --build-type ament_cmake 

注意build-type不可以用ament_python

3.3.1 创建srv文件

cd到interfaces下,新建srv文件夹,并在srv文件夹内新建DiceGameService.srv文件

image-20220411100500992

在DiceGamesService.srv文件中输入以下代码:

uint32 input_num #一开始我使用inputNum#但是报错了#似乎不能出现大写字母#(此处存疑)#
---
bool guess_result
  • DiceGameService.srv首字母必须大写!!!
  • uint32跟std_msgs中的UInt32不一样,string跟std_msgs中的String也不一样
  • 大写字母开头的UInt32和String是类,而小写字母开头的uint32和string是ros2中的基本数据类型

3.3.2 修改CMakeLists

在CMakeLists.txt文件中添加以下代码:

find_package(rosidl_default_generators REQUIRED) #添加依赖
rosidl_generate_interfaces(${PROJECT_NAME}
  "srv/DiceGameService.srv"
    )

image-20220411101150104

3.3.3 修改package.xml

在package.xml文件中添加以下代码:

  <member_of_group>rosidl_interface_packages</member_of_group>

image-20220411102101360

3.3.4 编译运行

colcon build --packages-select interfaces
source install/setup.bash

然后使用ros2 interface list |grep Dice查看一下当前的接口

  • ros2 interface list命令是ros2中显示所有接口的命令
  • |grep Dice是筛选含有Dice字符串的结果

可以看到结果中出现了我们创建的DiceGameService的服务接口image-20220411130842031

3.4 特别注意(非常重要)

  • 自定义接口文件名称首字母必须大写!!!如本例中的DiceGameService.srv中的D必须大写。
  • srv文件中的的变量名字似乎不能用大写,比如inputNum会编译报错,而input_num则不会。
  • 查阅ros2官方文档,发现srv文件中的变量名字的确不允许有大写,只允许小写字母和下划线,并且不允许双下划线不允许下划线结尾
  • image-20220413134626500
  • 文档链接:About ROS 2 interfaces — ROS 2 Documentation: Galactic documentation

Tags: ,

Categories:

Comments