警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
了解 ROS 2 服务
目标 使用命令行工具了解 ROS 2 中的服务。
辅导水平: 初学者
时间 10 分钟
背景介绍
服务是 ROS 图中节点的另一种通信方式。与主题的 "发布者-订阅者 "模式相比,服务基于 "调用-响应 "模式。主题允许节点订阅数据流并获得持续更新,而服务只有在客户端特别调用时才会提供数据。


先决条件
本教程中提到的一些概念,如 结点 和 主题在本系列之前的教程中已经介绍过。
您需要 海龟模拟软件包
与往常一样,别忘了在 您打开的每个新终端.
任务
1 设置
启动两个海龟模拟节点、 /turtlesim
和 /teleop_turtle
.
打开一个新终端并运行
ros2 运行 turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
2 ROS2 服务清单
运行 玫瑰2 服务 清单
命令将返回系统中当前激活的所有服务的列表:
/清除
/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
您将看到,两个节点都有相同的六个服务,其中 参数
的名称。ROS 2 中几乎每个节点都有这些基础服务,而参数就是在这些服务的基础上构建的。下一篇教程将详细介绍参数。本教程将不讨论参数服务。
现在,让我们来关注一下海龟模拟专用服务、 /清除
, /kill
, /reset
, /spawn
, /turtle1/set_pen
, /turtle1/teleport_absolute
和 /turtle1/teleport_relative
.您可能还记得在 "介绍 turtlesim 和 rqt" 教程。
3 ROS2 服务类型
服务类型描述了服务请求和响应数据的结构。服务类型的定义与主题类型类似,只是服务类型有两部分:一部分是请求信息,另一部分是响应信息。
要查找服务的类型,请使用命令:
ros2 服务类型 <服务名称>;
让我们看看乌龟的 /清除
服务。在新终端中输入命令:
ros2 服务类型 / 清除
应该返回:
std_srvs/srv/Empty
"(《世界人权宣言》) 空
类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。
3.1 ros2 服务列表 -t
要同时查看所有活动服务的类型,可以将 --显示类型
选项,缩写为 -t
,以 清单
指挥:
ros2 service list -t
哪个会回来?
/clear [std_srvs/srv/Empty] (清除)
/kill [turtlesim/srv/Kill] (杀死)
/reset [std_srvs/srv/Empty] (空)
/spawn [turtlesim/srv/Spawn] [海龟模拟/srv/Spawn]。
...
/turtle1/set_pen[turtlesim/srv/SetPen]。
/turtle1/teleport_absolute[turtlesim/srv/TeleportAbsolute]。
/turtle1/teleport_relative [turtlesim/srv/TteleportRelative] [turtlesim/srv/TteleportRelative
...
4 ROS2 服务查找
如果要查找特定类型的所有服务,可以使用该命令:
ros2 service find <type_name>;
例如,您可以找到所有 空
类型的服务:
ros2 service find std_srvs/srv/Empty
哪个会回来?
/清除
/reset
5 ros2 interface show
您可以通过命令行调用服务,但首先需要了解输入参数的结构。
ros2 srv show <type_name>;
要在 /清除
服务类型、 空
:
ros2 srv show std_srvs/srv/Empty
哪个会回来?
---
"(《世界人权宣言》) ---
将请求结构(上图)和响应结构(下图)分开。但是,正如您前面所学到的 空
类型不发送或接收任何数据。因此,它的结构自然是空白的。
让我们反省一下带有发送和接收数据类型的服务,例如 /spawn
.从 玫瑰2 服务 清单 -t
我们知道 /spawn
的类型是 turtlesim/srv/Spawn
.
要查看 /spawn
调用和请求,运行该命令:
ros2 srv show turtlesim/srv/Spawn
哪个会回来?
float32 x
float32 y
float32 theta
string name # 可选。如果为空,将创建一个唯一的名称并返回
---
字符串名称
上面的信息 ---
行告诉我们调用 /spawn
.
x
, y
和 θ
确定产卵海龟的位置,以及 名字
显然是可选的。
在这种情况下,您并不需要知道该行下面的信息,但它可以帮助您了解从调用中得到的响应的数据类型。
6 ROS2 服务呼叫
现在您已经知道什么是服务类型、如何查找服务的类型以及如何查找该类型的参数结构,您可以使用
ros2 服务调用 <service_name> <service_type> <arguments>;
"(《世界人权宣言》) <参数>;
部分是可选的。例如,您知道 空
类型服务没有任何参数:
ros2 服务调用 /clear std_srvs/srv/Empty
该命令将清除海龟模拟窗口中绘制的任何线条。

现在,让我们调用 /spawn
并输入参数。输入 <参数>;
必须使用 YAML 语法。
输入命令:
ros2 服务调用 /spawn turtlesim/srv/Spawn "{x:2,y:2,theta:0.2,name:''}";
您将通过这种方法式的视图了解正在发生的事情,然后得到服务响应:
等待提供服务...
requester: 正在请求: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='None')
回应:
turtlesim.srv.Spawn_Response(name='None')
海龟模拟窗口会立即更新,显示新产卵的海龟:

摘要
在 ROS 2 中,节点可以使用服务进行通信。与主题这种单向通信模式不同,服务是一种请求/响应模式,客户向提供服务的节点提出请求,服务处理请求并生成响应。
一般情况下,您不希望使用服务进行连续调用;主题或甚至操作会更合适。
在本教程中,您使用了命令行工具来识别、阐述和调用服务。
下一步工作
在下一个教程中 了解 ROS 2 参数您将学习如何配置节点设置。