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

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

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

相关推荐
元让_vincent18 小时前
DaliyCoding C++ ROS | C++ 避坑指南:ROS 回调函数中的对象生命周期陷阱 (Use-After-Free)
开发语言·c++·机器人·ros·ros2
liuniu08182 天前
参数--parameters
ros
liuniu08183 天前
节点--node
ros
liuniu08185 天前
VMware虚拟机安装ubuntu2022
ubuntu·ros
Tfly__5 天前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
Eric.Lee202110 天前
SLAM 路径规划的安全走廊实现
python·机器人·ros·路径规划·避障·安全走廊
滴啦嘟啦哒13 天前
【机械臂】【LLM】一、接入千问LLM实现自然语言指令解析
深度学习·ros·vla
wzyannn15 天前
Ubuntu24.04下ROS2和MoveIt2控制六轴机械臂(持续更新)
ros·机械臂·ros2
岱宗夫up17 天前
基于ROS的视觉导航系统实战:黑线循迹+激光笔跟随双模态实现(冰达机器人Nano改造)
linux·python·机器人·ros