ROS2教程05 ROS2服务

ROS2服务

版权信息

Copyright 2023 Herman Ye@Auromix. All rights reserved.This course and all of its associated content, including but not limited to text, 
images, videos, and any other materials, are protected by copyright law. 
The author holds all rights to this course and its contents.Any unauthorized use, reproduction, distribution, or modification of this course 
or its contents is strictly prohibited and may result in legal action. 
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and InquiriesIf you wish to use or reproduce any part of this course for purposes other than personal learning, 
please contact the author to request permission.The course content is provided for educational purposes, and the author makes no warranties or representations 
regarding the accuracy, completeness, or suitability of the course content for any specific purpose. 
The author shall not be held liable for any damages, losses, 
or other consequences resulting from the use or misuse of this course.Please be aware that this course may contain materials or images obtained from third-party sources. 
The author and course creator diligently endeavor to ensure that these materials 
are used in full compliance with copyright and fair use regulations. 
If you have concerns about any specific content in this regard, 
please contact the author for clarification or resolution.By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.

学习目标

  • 熟悉ROS2的服务概念
  • 了解ROS2服务相关的命令行工具操作
  • 熟悉服务通信中的客户端和服务器代码编写
  • 熟悉服务通信的测试手段

难度级别

初级中级高级

预计耗时

35 mins

学习前提

对象类型状态
ROS2 Humble软件已安装
Ubuntu22.04操作系统软件已确认
Shell的基本使用知识已了解
ROS2 节点知识已了解
ROS2 话题知识已了解

什么是服务

服务(Service)是ROS(Robot Operating System)图中节点之间进行通信的另一种方式。它建立在调用和响应模型之上,与主题(Topic)的发布者-订阅者模型不同。虽然主题允许节点订阅数据流并获取持续的更新,但服务仅在客户端专门调用时才提供数据。

在这里插入图片描述

服务是一种通信方式,采用的是请求和响应模型,与主题的单向发布-订阅模型形成鲜明对比。话题用于节点之间的单向通信,而服务则支持双向通信,允许客户端向服务端发出请求,服务端处理请求并生成响应。

服务的特性

在这里插入图片描述

  • 服务是一对一或者一对多的
    服务可以是一对一或一对多的。这意味着可以有一个客户端向一个服务器请求服务,也可以有多个客户端向同一个服务器请求服务。举个例子,考虑一个早餐店,多个顾客可以来店里请求"购买早餐"的服务。每个顾客传递自己的请求,而服务器则生成相应的响应。

  • 服务不适合连续调用情境
    服务适合需要请求和响应的场景,其中客户端向节点发出请求以获得特定服务,而服务会处理请求并生成相应的响应。
    对于需要持续发布内容而不需要反馈的情况,通常采用话题方式,而服务更适合需要请求和响应的通信需求。这种区分有助于在机器人系统中选择适当的通信方式,以满足不同的应用需求。

  • 双向通信
    话题是用于单向通信,信息发布者将数据发送到话题,然后订阅者获取这些数据。
    这种方式适用于需要将信息广播给多个订阅者的场景,但通常不支持双向通信。
    然而,服务提供了一种双向通信的机制,其中客户端(Client)可以向服务端(Server)发送请求,然后服务端会处理请求并发送响应回客户端。
    这种请求-响应模型使得服务适用于需要交互式通信的场景,例如请求特定任务的执行并接收结果。

服务的命令行使用

命令作用
call调用一个服务
find查看给定服务类型的可用服务列表
list查看可用服务的列表
type查看服务的类型

让我们以调用 turtlesim 示例中的 /clear 服务为例来讲解服务的命令行使用:

首先,让小乌龟先绘制出一些轨迹,随后使用/clear来清理轨迹

ros2 service call /clear std_srvs/srv/Empty

在这里插入图片描述
在这里插入图片描述

查看可用服务的列表

使用此命令可以输出当前存在的服务列表:

ros2 service list

在ROS2中,每个节点基本上都包含以下六个服务,这些服务用于节点参数的基本设置,关于节点参数的概念将在后续的教程中解释,此处不涉及。

hello_world_demo是一个不包含自定义服务的demo,但仍然可以发现它有一些基本的服务可以调用。
在这里插入图片描述

对于turtlesim这样的包,则是有相关的服务可以调用:

在这里插入图片描述

查看服务的消息类型

同样,当添加-t后缀时,会同时输出服务列表和各个服务的消息类型:

ros2 service list -t

在这里插入图片描述
若需要查看特定服务类型的具体结构,可以通过使用 ros2 service typeros2 interface show 命令来完成。首先,使用 ros2 service type 获取服务的类型信息,接着使用 ros2 interface show 获取该类型的具体消息结构。

服务消息类型的结构通常包括两部分:一个用于请求服务的消息结构,另一个用于描述响应服务结果的消息结构。它们之间通过一行三个短横线进行分隔。

以下是示例命令,用于查看名为 `/spawn 的服务类型的具体结构

ros2 service type /spawn
ros2 interface show turtlesim/srv/Spawn

在这里插入图片描述

根据服务消息类型反查该类型的服务

根据服务消息类型来检索相应的服务是ROS 2 中的一项常见任务,这个命令会返回与指定消息类型相关联的可用服务的列表。
此处以查找与std_srvs/srv/Empty消息类型相关联的服务为例,我们可以执行以下命令:

ros2 service find std_srvs/srv/Empty

可以看到/clear/reset都是消息类型为std_srvs/srv/Empty的服务
在这里插入图片描述

请求服务

在ROS 2中,要通过命令行直接请求服务,你可以使用以下指令:

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

让我们以召唤一个海龟(也就是刚才的/spawn服务)为例来说明这个过程:

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

这个命令中指定了需要调用的服务、服务的消息类型、具体的参数(比如乌龟名为’new_turtle’,位置为(2,2),角度为0.2)
在这里插入图片描述
此时再次查看ROS中的节点和话题:
在这里插入图片描述

思考:
为什么没有新的节点诞生?
此时如果用键盘节点控制乌龟,会发生什么?为什么?
如何控制新诞生的那只乌龟?

ros2 run turtlesim turtle_teleop_key --ros-args --remap /turtle1/cmd_vel:=/new_turtle/cmd_vel --remap __node:=new_turtle_teleop

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

服务的编程使用

服务器

  • 编写流程
    1.编程接口初始化
    2.创建节点并初始化
    3.创建服务器端对象
    4.通过回调函数处进行服务
    5.向客户端反馈应答结果
    6.销毁节点并关闭接口

1.创建源码文件

# Go to your src
cd ~/ros2_workspace/src
# Go to your package
cd ros2_learning/ros2_learning
# Create file
touch service_demo_server.py

2.编写源码文件

from example_interfaces.srv import AddTwoInts  # 导入需要使用的srv数据类型,AddTwoInts是示例消息接口的类型
import rclpy
from rclpy.node import Nodeclass ServiceDemoServer(Node):def __init__(self):super().__init__("service_demo_server")# 创建server# 数据类型,服务名称,回调函数self.srv = self.create_service(AddTwoInts, "add_two_ints", self.add_two_ints_callback)self.get_logger().info("service_demo_server start")# 回调函数# 通过ros2 interface show example_interfaces/srv/AddTwoInts 查看这个消息类型的结构def add_two_ints_callback(self, request, response):response.sum = request.a + request.bself.get_logger().info("Incoming request\na: %d b: %d" % (request.a, request.b))return response  # 回调函数的返回值将被返回def main(args=None):rclpy.init(args=args)  # 初始化rclpyservice_demo_server = ServiceDemoServer()  # 实例化rclpy.spin(service_demo_server)  # 循环rclpy.shutdown()  # 关闭if __name__ == "__main__":main()

3.添加依赖

在创建功能包时,添加依赖项是一个关键步骤,因为这些依赖项是功能包所需的其他软件包或库。要实现这一目标,你需要编辑功能包的 package.xml 文件。下面是如何在其中添加依赖的详细步骤:

首先,打开功能包目录下的 package.xml 文件。这个文件包含了关于功能包的元信息和依赖项信息。添加包括功能包的描述、维护者信息和许可证信息。虽然这些信息是可选的,但它们对于更好地了解功能包非常有帮助。

<description>Examples of minimal publisher/subscriber using rclpy</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>

随后在 package.xml 中,你需要声明功能包的依赖项。在这个示例中,我们需要依赖两个库:rclpyexample_interfaces

rclpy 是 ROS 2 的 Python客户端库,用于编写 ROS 2 节点。而 example_interfaces 包含了 ROS 2 的官方教程数据类型接口,其中包括了一些用于教学和示例的数据类型,比如 example_interfaces/srv/AddTwoInts,这是本示例中要使用的数据类型。

  <depend>rclpy</depend><depend>example_interfaces</depend>

4.添加入口点

接下来,你需要编辑 setup.py 文件,以定义功能包的入口点(entry point)。入口点是功能包中的可执行程序,它们可以在 ROS 2 中运行。在 setup.py 文件中,你需要添加入口点的定义。
首先,更新功能包的元信息,例如:

maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='Examples of minimal publisher/subscriber using rclpy',
license='Apache License 2.0',

然后,在 entry_points 部分添加以下命令:

"server = ros2_learning.service_demo_server:main",

在这里插入图片描述

客户端

  • 编写流程
    1.编程接口初始化
    2.创建节点并初始化
    3.创建客户端对象
    4.创建并发送请求数据
    5.等待服务器端应答数据
    6.销毁节点并关闭接口

1.创建源码文件

在和服务端相同的目录下新建源码文件:

# Go to your src
cd ~/ros2_workspace/src
# Go to your package
cd ros2_learning/ros2_learning
# Create file
touch service_demo_client.py

2.编写源码文件

import sys  # 客户端节点代码使用sys.argv来访问命令行输入的请求命令的参数
from example_interfaces.srv import AddTwoInts  # 要使用的数据类型导入
import rclpy  # 引入ROS接口
from rclpy.node import Node  # 引入节点类class ServiceDemoClient(Node):def __init__(self):super().__init__("service_demo_client")  # 以异步通信模式为例# 创建客户端# 数据类型 服务名称self.cli = self.create_client(AddTwoInts, "add_two_ints")# 等待服务出现while not self.cli.wait_for_service(timeout_sec=1.0):self.get_logger().info("service not available, waiting again...")self.req = AddTwoInts.Request()  # request部分定义def send_request(self, a, b):  # 发送函数self.req.a = aself.req.b = bself.future = self.cli.call_async(self.req)  # 异步调用服务rclpy.spin_until_future_complete(self, self.future)  # 循环等待直到返回return self.future.result()  # 返回结果def main(args=None):rclpy.init(args=args)  # 初始化rclpyif len(sys.argv) != 3:  # 确保参数个数正确print("Usage: python script_name.py <int_a> <int_b>")returnnum_a = int(sys.argv[1])num_b = int(sys.argv[2])service_demo_client = ServiceDemoClient()  # 客户端实例化response = service_demo_client.send_request(num_a, num_b)  # 客户端发送请求# 通过ros2 interface show example_interfaces/srv/AddTwoInts 查看这个消息类型的结构service_demo_client.get_logger().info("Result of add_two_ints: for %d + %d = %d" % (num_a, num_b, response.sum))service_demo_client.destroy_node()  # 销毁节点rclpy.shutdown()  # 关闭ROSif __name__ == "__main__":main()

此处只简单介绍了service的一种发送请求的办法,要获取更多信息请查阅rclpy文档的serviceAPI

3.添加入口点

接下来,你需要编辑 setup.py 文件,以定义功能包的入口点(entry point)。入口点是功能包中的可执行程序,它们可以在 ROS 2 中运行。在 setup.py 文件中,你需要添加入口点的定义。
在 entry_points 部分添加以下命令:

"client = ros2_learning.service_demo_client:main",

在这里插入图片描述

4.编译工作空间

在最后,编译工作空间,相关命令在之后的课程里会讲解,此处不涉及。

# Go to your workspace
cd ~/ros2_workspace
# Build workspace
colcon build --symlink-install

测试服务通信机制

先运行服务器节点:

ros2 run ros2_learning server

在这里插入图片描述

随后运行客户端节点并键入测试参数:

ros2 run ros2_learning client 2 3

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

Maxwell学习笔记

1 概述 Maxwell 是由美国 Zendesk 开源&#xff0c;用 Java 编写的 MySQL 实时抓取软件。 实时读取MySQL 二进制日志 Binlog&#xff0c;并生成 JSON 格式的消息&#xff0c;作为生产者发送给 Kafka&#xff0c;Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台…

InnoDB的锁

自增锁 自增锁是一种特殊的表级别锁&#xff08;table-level lock&#xff09;&#xff0c;专门针对事务插入 AUTO_INCREMENT 类型的列。最简单的情况&#xff0c;如果一个事务正在往表中插入记录&#xff0c;所有其他事务的插入必须等待&#xff0c;以便第一个事务插入的行&a…

arcgis投影栅格不可用

1、使用【投影栅格】工具进行栅格数据投影转换时报错。 解决方法&#xff1a;如果使用的是arcgis10.5及以下的版本&#xff0c;则需要更换更高的版本&#xff0c;因为这个是软件问题&#xff0c;需要更换到arcgis10.6及以上版本&#xff0c;更高级别的版本已经修复了这个问题。…

优酷新国风动漫《师兄啊师兄 第二季》强势定档 看李长寿稳健归来!

看新国风&#xff0c;上优酷动漫&#xff01;由优酷出品&#xff0c;玄机科技制作&#xff0c;改编自阅文集团旗下起点读书小说《我师兄实在太稳健了》&#xff08;作者&#xff1a;言归正传&#xff09;的修仙喜剧动画《师兄啊师兄》第二季《海神扬名篇》今日正式官宣定档&…

HCIP —— 重发布

目录 路由重发布背景&#xff1a; 路由重发布的作用&#xff1a; ​编辑 部署条件&#xff1a; 1.必须存在ASBR设备 2.需要关注种子度量值 重发布的规则 重发布的名词 重发布的方向性问题&#xff08;单向/双向&#xff09; 重发布的ASBR数量问题 单点---只存在一个AS…

陀螺仪防抖术语

陀螺仪防抖术语 fov 视场角 drift 零偏   MotionFusion即运动传感器的融合补偿&#xff0c;对陀螺仪、加速度计等运动测量器件的数据 进行预处理&#xff0c;通过标定和补偿&#xff0c;为防抖提供校准后的陀螺仪数据 ratio 系数 gyro 陀螺仪 calibration 校准 标定 DIS&…

实力出圈,开源网安连续4年入选中国网络安全企业100强

近日&#xff0c;安全牛第十一版《中国网络安全企业100强》正式发布。开源网安突出的综合实力、技术创新能力&#xff0c;以及前沿技术的落地应用成果&#xff0c;再次受到权威认可&#xff0c;从数百家安全厂商中脱颖而出&#xff0c;连续多年上榜百强榜单。 《中国网络安全企…

2023年个人工作总结怎么写?工作任务完成自动记录的待办软件

2023年已经接近尾声&#xff0c;不少人已经开始期待新的一年到来了。不过对于大多数职场人士来说&#xff0c;最近还有一项让人头疼的任务需要完成&#xff0c;这就是撰写2023年个人工作总结。 那么年度个人工作总结怎么写呢&#xff1f;其实很简单&#xff0c;年度工作总结一…

【软件安装】在vm上安装Centos操作系统

文章目录 下载iso镜像安装 下载iso镜像 centos下载地址&#xff1a;阿里巴巴centos下载地址 安装 基本按照下面的步骤走就可以了 新手一般建议典型就可以了&#xff0c;而且自定义也改不了什么东西&#xff0c;没太大必要 选择自己下载的iso镜像文件 用户名和密码 安装位置 指…

webGL开发虚拟实验室技术方案

开发虚拟实验室涉及到模拟实际实验环境和过程&#xff0c;同时提供用户互动性和学习体验。以下是一个可能的技术方案&#xff0c;用于实现这样的虚拟实验室&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

【EI会议征稿中】第五届人工智能与机电自动化国际学术会议(AIEA 2024)

第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09; 2024 5th International Conference on Artificial Intelligence and Electromechanical Automation 第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09;将于2024年3月8-10…

极致体验云上无缝协作

探索SOLIDWORKS云上之旅 谁适合应用3DEXPERIENCE云平台? 迈向云策略的数字化转型企业、加速新品上市的企业创新部门、资源有限的小微及初创企业 什么是3DEXPERIENCE云平台? 3DEXPERIENCE(3DX)是一种业务与创新平台,可让所有组织整体实时了解业务活动和生态系统&#xff0c…

SOLIDWORKS 2024新功能之Simulation篇

SOLIDWORKS 2024 新功能 Simulation篇目录概述 • 自动保存模型文件 • 壳体的接合交互 • 收敛检查图解 • 去耦合混合自由体模式 • Direct Sparse 解算器已停用 • 增强型轴承接头 • 复制算例时排除网格和结果 • 导出模型形状数据 • 网格性能 • 性能增强功能 …

活动目录是什么?

企业在进行数字化转型时&#xff0c;也会面临日益增长的网络用户和复杂的身份管理需求。为了高效地管理用户身份、控制访问权限以及保护企业的数据安全&#xff0c;许多企业选择使用微软的Active Directory&#xff0c;即微软活动目录&#xff0c;来作为网络身份管理系统。 1、…

彼此的远方

那天两个人互相表白了心意&#xff0c;在那天那刻确定了彼此相爱&#xff0c;没有鲜花&#xff0c;没有礼物。 男孩的世界曾陷入黑暗&#xff0c;冷清而又孤寂&#xff0c;女孩带着光和热来了&#xff0c;后来&#xff0c;女孩成为了男孩的太阳。女孩以为男孩是远方的风…

Opencv UI自动化应用人脸识别

OpenCV: Open Source Computer Vision Library OpenCV是一个开源的计算机视觉库&#xff0c;它提供了很多函数&#xff0c;这些函数非常高效地实现了计算机视觉算法 OpenCV官网&#xff1a;http://www.opencv.org.cn/ OpenCV 使用 C/C 开发&#xff0c;同时也提供了 Python、Ja…

如何用几行Python代码获取北京时间(建议收藏!)

需求场景 当使用linux系统或其他场景时&#xff0c;有时需要利用当前时间作为信息存储数据&#xff0c;但利用python的datetime库打印当前时间时&#xff0c;却没有正确显示对的时间(北京时间)。在本博文中&#xff0c;小编带你利用几行Python代码获取北京时间。 获取当前时间…

【电机控制】PMSM无感foc控制(六)相电流检测及重构 — 双电阻采样、三电阻采样

0. 前言 目前&#xff0c;永磁同步电机的电流信号采样方法应用较多的是分流电阻采样&#xff0c;包括单电阻、双电阻以及三电阻采样法。其中&#xff0c;单电阻采样上一章节已经讲解&#xff0c;这章讲双电阻以及三电阻电流采样法。 1. 双电阻采样 1.1 双电阻采样原理 双电阻采…

mybatis的数据库连接池

直接看原文 原文链接:【MyBatis】 连接池技术_mybatis自带连接池-CSDN博客 本文先不说springBoot整合mybatis后的 本文讲的是没有被springBoot整合前的mybatis自己的默认的连接池 --------------------------------------------------------------------------------------…