9.ROS2笔记-服务
背景
服务是ROS图中节点的另一种通信方法。服务基于呼叫和响应模型,而不是主题的发布者-订阅者模型。虽然主题允许节点订阅数据流并获得持续更新,但服务只有在客户端专门调用时才提供数据。
需要条件
本教程中提到的一些概念,如节点和主题,已在本系列以前的教程中介绍过。
你需要一个turtlesim软件包;安装和配置好ros2环境。
1.启动
启动两个turtlesim 节点 /turtlesim
和 /teleop_turtle
在一个终端执行
ros2 run turtlesim turtlesim_node
打开另一个终端执行
ros2 run turtlesim turtle_teleop_key
2. ros2 service list
在一个新终端执行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
您将看到两个节点都有相同的六个服务,它们的名称中都有"parameters"。ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是参数构建的基础。在下一个教程中将有更多关于参数的内容。在本教程中,参数服务将从讨论中省略。
现在,让我们关注特定于turtlesim的服务,/clear、/kill、/reset、/spown、/turtle1/set_pen、/turle1/transport_absolute和/turtle1/transport_relative。您可能还记得在使用turtlesim、ros2和rqt教程中使用rqt与其中一些服务进行过交互。
3.ros2 sevice type
服务具有描述服务的请求和响应数据的结构的类型。服务类型的定义与主题类型类似,只是服务类型有两部分:一部分用于请求,另一部分用于响应。要查找服务的类型,请使用以下命令:
ros2 service type <service_name>
在一个新终端输出以下命令
~$ ros2 service type /clear
std_srvs/srv/Empty
Empty类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。
要同时查看所有活动服务的类型,可以将–show types选项(缩写为-t)附加到list命令中:
~$ ros2 service list -t
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
/teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
/teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
/teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
/teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
/turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
/turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
/turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
/turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
4 ros2 service find
如果要查找特定类型的所有服务,可以使用以下命令:
ros2 service find <type_name>
例如您可以这样查找所有的Empty
类型服务:
~$ ros2 service find std_srvs/srv/Empty
/clear
/reset
5 ros2 interface show
您可以通过命令调用服务,但首先你需要知道输入参数的结构。
ros2 interface show <type_name>
在clear
服务类型typea
上测试,
~$ ros2 interface show std_srvs/srv/Empty
---
—将请求结构(上图)与响应结构(下图)分离。但是,正如您之前了解到的,Empty类型不会发送或接收任何数据。所以,自然,它的结构是空白的。
让我们查看一个具有发送和接收数据类型的服务,比如/spown。根据ros2服务列表-t的结果,我们知道/spown的类型是turtlesim/srv/Spown。
要查看/spown服务的请求和响应参数,请运行以下命令:
~$ 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
---
string name
—行上方的信息告诉我们调用/Spawn所需的参数。x、 y和θ决定海龟的2D姿势,而这个名字显然是可选的。
在这种情况下,您不需要知道下面的信息,但它可以帮助您了解从调用中获得的响应的数据类型
6 rosa2 service call
现在您已经知道了什么是服务类型,如何查找服务的类型,以及如何查找该类型参数的结构,您可以使用以下方法调用服务:
ros2 service call <service_name> <service_type> <arguments>
<arguments>部分是可选的。例如,您知道Empty类型的服务没有任何参数:
ros2 service call /clear std_srvs/srv/Empty
此命令将清除海龟在turtlesim窗口中绘制的任何线条.
现在,让我们通过调用/speew并设置参数来生成一只新海龟。命令行的服务调用中的输入<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')
您的turtlesim窗口将立即更新一个海龟
总结
节点可以使用ROS 2中的服务进行通信。与主题(一种单向通信模式,节点发布一个或多个订阅者可以使用的信息)不同,服务是一种请求/响应模式,客户端向提供服务的节点发出请求,服务处理请求并生成响应。
您通常不希望使用服务进行连续调用,话题甚至动作会更适合。
在本教程中,您使用了命令行工具来识别、查看和调用服务。