1.前言

本节我们介绍ROS2中另一个概念:Service(服务),它是 请求 - 应答(Request-Response),一问一答、同步交互、一对一,适合需要调用功能、获取结果的场景。

2.什么是Service

ROS2 里的一种核心通信模型,由 服务端(Server)和 客户端(Client)组成:

  1. Server(服务端):提供功能,等待别人发请求,收到请求后执行逻辑,返回应答结果;长期等待,常驻运行。
  2. Client(客户端):主动发起请求,等待服务端处理完成,拿到返回结果;用完可以退出,也可以多次发起调用。
    在这里插入图片描述
    在这里插入图片描述

3.Service相关命令

启动两个 turtlesim 节点,/turtlesim和/teleop_turtle

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

3.1查看服务列表

ros2 service list

在这里插入图片描述

3.2查看service类型

ros2 service type <service_name>

我们来看看turtlesim的/clear服务。在一个新的终端窗口中,输入以下命令:

ros2 service type /clear

在这里插入图片描述
std_srvs/srv/Empty 是返回的服务类型。
Empty代表:
Request:客户端调用时不需要传任何参数
Response:服务端返回的时候也不带任何数据

3.3查看服务列表的类型

参数:–show-types可缩写为-t

ros2 service list -t

在这里插入图片描述

3.4查看服务的信息

ros2 service info <service_name>

在这里插入图片描述
Services count: 1代表有 1 个服务端(Server)正在提供 /clear 这个服务
Clients count: 0代表当前没有任何客户端(Client)正在连接、等待调用这个服务

3.5 查找服务

如果要查找特定类型的所有服务,可以使用以下命令:

ros2 service find <type_name>

例如,您可以Empty像这样找到所有已定义的服务:

ros2 service find std_srvs/srv/Empty

在这里插入图片描述

3.6查看服务源码定义

ros2 interface show <type_name>

用来查看 ROS2 服务接口的源码定义,看清里面有哪些字段、类型、注释。
在这里插入图片描述
间的 --- 是 srv 的分隔符:上面是 Request 请求段,下面是 Response 应答段

这个命令不能看实时数据,只能看接口定义

3.7调用服务

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

主动调用一个已经在线的服务,构造请求数据发给服务端,并同步等待返回应答,打印结果
这部分是可选的。例如,Empty类型化服务没有任何参数:

ros2 service call /clear std_srvs/srv/Empty

在这里插入图片描述
此命令将清除 turtlesim 窗口中海龟绘制的所有线条。

现在让我们通过调用/spawn并设置参数来生成一个新的海龟。从命令行调用服务时,输入必须采用 YAML 语法。
请输入命令:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

在这里插入图片描述

3.8监听服务的请求与响应数据:ros2 service echo

这个命令的作用:监听服务的请求(request)和响应(response)数据,实时打印服务调用的收发内容,相当于服务抓包调试工具。

ros2 service echo <service_name | service_type> <arguments>

可选参数:

# 只打印请求
ros2 service echo /xxx --request-only
# 只打印响应
ros2 service echo /xxx --response-only
# 不打印字段说明,精简输出
ros2 service echo /xxx --no-arr

开始实操前我们需要执行两个命令,turtlesim 源码里默认没有开启 service introspection,官方专门写了支持内省的示例节点:

# 启动introspection_client 和 introspection_service 服务内省demo
ros2 launch demo_nodes_cpp introspect_services_launch.py

然后设置参数:

ros2 param set /introspection_service service_configure_introspection contents
ros2 param set /introspection_client client_configure_introspection contents
ros2 service echo --flow-style /add_two_ints

在这里插入图片描述

4.小结

Topic(话题)适合持续流式数据传输,service(服务)适合偶尔的单次请求;服务不适合高频连续通信,高频场景优先话题,长耗时任务优先 动作(Action)。Action将在后面课程中介绍。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐