了解ROS 2服务

Goal目标: Learn使用命令行工具了解ROS 2中的服务。 [待校准@8183]

教程级别: 初学者 [Alyssa@7088]

时间: 10分钟 [Alyssa@7452]

背景

服务是ROS图中节点的另一种通讯方法。服务基于调用和响应模型,而不是话题的发布者-订阅者模型。而话题允许节点订阅数据流得到不断更新,服务对具体调用的客户端提供数据。 [机器人@8184]

../../_images/Service-SingleServiceClient.gif ../../_images/Service-MultipleServiceClient.gif

先决条件

本教程中提到的一些概念,如 nodestopics ,在本系列的先前教程中有所介绍。 [待校准@8185]

你需要 turtlesim功能包[机器人@8186]

和往常一样,不要忘记在 every new terminal you open 中源文件ROS 2。 [待校准@7566]

任务

1设置 [待校准@7567]

启动两个turtlesim节点, /turtlesim/teleop_turtle[待校准@7815]

打开新终端并运行: [待校准@7339]

ros2 run turtlesim turtlesim_node

打开另一个终端并运行: [待校准@7816]

ros2 run turtlesim turtle_teleop_key

2 ros2服务列表 [待校准@8187]

在新终端中运行 ros2 service list 命令将返回系统中当前活动的所有服务的列表: [待校准@8188]

/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically

你将会看到两个节点都有相同的六个服务,它们的名字中有 parameters 。几乎ROS 2中的每个节点都有这些构建参数的基础设施服务。在下一个教程中将会有更多关于参数的信息。在本教程中,将在讨论中省略参数服务。 [待校准@8189]

现在,让我们关注turtlesim特定服务, /clear/kill/reset/spawn/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative 。您可以在 “Introducing turtlesim and rqt” 教程中使用rqt调用与其中一些服务的交互。 [待校准@8190]

3 ros2服务类型 [待校准@8191]

服务具有描述服务的请求和响应数据如何构造的类型。服务类型的定义与话题类型相似,除了服务类型有两个部分: 一个用于请求的消息,另一个用于响应。 [待校准@8192]

要找出服务的类型,请使用以下命令: [待校准@8193]

ros2 service type <service_name>

让我们来看看turtlesim的 /clear 服务。在新终端中,输入命令: [待校准@8194]

ros2 service type /clear

应该返回: [待校准@8195]

std_srvs/srv/Empty

[需手动修复的语法] Empty 类型是指服务调用在发出请求时不发送任何数据,在收到响应时不接收任何数据。 [待校准@8196]

3.1 ros2服务列表-t [待校准@8197]

要同时查看所有活动服务的类型,您可以将 --show-types 选项 (缩写为 -t ) 附加到 list 命令中: [待校准@8198]

ros2 service list -t

它将返回: [待校准@8090]

/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...

4 ros2服务查找 [待校准@8199]

如果要查找特定类型的所有服务,可以使用以下命令: [待校准@8200]

ros2 service find <type_name>

例如,您可以找到所有 Empty 类型化服务,如下所示: [待校准@8201]

ros2 service find std_srvs/srv/Empty

它将返回: [待校准@8090]

/clear
/reset

5 ros2界面展示 [待校准@8202]

您可以从命令行调用服务,但首先需要了解输入参数的结构。 [待校准@8203]

ros2 interface show <type_name>.srv

要对 /clear 服务的类型 Empty 运行此命令: [待校准@8204]

ros2 interface show std_srvs/srv/Empty.srv

它将返回: [待校准@8090]

---

[需手动修复的语法] --- 将请求结构 (上) 与响应结构 (下) 分开。但是,正如你之前所了解的, Empty 型不发送或接收任何数据。所以,自然地,它的结构是空白的。 [待校准@8205]

让我们反思一个发送和接收数据类型的服务,比如 /spawn 。从 ros2 service list -t 的结果,我们知道 /spawn 的类型是 turtlesim/srv/Spawn[待校准@8206]

要查看 /spawn 调用和请求中的参数,请运行以下命令: [待校准@8207]

ros2 interface show turtlesim/srv/Spawn

它将返回: [待校准@8090]

float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

[需手动修复的语法] --- 线上的信息告诉我们调用 /spawn 所需的参数。 xytheta 决定产卵海龟的位置, name 显然是可选的。 [待校准@8208]

在这种情况下,行下的信息不是您需要知道的,但它可以帮助您理解从调用中获得的响应的数据类型。 [待校准@8209]

6 ros2服务调用 [待校准@8210]

既然您知道什么是服务类型,如何找到服务的类型,以及如何找到该类型参数的结构,您可以使用以下方法调用服务: [待校准@8211]

ros2 service call <service_name> <service_type> <arguments>

[需手动修复的语法] <arguments> 部分是可选的。例如,您知道 Empty 类型化服务没有任何参数: [待校准@8212]

ros2 service call /clear std_srvs/srv/Empty

此命令将清除海龟绘制的任何线条的turtlesim窗口。 [待校准@8213]

../../_images/clear.png

现在让我们通过调用 /spawn 并输入参数来产生一只新的乌龟。从命令行在服务调用中输入 <arguments> 需要采用YAML语法。 [待校准@8214]

输入命令: [待校准@8115]

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

您将获得正在发生的事情的这种方法样式的视图,然后是服务响应: [待校准@8215]

requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

response:
turtlesim.srv.Spawn_Response(name='turtle2')

您的turtlesim窗口将立即更新新产生的海龟: [待校准@8216]

../../_images/spawn.png

总结

节点可以使用ROS 2中的服务进行通信。与话题不同 -- 一种单向通讯模式,其中一个节点发布可以被一个或多个订阅者使用的信息 -- 服务是一种请求/响应模式,其中客户端向提供服务的节点和服务处理请求并生成响应。 [待校准@8217]

您通常不希望使用服务进行连续调用; 话题甚至动作都更适合。 [待校准@8218]

在本教程中,您使用命令行工具来识别、详细说明和调用服务。 [待校准@8219]

下一步

在下一个教程中: doc:'//Parameters/Understanding-ROS2-Parameters',您将学习如何配置节点设置。 [待校准@8220]