Understanding services:理解服务(Service)

简介: Understanding services:理解服务(Service)

@[toc]
参考官方文档:Understanding services

背景

服务(Service)是ROS图(ROS graph)中节点的另一种通信方法。服务是基于调用和响应(call-and-response)的模式,而不是话题的发布者-订阅者(publisher-subscriber)模式。话题允许节点订阅数据流并获得持续的更新,而服务只在被客户端调用时提供数据。
image.png
image.png

1. 准备工作

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

打开一个新的终端并运行:

ros2 run turtlesim turtlesim_node
AI 代码解读

打开另一个终端并运行

ros2 run turtlesim turtle_teleop_key
AI 代码解读

2. 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

你会看到 teleop_turtle 和 turtlesim 这两个节点都有同样的六个服务,其名称中都有 parameters 。在ROS 2中,几乎每个节点都有这些基础设施服务,而参数是建立在这些服务之上的。在下一个教程中会有更多关于参数的内容。在本教程中,将省略参数服务的讨论。

现在,让我们把注意力集中在针对海龟的服务上,/clear ,/kill ,/reset , /spawn , /turtle1/set_pen , /turtle1/teleport_absolute , 和 /turtle1/teleport_relative 。你可能记得在Using turtlesim and rqt:使用 turtlesim 和 rqt教程中使用rqt与这些服务中的一些进行互动。

3. ros2 service type 命令

要想知道一个服务的类型,使用命令:

ros2 service type <service_name>
AI 代码解读

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

ros2 service type /clear
AI 代码解读

应该返回:

std_srvs/srv/Empty

Empty 类型意味着服务调用在发出请求时不发送数据,在接收响应时不接收数据。

3.1 ros2 service list -t 命令

如果要看到所有正在运行的服务的类型,你可以在 list 命令中附加 --show-types 选项,缩写为 -t :

ros2 service list -t
AI 代码解读

返回结果如下:

/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...

4. ros2 service find 命令

如果你想找到某个特定类型的所有服务,你可以使用命令:

ros2 service find <type_name>
AI 代码解读

例如,你可以通过下面这条命令找到所有 Empty 类型的服务:

ros2 service find std_srvs/srv/Empty
AI 代码解读

返回结果如下:

/clear
/reset

5. ros2 interface show 命令

你可以从命令行调用服务,但首先你需要知道输入参数的结构:

ros2 interface show <type_name>
AI 代码解读

例如:

ros2 interface show std_srvs/srv/Empty
AI 代码解读

返回结果如下:

---

---将请求结构(上面)和响应结构(下面)分开。但是,正如你前面所学到的,空(Empty)类型不发送或接收任何数据。所以,自然地,它的结构是空白的。

让我们来查看一个具有发送和接收数据类型的服务,比如 /spawn 。从 ros2 service list -t 的结果可以知道 /spawn 的类型是 turtlesim/srv/Spawn:

ros2 interface show turtlesim/srv/Spawn
AI 代码解读
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name

6. ros2 service call 命令

现在你知道了什么是服务类型,如何找到一个服务的类型,以及如何找到该类型的参数结构,你可以用以下方法调用一个服务:

ros2 service call <service_name> <service_type> <arguments>
AI 代码解读

\<arguments> 部分是可选的。例如,空类型的服务没有任何参数:

ros2 service call /clear std_srvs/srv/Empty
AI 代码解读

这条命令将清除海龟模拟窗口中的任何线条。

现在让我们通过调用 /spawn 服务,输入参数来生成一个新的乌龟。在命令行的服务调用中,输入的 \<arguments> 需要使用YAML语法:

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

响应如下:

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窗口将立即生成新的乌龟。

2h1ich
+关注
目录
打赏
0
0
0
0
654
分享
相关文章
CSS实现禁用状态,样式设置以及不可点击事件的行为
CSS实现禁用状态,样式设置以及不可点击事件的行为
3612 0
Websoft9 运维面板有多好用,试了才知道
Websoft9 运维面板以开源应用全生命周期管理为核心,内置 ​200+ 应用模板,支持 WordPress、Magento 等一键部署,10 分钟完成复杂环境搭建,对比宝塔节省 80% 手动配置时间。其基于 ​GitOps 架构,实现代码与数据分离管理,支持持续部署与回滚。安全层面提供全链路防护,覆盖漏洞扫描、WAF 防御及一键修复,资源占用仅为 cPanel 的 1/3,适配多云及 Docker/K8s 生态。相较于宝塔,Websoft9 在开源适配深度、自动化能力及轻量化设计上优势显著,尤其适合企业级 SaaS 与开发者。
161 0
Python量化炒股的获取数据函数—get_fundamentals()
Python量化炒股的获取数据函数—get_fundamentals()
322 0
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
479 1
EasyCode 自动生成代码
【10月更文挑战第16天】总的来说,EasyCode 自动生成代码是一款非常有价值的工具。它为开发者们带来了便捷、高效和创新,让软件开发变得更加轻松和有趣。随着技术的不断进步,相信 EasyCode 还会不断完善和发展,为开发者们提供更多更好的服务。
157 1
你觉得Node.js与JAVA相比,其优势在哪里?未来会超越JAVA吗?
你觉得Node.js与JAVA相比,其优势在哪里?未来会超越JAVA吗?
446 1
一键解锁:快速上手文心一言指令编程实践
【7月更文第18天】随着人工智能技术的飞速发展,对话式AI已经成为连接人与信息的新桥梁。百度的“文心一言”(ERNIE)作为国内领先的预训练语言模型,以其强大的语义理解和生成能力,正逐步改变我们获取信息和交互的方式。本文旨在为开发者提供一份快速上手指南,通过实际代码示例,深入浅出地介绍如何利用文心一言API进行指令编程,解锁AI对话新体验。
629 7
数据传输服务是什么?
【6月更文挑战第3天】数据传输服务是什么?
295 2
curl 使用及调用url时带有&符号被截断解决
curl 使用及调用url时带有&符号被截断解决
723 0
一文详解 Java 限流接口实现
本文介绍的实现方式属于应用级限制,应用级限流方式只是单应用内的请求限流,不能进行全局限流。要保证系统的抗压能力,限流是一个必不可少的环节,虽然可能会造成某些用户的请求被丢弃,但相比于突发流量造成的系统宕机来说,这些损失一般都在可以接受的范围之内。
一文详解 Java 限流接口实现

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问