ROS2-Beginner:5-理解服务

发布时间 2023-06-01 17:40:05作者: gary_123

背景

服务是ros graph中另一种通信方法。服务是基于调用和响应相比话题是发布者和订阅者模式。话题允许节点来订阅数据流并获得连续的更新。服务只当被具体客户端调用时才提供数据。

任务

1、打开turtlesim仿真器

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

2、ros2 服务列表

显示如下服务列表

ros2 service list

您将看到两个节点有相同的六个服务在他们的参数中。ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是参数构建的基础。

本节将聚焦在turtlesim具体的服务,/clear/kill/reset/spawn/turtle1/set_pen/turtle1/teleport_absolute以及/turtle1/teleport_relative。

3、ros2服务类型

服务具有描述服务的请求和响应数据的结构的类型。服务类型的定义类似于话题类型,服务类型有两个部分:一个消息用户请求,另一个用于响应。

查看服务的类型:

ros2 service type <service_name>

下面看一下/clear的类型:

ros2 service type /clear

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

3.1 ros2 service list -t

显示所有服务的具体类型

4、ros2 服务发现

如果想要发现具体服务,则使用下面

ros2 service find <type_name>

查找所有空类型的服务

ros2 service find std_srvs/srv/Empty
/clear
/reset

5、ros2 接口显示(ros2 interface show)

ros2 interface show <type_name>

查看一下/clear服务的类型,Empty:

ros2 interface show std_srvs/srv/Empty

返回

---

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

要查看/spown服务的请求和响应参数,请运行以下命令:
float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

第---行上方的信息告诉我们调用/spaw所需的参数。x、 y和θ决定了生成的海龟的2D姿态,而这个name显然是可选的。

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

6、ros2 service call

如何找到该类型参数的结构,可以使用以下方法调用服务:

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

<arguments>不分是可选项。例如Empty类型的服务没有任何参数

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: ''}"

总结

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

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