背景
服务是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中的服务进行通信。与主题(一种单向通信模式,其中节点发布可由一个或多个订阅者使用的信息)不同,服务是一种请求/响应模式,其中客户端向提供服务的节点发出请求,服务处理请求并生成响应。
您通常不希望使用服务进行连续呼叫;话题甚至行动会更适合。
标签:Empty,服务,Beginner,service,clear,理解,ROS2,turtlesim,ros2 From: https://www.cnblogs.com/gary-guo/p/17449736.html