服务--services

背景

服务是 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 中的服务进行通信。与主题不同------主题是一种单向通信模式,节点发布信息,订阅者可以接收这些信息------服务是一种请求/响应模式,客户端向提供服务的节点发出请求,服务处理请求并生成响应。

通常你不希望将服务用于连续调用;主题甚至动作会更适合。

在本教程中,你使用了命令行工具来识别、检查和调用服务。

相关推荐
何伯特8 天前
ROS与Conda的兼容性问题深度解析与解决方案
conda·ros
hhzz12 天前
利用Terraform格式模板文件创建和部署基本网络资源
阿里云·云原生·ros·terraform·资源编排
github5actions13 天前
ROS开发实战:如何用rviz文件保存和加载你的SLAM可视化配置(附避坑指南)
ros·slam·rviz·机器人开发
REDcker13 天前
DDS 协议详解
机器人·ros·ros2·dds
铁头七娃16 天前
Solidworks 2024 根据机器人装配体,生成urdf文件
机器人·ros·solidworks
三克的油17 天前
ros-day5
ros
元让_vincent20 天前
DailyCoding C++ CMake | CMake 踩坑记:解决 ROS 项目中的“循环引用”与库链接依赖问题
c++·机器人·ros·动态库·静态库·cmake·循环引用
元让_vincent21 天前
DaliyCoding C++ ROS | C++ 避坑指南:ROS 回调函数中的对象生命周期陷阱 (Use-After-Free)
开发语言·c++·机器人·ros·ros2
liuniu081822 天前
参数--parameters
ros