ROS 2基础概念#6:服务(Service)| ROS 2学习笔记

服务(Service)是 ROS 2 计算图中节点通信的另一种方法。 服务基于调用和响应模型,而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获取持续更新,但服务仅在客户端专门调用时才提供数据。

ROS 2服务的基本概念

ROS 2服务定义了一种一对一的通信模式。在这种模式下,一个节点可以作为服务服务器(Service Server),另一个节点可以作为服务客户端(Service Client)。服务客户端向服务服务器发起请求,并同步等待服务器的响应。

服务通信基于预先定义的服务类型进行,服务类型定义了请求和响应的结构。这些类型在ROS 2中通过.srv文件定义,类似于消息类型是通过.msg文件定义的。.srv文件的每一部分分别定义了请求和响应的数据结构。

服务的类型

ROS 2服务包含如下两种类型

  • 服务服务器(Service Server)
  • 服务客户端(Service Client)

在ROS 2中,服务指的是远程过程调用。 换句话说,一个节点可以对另一个节点进行远程过程调用,该节点将进行计算并返回结果。

此结构反映在服务消息定义的外观中:

uint32 request
---
uint32 response

在 ROS 2 中,服务预计会快速返回,因为客户端通常正在等待结果。 服务永远不应该用于运行时间较长的进程,特别是在特殊情况下可能需要抢占的进程。 如果您的服务将进行长时间运行的计算,请考虑改用动作(action)。

服务由服务名称标识,该名称看起来很像主题名称(但位于不同的命名空间中)。

一个服务由两部分组成:服务服务器和服务客户端。

服务服务器

服务服务器是接受远程过程请求并对其执行某些计算的实体。 例如,假设 ROS 2 消息包含以下内容:

uint32 a
uint32 b
---
uint32 sum

服务服务器将是接收此消息、将 a 和 b 加在一起并返回总和的实体。

注意:

每个服务名称只能有一个服务服务器。 当多个服务服务器具有相同的服务名称时,未定义哪个服务服务器将接收客户端请求。

服务客户端

服务客户端是请求远程服务服务器代表其执行计算的实体。 从上面的示例来看,服务客户端是创建包含 a 和 b 的初始消息的实体,并等待服务服务器计算总和并返回结果。

与服务服务器不同,可以有任意数量的服务客户端使用相同的服务名称。

服务(Service)描述规范

服务在 ROS 包的 srv/ 目录中的 .srv 文件中进行描述和定义。服务描述文件由请求和响应消息类型组成,以—分隔。 任何两个以 — 连接的 .msg 文件都是合法的服务说明。

下面一个非常简单的服务示例,它接收一个字符串并返回一个字符串:

string str
---
string str

当然,也可能变得更复杂(如果您想引用同一包中的消息,则不得提及包名称):

#request constants
int8 FOO=1
int8 BAR=2
#request fields
int8 foobar
another_pkg/AnotherMessage msg
---
#response constants
uint32 SECRET=123456
#response fields
another_pkg/YetAnotherMessage val
CustomMessageDefinedInThisPackage value
uint32 an_integer

你也可以把一个服务嵌套进另外一个服务中。

服务实例分析

假设我们正在开发一个机器人应用,在这个应用中,机器人需要从一个传感器服务中获取温度读数。我们可以定义一个GetTemperature.srv服务,其请求部分为空(不需要输入参数),响应部分包含一个浮点数表示的温度值。

定义.srv文件

# GetTemperature.srv
float64 temperature

服务服务器

服务服务器的回调函数接收到请求后,会从传感器获取温度读数,并将这个值作为响应返回给客户端。

include "rclcpp/rclcpp.hpp"
include "example_interfaces/srv/get_temperature.hpp"

void handle_temperature_request(
const std::shared_ptr request,
std::shared_ptr response)
{
response->temperature = read_sensor_temperature(); // 假设这个函数从传感器读取温度
RCLCPP_INFO(rclcpp::get_logger("server"), "Sending back response: [%f]", response->temperature);
}

int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("temperature_sensor_server");
auto server = node->create_service("get_temperature", handle_temperature_request);
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}

服务客户端

客户端发起请求时不需要提供任何数据,它只需要等待温度读数的响应。

#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/get_temperature.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("temperature_sensor_client");
    auto client = node->create_client<example_interfaces::srv::GetTemperature>("get_temperature");
    
    auto request = std::make_shared<example_interfaces::srv::GetTemperature::Request>();
    auto future = client->async_send_request(request);
    
    // 等待响应
    if (rclcpp::spin_until_future_complete(node, future)

ROS 2服务命令行工具

在使用如下的命令行工具前,先启动两个 turtlesim 节点: /turtlesim 和 /teleop_turtle

打开一个 Terminal 并运行:

ros2 run turtlesim turtlesim_node 

打开另外一个 Terminal 并运行:

ros2 run turtlesim turtle_teleop_key

列举所有的ROS 2服务

在新终端中运行如下命令将返回系统中当前活动的所有服务的列表:

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

您将看到两个节点都有相同的六个服务,其名称中包含参数。 ROS 2 中的几乎每个节点都有这些参数构建的基础设施服务。现在,让我们关注turtlesim特定的服务:/clear, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute和/turtle1/teleport_relative。

查看服务类型

服务具有描述服务的请求和响应数据的结构的类型。 服务类型的定义与主题类型类似,不同之处在于服务类型有两部分:一个用于请求的消息,另一个用于响应。

要找出服务的类型,请使用以下命令:

ros2 service type <service_name>

我们来看看turtlesim的/clear服务。 在新终端中输入命令:

ros2 service type /clear

将看到如下的结果:

std_srvs/srv/Empty

Empty 类型表示服务调用在发出请求时不发送任何数据,在接收响应时不接收任何数据。

查看所有服务类型

要同时查看所有活动服务的类型,您可以将 –show-types 选项(缩写为 -t)附加到 list 命令:

ros2 service list -t

将看到如下的结果:

/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]
...

寻找服务

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

ros2 service find <type_name>

例如,您可以像这样找到所有 Empty 类型服务:

ros2 service find std_srvs/srv/Empty

将看到如下的结果:

/clear
/reset

查看服务接口参数

您可以从命令行调用服务,但首先您需要了解输入参数的结构。

ros2 interface show <type_name>.srv

在 /clear 服务的 Empty 类型上尝试此操作:

ros2 interface show std_srvs/srv/Empty.srv

将看到如下的结果:

---

— 将请求结构与响应结构分开。 但是空类型不会发送或接收任何数据。 所以它的结构是空白的。

让我们检查一下具有发送和接收数据类型的服务,例如 /spawn。 从 ros2 service list -t 的结果我们知道/spawn的类型是turtlesim/srv/Spawn。

要查看 /spawn 服务的请求和响应参数,请运行以下命令:

ros2 interface show turtlesim/srv/Spawn

将得到如下返回结果:

float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

— 行上方的信息告诉我们调用 /spawn 所需的参数。 x、y 和 theta 确定生成的Turtle的 2D 姿势,并且名称显然是可选的。

在这种情况下,您不需要了解该行下方的信息,但它可以帮助您了解从调用中获得的响应的数据类型。

调用ROS 2服务

现在您已经知道什么是服务类型、如何查找服务类型以及如何查找该类型参数的结构,您可以使用以下方式调用服务:

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

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

ros2 service call /clear std_srvs/srv/Empty

此命令将清除turtlesim 窗口中海龟绘制的任何线条。

现在我们通过调用 /spawn 并设置参数来生成新的 turtle。 从命令行进行的服务调用中的输入需要采用 YAML 语法。

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

您将获得正在发生的情况的方法风格视图,然后是服务响应:

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窗口将立即更新为新生成的 turtle:

总结

节点可以使用 ROS 2 中的服务进行通信。与主题(一种单向通信模式,其中节点发布可供一个或多个订阅者使用的信息)不同,服务是一种请求/响应模式,其中客户端向节点发出请求 提供服务,服务处理请求并生成响应。

一般不要在服务中使用连续通话的服务;这种情况下使用主题(topic)或者动作(action)会更合适。

作者ROS 2学习笔记系列文章:ROS 2学习笔记 归档 - HY's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/441268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浮点数的储存

浮点数的储存 一.浮点数的三段式&#xff08;S,E,M&#xff09;1.如何放入2.如何取出 二.为什么浮点数不能直接比较三.解释第一个问题 我们都知道整形在内存中是按照补码的形式储存的&#xff0c;但是浮点数的储存却和整数的截然不同&#xff0c;浮点数没有所谓是原反补并且浮点…

实现类似 Word 协同编辑--Canvas-Editor

前言 对于word的协同编辑&#xff0c;已经构思很久了&#xff0c;但是没有找到合适的插件。今天推荐基于canvas/svg 的富文本编辑器 canvas-editor&#xff0c;能实现类似word的基础功能&#xff0c;如果后续有更好的&#xff0c;也会及时更新。 Canvas-Editor效果图: 官方文…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

【QT6】打开项目 .pro 一堆报错 但是程序可以运行 打开别人的QT项目后,全是报错

报错环境 我通过在网上拷贝的项目&#xff0c; 然后打开pro文件 build项目 你会发现各种报错 无缘无故的报错 明明环境已经没问题了 解决方案 首先是提示no valid settings file could be found&#xff0c;这个错误很好解决&#xff0c;删除项目目录下的.user文件&#xff…

线性代数笔记14--投影

1. 一维空间投影 p X A e B − p B − X A A ⊤ e 0 A ⊤ ( B − X A ) 0 X A ⊤ A A ⊤ B X A ⊤ B A ⊤ A p X A A A ⊤ B A ⊤ A pXA\\ eB-pB-XA\\ A^{\top}e0\\ A^{\top}(B-XA)0\\ XA^{\top}AA^{\top}B\\ X\frac{A^{\top}B}{A^{\top}A}\\ pXAA\frac{A^{\top}B}{A^…

域名交易系统源码 无需授权即可正常使用,带后台,附带系统搭建教程

搭建教程 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&#xff1a;admin 密码&#xff1a;aa.798yyds.top PHP选择5.6 伪静态&#xff1a; 伪静态默认是Apache 伪静态转换&#xff1a;http://tool.bolgk.eu.org/htaccess2nginx/ 其他打不开请根据伪静态设…

Android屏幕共享-硬编码硬解码

Android屏幕共享-硬编码硬解码 说起Android之间的屏幕共享&#xff0c;第一次接触会比较陌生&#xff0c;不过大家多少有了解过ffmpeg&#xff0c;看上去是不是很熟悉&#xff1f;ffmpeg是一套处理音视频的开源程序&#xff0c;但对于C了解较少的同学&#xff0c;编译起来很复杂…

鸿蒙系统:揭秘前端开发的新机遇

众所周知&#xff0c;华为开发者大会2023&#xff0c;宣布不再兼容安卓&#xff0c;同时宣布了“鸿飞计划”&#xff0c;欲与iOS、安卓在市场三分天下&#xff0c;这对中国国产操作系统而言&#xff0c;具有划时代的意义。 鸿蒙应用开发的兴起&发展 鸿蒙操作系统是华为自…

旅游陪同翻译,英译中需要具备什么能力!

随着中国旅游业的蓬勃发展&#xff0c;越来越多的外国游客选择踏足这片充满魅力的土地。然而&#xff0c;语言障碍常常成为他们探索中国文化的绊脚石。在这时&#xff0c;旅游陪同翻译应运而生&#xff0c;为游客提供了便捷的语言沟通服务&#xff0c;让他们的旅程更加顺畅和愉…

NFT Insider #122:OpenSea与科切拉音乐节合作推出NFT系列,Flowty联合创始人购入勒布朗・詹姆斯NFT

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto) 联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&a…

借着ChatGPT的人机交互聊聊长连接

ChatGPT这两年可谓风靡全球&#xff0c;尤其是最近Sora视频模型的横空出世以及claude 3模型所具备的浅意识&#xff0c;更是像打开了新世界的大门。本文就从ChatGPT的网页聊天开始聊起&#xff08;有蹭热度之嫌&#xff0c;哈哈&#xff09;&#xff0c;聊聊长连接的发展历程和…

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作&#xff0c;是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组&#xff0c;其中心点称为锚点(anchor point) 把kernel放到像素数组之上&#xff0c;求锚点周围覆盖的像素乘积之和&#xff08;包括锚…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

vue3引入高德地图

首先注册高德key https://console.amap.com/dev/key/a vue项目中安转地图包 pnpm i amap/amap-jsapi-loader -S 先说最重要核心&#xff0c;踩雷过 页面中需写入以下代码&#xff0c;现在注册的高德key要求强制写入安全密钥 window._AMapSecurityConfig {securityJsCode…

9、字符串插入和删除

#include <iostream>using namespace std;void test01 () {string s "hello";s.insert (1, "111");cout << s << endl;s.erase(1, 3);cout << s << endl; }int main () {test01();return 0; } 总结&#xff1a; 插入和删除…

基于SVM模型的网络入侵检测模型训练与评估(NSL-KDD数据集)

简介 针对网络安全领域的NSL-KDD数据集进行分类任务的预处理和模型训练、以及超参数调优。 数据预处理 读取并解析数据集&#xff1b;检查并删除指定列&#xff08;outcome&#xff09;的缺失值&#xff1b;对类别型特征&#xff08;protocol_type, service, flag&#xff0…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

深度学习与人类的智能交互:迈向自然与高效的人机新纪元

引言 随着科技的飞速发展&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正日益展现出其在模拟人类认知和感知过程中的强大能力。本文旨在探讨深度学习如何日益逼近人类智能的边界&#xff0c;并通过模拟人类的感知系统&#xff0c;使机器能更深入地理解和解…

深空通信DTN总结

这里写自定义目录标题 A novel Federated Computation approach for Artificial Intelligence applications in Delay and Disruption Tolerant NetworksabstractintroductionDELAY AND DISRUPTION TOLERANT NETWORKS联邦计算用于容忍延迟和干扰的网络的联合学习框架DTN-ML Orc…

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程(蘇小沐)

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程&#xff08;蘇小沐&#xff09; Impress模糊图像增强技术之颜色滤波器场景实例教程—【蘇小沐】 1、实验环境 系统环境Impress&#xff0c;[v8.2.02]Windows 11 专业版&#xff0c;[23H2&#xff08;226…