背景
服务是 ROS 图中节点之间的另一种通信方式。服务基于请求-响应模型,而主题则基于发布-订阅模型。主题允许节点订阅数据流并持续接收更新,而服务仅在客户端特定调用时提供数据。


任务练习
2.1 setup
开启两个turtle节点 , /turtlesim and /teleop_turtle.
请打开一个新的终端,并输入以下命令:
ros2 run turtlesim turtlesim_node
请打开另一个新的终端,并输入以下命令:
ros2 run turtlesim turtle_teleop_key
2.2 查看服务列表
ros2 service list

你会看到两个节点都有相同的六个服务,这些服务的名称中包含参数。几乎每个 ROS 2 节点都有这些基础服务,参数就是基于这些服务构建的。在下一个教程中将会有更多关于参数的内容。在本教程中,参数服务将不在讨论范围内。
现在,让我们专注于 turtlesim 特定的服务:/clear、/kill、/reset、/spawn、/turtle1/set_pen、/turtle1/teleport_absolute 和 /turtle1/teleport_relative。你可能还记得在"使用 turtlesim、ros2 和 rqt 教程"中,你通过 rqt 与其中一些服务进行了交互。
2.3 查看服务类型
服务有描述服务请求和响应数据结构的类型。服务类型的定义方式类似于主题类型,不同之处在于服务类型有两个部分:一个用于请求的消息,另一个用于响应的消息。
要查找服务的类型,请使用以下命令:
ros2 service type <service_name>
让我们来看一下 turtlesim 的 /clear 服务。在一个新的终端中,输入以下命令:
ros2 service type /clear

Empty 类型表示服务调用在发送请求时不发送数据,并且在接收响应时不接收数据。
2.4 查看所有服务的类型
要同时查看所有活动服务的类型,可以在 list 命令后附加 --show-types 选项,缩写为 -t:
ros2 service list -t

2.5 服务搜索
如果你想查找某种类型的所有服务,可以使用以下命令:
ros2 service find <type_name>
例如,你可以这样找到所有类型为 Empty 的服务:
ros2 service find std_srvs/srv/Empty

2.6 服务接口查看
你可以从命令行调用服务,但首先你需要了解输入参数的结构。
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

───线以上的信息告诉我们调用 /spawn 所需的参数。x、y 和 theta 决定了生成乌龟的二维姿态,而 name 显然是可选的。
线以下的信息在这种情况下你不需要了解,但它可以帮助你理解从调用中得到的响应的数据类型。
2.7 服务调用
现在你已经知道了什么是服务类型、如何找到服务的类型以及如何找到该类型参数的结构,你可以使用以下方法调用服务:
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: ''}"
您将以这种方法风格查看正在发生的情况,然后看到服务响应。
您的 turtlesim 窗口将立即更新,显示新生成的乌龟:

总结
节点可以使用 ROS 2 中的服务进行通信。与主题不同------主题是一种单向通信模式,节点发布信息,订阅者可以接收这些信息------服务是一种请求/响应模式,客户端向提供服务的节点发出请求,服务处理请求并生成响应。
通常你不希望将服务用于连续调用;主题甚至动作会更适合。
在本教程中,你使用了命令行工具来识别、检查和调用服务。