首页 > 其他分享 >ROS2笔记4--服务通讯

ROS2笔记4--服务通讯

时间:2024-04-19 10:11:07浏览次数:21  
标签:rclpy -- demo self request 笔记 client response ROS2

ROS2中话题通讯可以实现多个ROS节点之间数据的单向传输,不过话题通讯是一种异步通信机制,发布者无法准确知道订阅者是否收到消息。而服务通信是一种基于请求响应的通信模型,在通信双方中客户端发送请求数据到服务端,服务端响应结果给客户端。 0   从服务实现机制看这种形式是CS模型,客户端需要数据时针对具体的服务发送请求信息,服务端收到请求后进行处理并返回应答信息。 以加法计算器为例

1、新建功能包

ros2 pkg create pkg_service --build-type ament_python --dependencies rclpy --node-name server_demo

2、服务端实现

编写服务端server_demo.py文件实现服务端功能
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts

class Service_Server(Node):
    def __init__(self, name):
        super().__init__(name)
# 创建一个服务端,使用的是create_service函数
# 参数分别为:服务数据类型、服务名称、服务回调函数 self.src = self.create_service(AddTwoInts, "/add_two_ints", self.AddTwoInts_callback)
# 定义服务回调函数 def AddTwoInts_callback(self, request, response): response.sum = request.a + request.b print("result.sum = ", response.sum) return response def main(): rclpy.init() server_demo = Service_Server("server_node") rclpy.spin(server_demo) server_demo.destroy_node() rclpy.shutdown()

  

服务回调函数AddTwoInts_callback这里需要传入参数除了self,还有requesst和response,request是服务需要的参数,response是服务返回的结果。request.a和request.b是request部分的内容,response.sum是response部分的内容。 AddTwoInts是类型,可以通过如下命令查看类型  
ros2 interface show example_interfaces/srv/AddTwoInts

其中“--”上面部分是request,下面部分是response。request包含两个变量a,b;response包含变量sum  

3、客户端实现

在server_demo.py统计目录下创建文件client_demo.py,编写客户端功能代码:
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts

class Service_Client(Node):
    def __init__(self, name):
        super().__init__(name)
# 创建客户端,使用create_client函数
# 传入参数分别是:服务数据类型、服务名称 self.client = self.create_client(AddTwoInts, "/add_two_ints")
# 循环等待服务端启动 while not self.client.wait_for_service(timeout_sec=1.0): print("service not available, waiting...")
# 创建服务请求数据对象 self.request = AddTwoInts.Request() def send_request(self): self.request.a = 10 self.request.b = 20
# 发送服务请求 self.future = self.client.call_async(self.request) def main(): rclpy.init() client_demo = Service_Client("client_node") client_demo.send_request() # 发送服务请求 while rclpy.ok(): rclpy.spin_once(client_demo)
# 判断数据是否处理完成 if client_demo.future.done(): try:
# 获取服务返回结果 response = client_demo.future.result() print("request.a = ", client_demo.request.a) print("request.b = ", client_demo.request.b) print("response.sum = ", response.sum) except Exception as e: print("Service call failed") break client_demo.destroy_node() rclpy.shutdown()

4、编辑配置文件、编译工作空间

配置文件setup.py 0 编译工作空间
cd ~/ros_ws colcon build --package-selects pkg_service source install/setup.bash 

5、运行程序

分终端分别启动服务端节点和客户端节点
ros2 run pkg_service server_demo
ros2 run pkg_service client_demo

服务端打印:

0 客户端打印: 0      

标签:rclpy,--,demo,self,request,笔记,client,response,ROS2
From: https://www.cnblogs.com/jackion5/p/18145204

相关文章

  • LSI 9560-8i RAID卡驱动编译
    下载驱动包:https://www.broadcom.cn/products/storage/raid-controllers/megaraid-9560-8i第一步:将压缩包上传到系统内,进行解压[FriApr1908:44:25root@localhost~]#unzip07.728.04.00-1_Linux_Driver.zip[FriApr1908:44:30root@localhost~]#cdmrlinuxdrv_......
  • 写一个监控采集公众号文章的插件
    原文链接:https://mp.weixin.qq.com/s/f8zbM6wMld3koqjaFbCuxw前言微信关注了很多技术类的公众号,但是一直都没看,所以想先把文章下载下来,放着以后可能一定会看。之前写的Python微信机器人系列文章里提到了如何hook微信的实时消息,实时消息里也包含了公众号文章的推送,可以获取到......
  • vue+elemtUI获取单行的id
    问题情境: 当对某一行数据做删除或修改操作时,我们往往需要获取该行数据的实体,例如我的表单数据为数据库中brand表的展示,所以我需要得到的是通过点击修改或删除能得到brand.id,从而在method中使用id获取后端的具体brand对象解决方法<body>内这样书写:先在table-column中加入v-s......
  • 常用directive,防止重复点击,点击盒子外部触发的事件,不换行省略号 ,移上去显示详情
    importVuefrom"vue";importstorefrom"../../store";import{debounce}from"throttle-debounce";Vue.directive("demo",{bind:function(el,binding,vnode){console.log("bind");vars=JSO......
  • redis+lua脚本实现接口限流
    写在前面在多线程的情况下对一个接口进行访问,如果访问次数过大,且没有缓存存在的情况下大量的请求打到数据库可能会存在数据库宕机,从而造成服务的不可用性。往往我们需要对其进行限流操作用来保证服务的高可用性,以下介绍下redis限流如何使用。lua脚本Lua是一种轻量小巧的脚本语......
  • Functional PHP (通义千问)
    FunctionalPHP是一个专为PHP开发者设计的库,旨在引入函数式编程的概念和工具,帮助开发者编写更高效、可读性强的代码。以下是几个使用FunctionalPHP库进行函数式编程的实例:**实例1:简单过滤和映射**假设有一个包含用户数据的数组,我们想要过滤出状态为"active"的用户,并......
  • 7-05. 制作暂停菜单和返回逻辑
    解决上节课遗漏的问题重新加载数据的时候,背包有问题,NPC移动有问题,灯光有问题背包有问题灯光有问题NPC移动有问题开始游戏关闭UI面板修改MenuCanvas给MenuCanvas添加MenuCanvas标签把MenuCanvas下面的Panel做成预制体添加UIManagerUI面板开......
  • ROS笔记[2]-获取OpenMV数据并发布到ROS消息
    摘要Orangepi(香橙派)通过USB-CDC获取OpenMV数据并使用Python发布到ROS的/openmv主题,实现打印"helloros"字符串.关键信息python3.8ROS1:NoeticUbuntu20.04Orangepi3B原理简介OpenMV的USB-CDC虚拟串口(VCP)通信[https://blog.csdn.net/qq_34440409/article/details/1......
  • 站立会议和燃尽图02
    站立会议和燃尽图02一、小组情况组长:李宏威组员:董泽豪队名:隐约类名二、Scrum例会时间:2024年4月19日出席人员:李宏威,董泽豪要求1工作照片要求2时间跨度2024年4月19日7:00至2024年4月19日7:20共计20分钟要求3地点石家庄铁道大学要求4立会内容包括:(1)未开始......
  • C#的窗体假关闭操作例子 - 开源研究系列文章
          晚上编码的时候,想到了以前编写的窗体关闭的事情,就是带托盘图标的应用,有一个主显示操作窗体,但是主窗体点击关闭按钮的时候,实际上是窗体隐藏而非真正关闭,这个在其它的一些应用程序里有这个效果。于是就想到了这个例子,记录下来,如果其他读者也有这个问题,那直接复用此例子......