您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.

了解服务

目标 使用命令行工具了解 ROS 2 中的服务。

辅导水平: 初学者

时间 10 分钟

背景介绍

服务是 ROS 图中节点的另一种通信方式。与主题的 "发布者-订阅者 "模式相比,服务基于 "调用-响应 "模式。主题允许节点订阅数据流并获得持续更新,而服务只有在客户端特别调用时才会提供数据。

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

先决条件

本教程中提到的一些概念,如 节点主题在本系列之前的教程中已经介绍过。

您需要 海龟模拟软件包.

与往常一样,别忘了在 您打开的每个新终端.

任务

1 设置

启动两个海龟模拟节点、 /turtlesim/teleop_turtle.

打开一个新终端并运行

ros2 运行 turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2 ROS2 服务清单

运行 玫瑰2 服务 清单 命令将返回系统中当前激活的所有服务的列表:

/清除
/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

您将看到,两个节点都有相同的六个服务,其中 参数 的名称。ROS 2 中几乎每个节点都有这些基础服务,而参数就是在这些服务的基础上构建的。下一篇教程将详细介绍参数。本教程将不讨论参数服务。

现在,让我们来关注一下海龟模拟专用服务、 /清除, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute/turtle1/teleport_relative.您可能还记得在 使用 turtlesim、ros2 和 rqt 教程。

3 ROS2 服务类型

服务类型描述了服务请求和响应数据的结构。服务类型的定义与主题类型类似,只是服务类型有两部分:一部分是请求信息,另一部分是响应信息。

要查找服务的类型,请使用命令:

ros2 服务类型 <服务名称>;

让我们看看乌龟的 /清除 服务。在新终端中输入命令:

ros2 服务类型 / 清除

应该返回:

std_srvs/srv/Empty

"(《世界人权宣言》) 类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。

3.1 ros2 服务列表 -t

要同时查看所有活动服务的类型,可以将 --显示类型 选项,缩写为 -t,以 清单 指挥:

ros2 service list -t

哪个会回来?

/clear [std_srvs/srv/Empty] (清除)
/kill [turtlesim/srv/Kill] (杀死)
/reset [std_srvs/srv/Empty] (空)
/spawn [turtlesim/srv/Spawn] [海龟模拟/srv/Spawn]。
...
/turtle1/set_pen[turtlesim/srv/SetPen]。
/turtle1/teleport_absolute[turtlesim/srv/TeleportAbsolute]。
/turtle1/teleport_relative [turtlesim/srv/TteleportRelative] [turtlesim/srv/TteleportRelative
...

4 ROS2 服务查找

如果要查找特定类型的所有服务,可以使用该命令:

ros2 service find <type_name>;

例如,您可以找到所有 类型的服务:

ros2 service find std_srvs/srv/Empty

哪个会回来?

/清除
/reset

5 ros2 interface show

您可以通过命令行调用服务,但首先需要了解输入参数的结构。

ros2 interface show <type_name>;

/清除 服务类型、 :

ros2 interface show std_srvs/srv/Empty

哪个会回来?

---

"(《世界人权宣言》) --- 将请求结构(上图)和响应结构(下图)分开。但是,正如您前面所学到的 类型不发送或接收任何数据。因此,它的结构自然是空白的。

让我们反省一下带有发送和接收数据类型的服务,例如 /spawn.从 玫瑰2 服务 清单 -t我们知道 /spawn的类型是 turtlesim/srv/Spawn.

要查看 /spawn 服务,运行该命令:

ros2 interface show turtlesim/srv/Spawn

哪个会回来?

float32 x
float32 y
float32 theta
string name # 可选。如果为空,将创建一个唯一的名称并返回
---
字符串名称

上面的信息 --- 行告诉我们调用 /spawn. x, yθ 确定产卵乌龟的二维姿态,以及 名字 显然是可选的。

在这种情况下,您并不需要知道该行下面的信息,但它可以帮助您了解从调用中得到的响应的数据类型。

6 ROS2 服务呼叫

现在您已经知道什么是服务类型、如何查找服务的类型以及如何查找该类型的参数结构,您可以使用

ros2 服务调用 <service_name> <service_type> <arguments>;

"(《世界人权宣言》) <参数>; 部分是可选的。例如,您知道 类型服务没有任何参数:

ros2 服务调用 /clear std_srvs/srv/Empty

该命令将清除海龟模拟窗口中绘制的任何线条。

././././_images/clear.png

现在,让我们调用 /spawn 和设置参数。输入 <参数>; 必须使用 YAML 语法。

输入命令:

ros2 服务调用 /spawn turtlesim/srv/Spawn "{x:2,y:2,theta:0.2,name:''}";

您将通过这种方法式的视图了解正在发生的事情,然后得到服务响应:

requester: 正在请求: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

回应:
turtlesim.srv.Spawn_Response(name='turtle2')

海龟模拟窗口会立即更新,显示新产卵的海龟:

.././././_images/spawn1.png

8 ros2 服务回声

要查看服务客户端和服务服务器之间的数据通信,您可以 回响 使用的服务:

ros2 service echo <service_name | service_type> <arguments>;

玫瑰2 服务 回响 依赖于服务客户端和服务器的服务自省,默认情况下是禁用的。要启用它,用户必须调用 配置自省 创建服务器客户端或服务器后。

启动 反省客户端反省服务 服务自省演示。

ros2 launch demo_nodes_cpp introspect_services_launch.py

打开另一个终端,运行以下命令为 反省客户端反省服务.

ros2 param set /introspection_service service_configure_introspection 内容
ros2 param set /introspection_client client_configure_introspection 内容

现在,我们可以看到 反省客户端反省服务 经由 玫瑰2 服务 回响.

ros2 service echo --flow-style /add_twoo_ints
信息
  事件类型:REQUEST_SENT
  盖章:
    sec: 1709408301
    Nanosec: 423227292
  client_gid: [1、15、0、18、250、205、12、100、0、0、0、0、0、21、3]
  序列号: 618
请求:[{a:2,b:3}]
回应:[]
---
信息
  事件类型:request_received
  盖章:
    sec: 1709408301
    Nanosec: 423601471
  client_gid: [1, 15, 0, 18, 250, 205, 12, 100, 0, 0, 0, 0, 0, 0, 20, 4]
  序列号: 618
请求:[{a:2,b:3}]
回应:[]
---
信息
  事件类型:事件类型: RESPONSE_SENT
  盖章:
    sec: 1709408301
    Nanosec: 423900744
  client_gid: [1, 15, 0, 18, 250, 205, 12, 100, 0, 0, 0, 0, 0, 0, 20, 4]
  序列号: 618
要求:[]
回复:{总和:5}]
---
信息
  事件类型:response_received
  盖章:
    sec: 1709408301
    Nanosec: 424153133
  client_gid: [1、15、0、18、250、205、12、100、0、0、0、0、0、21、3]
  序列号: 618
要求:[]
回复:{总和:5}]
---

摘要

在 ROS 2 中,节点可以使用服务进行通信。与主题(一种单向通信模式,节点发布的信息可供一个或多个订阅者使用)不同,服务是一种请求/响应模式,客户端向提供服务的节点提出请求,服务处理请求并生成响应。

一般情况下,您不希望使用服务进行连续调用;主题或甚至操作会更合适。

在本教程中,您使用了命令行工具来识别、反省和调用服务。

下一步工作

在下一个教程中 了解参数您将学习如何配置节点设置。