什么是ROS2中的——services

351 阅读4分钟

services是一种请求/响应模式,其中客户端向提供服务的节点发出请求,服务处理请求并生成响应。节点可以使用ROS2中的services进行通信。

1、背景

services是ROS图中节点的另一种通信方法。services基于call-and-response模型,而不是Topics的publisher-subscriber模型。虽然主题允许nodes订阅数据流并获得持续更新,但services只有在客户端专门调用时才提供数据。

Service-单服务客户端

Service-SingleServiceClient.gif

Service-多服务客户端

Service-MultipleServiceClient.gif

2、ROS2中——services

启动两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。

打开一个新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2.1 ros2 service list

在新终端中运行ros2 service list命令将返回系统中当前处于活动状态的所有服务的列表:

/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

将看到两个节点具有相同的六个服务,其名称中带有参数。ROS2中的几乎每个节点都有这些构建参数的基础设施服务。 在下一篇文章中将详细介绍parameter。在文中,将省略参数服务。

现在,让我们专注于特定于 turtlesim 的services,/clear、/kill、/reset、/spawn、/turtle1/set_pen、/turtle1/teleport_absolute 和 /turtle1/teleport_relative。您可能还记得在使用 turtlesim、ros2 和 rqt 教程中使用 rqt 与其中一些服务进行交互。

3、 ros2 service type

Services具有描述Services的request and response 数据的结构的类型。服务类型的定义与主题类型类似,不同之处在于服务类型分为两部分:一条消息用于请求,另一部分用于响应。

要找出服务的类型,请使用以下命令:

ros2 service type <service_name>

看看 turtlesim 的 /clear service。在新终端中,输入命令:

ros2 service type /clear

返回:

std_srvs/srv/Empty

Empty 类型表示服务调用在发出请求时不发送任何数据,在接收响应时不接收任何数据。

3.1 ros2 service list -t

要同时查看所有活动服务的类型,可以将 --show-types 选项(缩写为 -t)附加到列表命令:

ros2 service list -t

返回:

/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]
...

image.png

4 ROS2服务查找

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

ros2 service find <type_name>

例如,可以像这样找到所有Empty类型化服务:

ros2 service find std_srvs/srv/Empty

返回

/clear
/reset

5 ROS2接口展示

可以从命令行调用服务,但首先需要知道输入参数的结构。

ros2 interface show <type_name>

在 /clear 服务的类型 Empty 上尝试此操作:

ros2 interface show std_srvs/srv/Empty

返回:

---

---将请求结构(上图)与响应结构(下图)分开。但是,如前所述,Empty 类型不会发送或接收任何数据。所以,自然,它的结构是空白的。

让我们自检一个具有发送和接收数据类型的服务,如 /spawn。ros2 service list -t,看到 /spawn 的类型是 turtlesim/srv/Spawn。

要查看 /spawn 服务的请求和响应参数,请运行以下命令:

ros2 interface show turtlesim/srv/Spawn
float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---

image.png

---行上方的信息告诉我们调用 /spawn 所需的参数。x、y 和 theta 决定了小乌龟龟在二维空间中的行走航线,名称显然是可选的。

在这种情况下,不需要了解该行下方的信息,但它可以帮助了解从呼叫中获得的响应的数据类型。

6 ROS2服务呼叫

上面已经知道了什么是服务类型、如何查找服务的类型以及如何查找该类型参数的结构,可以使用以下命令调用服务:

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

该<arguments>部件是可选的。例如,知道空类型化服务没有任何参数:

ros2 service call /clear std_srvs/srv/Empty

此命令将清除绘制的任何线条的 turtlesim 窗口。

现在通过调用 /spawn 并设置参数来生成一只新。<arguments> 从命令行输入的服务调用需要使用 YAML 语法。

输入命令:

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

将获得正在发生的事情的此方法样式视图,然后是服务响应:

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

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

image.png

模拟窗口将立即更新为新生成的海龟

image.png

总结

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

通常不希望使用服务进行连续呼叫;主题甚至行动会更适合。