ROS服务通信机制实操Python

ROS服务通信机制实操Python

  • 步骤流程
  • vscode配置
  • 服务端
  • 客户端
  • 编辑配置文件
  • 编译并执行
  • 优化
    • 实现参数的动态提交
    • 优化先启动客户端后启动服务端

ROS服务通信的理论查阅:ROS服务通信流程理论

ROS服务通信的自定义srv数据的准备可以查阅:ROS服务通信自定义srv

在模型实现中,ROS master不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:

  • 服务端
  • 客户端
  • 数据

步骤流程

实现ROS服务通信的步骤分为以下5步:

  • 1.vscode配置;
  • 2.编写服务端;
  • 3.编写客户端;
  • 4.编辑配置文件;
  • 5.编译并执行。

vscode配置

为了方便代码提示以及误抛异常,需要先配置 vscode,将前面自定义数据格式生成的 python 文件路径配置进 settings.json

在这里插入图片描述

服务端

  • 基本流程
    服务端:解析客户端请求,产生响应。

    • 1.导包;
    • 2.初始化 ROS 节点;
    • 3.创建服务端对象;
    • 4.处理逻辑(回调函数);
    • 5.spin()
  • 代码实现

      ```python#! /usr/bin/env python3import rospyfrom plumbing_server_client.srv import AddInts, AddIntsRequest, AddIntsResponse"""服务端:解析客户端请求,产生响应。1.导包;2.初始化 ROS 节点;3.创建服务端对象;4.处理逻辑(回调函数);5.spin()"""def doAdd(request):num1 = request.num1num2 = request.num2sum = num1 + num2response = AddIntsResponse()response.sum = sumrospy.loginfo("服务器解析的数据: num1 = %d num2 = %d 响应的结果sum = %d",num1, num2, sum)return responseif __name__ == "__main__":# 2.初始化 ROS 节点;rospy.init_node("heiShui")  # 保洁公司# 3.创建服务端对象;server = rospy.Service("addInts", AddInts, doAdd)  # 参数1:话题名称 参数2:消息对应的类型  参数3:回调函数rospy.loginfo("服务器已启动!!!")# 4.处理逻辑(回调函数);# 5.spin()rospy.spin()```
    
  • 添加可执行权限

    进入到 scripts 文件下,打开Terminal,执行 chmod +x *.py 对demo_server_p.py文件添加可执行的权限

    在这里插入图片描述

  • 验证是否有问题

    • 编辑配置文件
      修改 plumbing_server_client 功能包下的CMakeLists.txt,找到catkin_install_python,修改成如图所示:

      在这里插入图片描述

    • 按快捷键 ctrl + shift + B 编译

      在这里插入图片描述

    • 开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行 source ./devel/setup.bash rosrun plumbing_server_client demo_server_p.py ;再开启一个Terminal,运行 rosservice call addInts “num1: 1 num2: 2” (num1 num2是按Tab键自动补齐,然后修改数字),查看服务请求数据并响应

      在这里插入图片描述

客户端

  • 基本流程
    客户端:组织并提交请求,处理服务端响应。

    • 1.导包;
    • 2.初始化 ROS 节点;
    • 3.创建客户端对象;
    • 4.组织请求数据,并发送请求;
    • 5.处理响应。
  • 代码实现

    #! /usr/bin/env pythonimport rospy
    from plumbing_server_client.srv import AddInts, AddIntsRequest, AddIntsResponse"""
    客户端:组织并提交请求,处理服务端响应。1.导包;2.初始化 ROS 节点;3.创建客户端对象;4.组织请求数据,并发送请求;5.处理响应。
    """if __name__ == "__main__":# 2.初始化 ROS 节点;rospy.init_node("daZhuang")# 3.创建客户端对象;client = rospy.ServiceProxy("addInts", AddInts)  # 参数1:话题名称 参数2:消息对应的类型# 4.组织请求数据,并发送请求;reponse = client.call(30, 50)# 5.处理响应。rospy.loginfo("响应的数据: %d",reponse.sum)
    
  • 添加可执行权限

    进入到 scripts 文件下,打开Terminal,执行 chmod +x *.py 对demo_client_p.py文件添加可执行的权限

    在这里插入图片描述

编辑配置文件

修改 plumbing_server_client 功能包下的CMakeLists.txt,找到catkin_install_python,修改成如图所示:

在这里插入图片描述

编译并执行

  • 按快捷键 ctrl + shift + B 编译
    在这里插入图片描述

  • 执行代码

    • 1.启动 roscore;
      开启一个Terminal,启动 roscore
      在这里插入图片描述

    • 2.启动服务端;
      开启一个新的Terminal

      在这里插入图片描述

    • 3.启动客户端;
      开启一个新的Terminal
      在这里插入图片描述

优化

实现参数的动态提交

前面响应的数据都是写死的,将数据实现动态的输入,主要是修改客户端代码,服务端不用修改。
格式:rosrun xxxxx xxxxxx num1 num2
代码实现

#! /usr/bin/env python3import rospy
from plumbing_server_client.srv import AddInts, AddIntsRequest, AddIntsResponse
import sys"""
客户端:组织并提交请求,处理服务端响应。1.导包;2.初始化 ROS 节点;3.创建客户端对象;4.组织请求数据,并发送请求;5.处理响应。
"""if __name__ == "__main__":# 判断传入的参数个数if len(sys.argv) != 3:rospy.loginfo("传入参数的个数不对!!!")sys.exit(1)# 2.初始化 ROS 节点;rospy.init_node("daZhuang")# 3.创建客户端对象;client = rospy.ServiceProxy("addInts", AddInts)  # 参数1:话题名称 参数2:消息对应的类型# 4.组织请求数据,并发送请求;# 解析传入的参数num1 = int(sys.argv[1])num2 = int(sys.argv[2])reponse = client.call(num1, num2)# 5.处理响应。rospy.loginfo("响应的数据: %d",reponse.sum)

编译后,启动 roscore 和服务端,然后启动客户端,同时输入请求的参数 num1 和 num2,如图所示:
在这里插入图片描述

优化先启动客户端后启动服务端

客户端先于服务端启动,会抛出异常
如果有先启动客户端,挂起等待服务端启动后再请求的需求。就需要调用ROS的内置等待函数 client.wait_for_service()和 rospy.wait_for_service(“服务话题”) 。

代码实现

#! /usr/bin/env python3import rospy
from plumbing_server_client.srv import AddInts, AddIntsRequest, AddIntsResponse
import sys"""
客户端:组织并提交请求,处理服务端响应。1.导包;2.初始化 ROS 节点;3.创建客户端对象;4.组织请求数据,并发送请求;5.处理响应。
"""if __name__ == "__main__":# 判断传入的参数个数if len(sys.argv) != 3:rospy.loginfo("传入参数的个数不对!!!")sys.exit(1)# 2.初始化 ROS 节点;rospy.init_node("daZhuang")# 3.创建客户端对象;client = rospy.ServiceProxy("addInts", AddInts)  # 参数1:话题名称 参数2:消息对应的类型rospy.loginfo("客户端启动")# 4.组织请求数据,并发送请求;# 解析传入的参数num1 = int(sys.argv[1])num2 = int(sys.argv[2])# 等待服务端启动# client.wait_for_service()rospy.wait_for_service("addInts")  # 参数:话题名称reponse = client.call(num1, num2)# 5.处理响应。rospy.loginfo("响应的数据: %d",reponse.sum)

启动客户端后,没有启动服务端,在等待服务端启动,没有抛出异常,结果如图所示:
在这里插入图片描述

再启动服务端后,请求进行响应,结果如图所示:

在这里插入图片描述

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

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

相关文章

【学术会议征稿】第八届控制工程与先进算法国际论坛(IWCEAA 2024)

第八届控制工程与先进算法国际论坛 8th International Workshop on Control Engineering and Advanced Algorithms(IWCEAA 2024) 第八届控制工程与先进算法国际论坛(IWCEAA 2024)将于2024年11月1-3日在中国南京隆重举行。会议旨在为从事算法、控制工程与…

昇思25天学习打卡营第七天|应用实践/生成式/Diffusion扩散模型

心得 这个课程是一个劝退的课程。讲述了Diffusion扩散模型实现原理。提供了这个原理的一些公式推导。当然看这个推导是需要一定的数学基础的。这个课程这么写,是为了让那些数学不怎么好的,知难而退吗? 这个课程还是一个比较难以复制粘贴的课…

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展,陪玩服务应远而生并迅速唱起,陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁,其模式系统的搭建与开发是得尤为重要,本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程,包…

Nginx入门到精通四(反向代理2)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一(基本概念介绍)-CSDN博客 Nginx入门到精通二(安装配置)-CSDN博客 Nginx入门到精通三(Nginx实例1:反向代理&a…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

UE4-光照渲染、自动曝光、雾

目录 一.光源种类 二.灯光的移动性 三.自动曝光 四.指数级高度雾 五.实现光束 一.光源种类 1.定向光源 用来模拟现实中的太阳光。 2.点光源 比如现实中的灯泡 3.聚光源 4.矩形光源 是这几个光源中性能开销最大的,一般不用到游戏场景中,因为游…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验:https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

js执行机制----事件循环

前言 问题 一般情况下,我们都认为js是顺序执行的 但是遇到下列情况 setTimeout(function(){console.log(定时器开始啦) });new Promise(function(resolve){console.log(马上执行for循环啦);for(var i 0; i < 10000; i){i 99 && resolve();} }).then(function(…

嵌入式人工智能(7-树莓派4B的IIC总线连接OLED显示中文与图片)

1、IIC总线 IIC总线&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信总线&#xff0c;也被称为I2C总线。它由飞利浦&#xff08;Philips&#xff09;公司在1980年代开发&#xff0c;用于连接微处理器和外部设备。 IIC总线使用两根信号线&#xff1a;SDA&…

删除windows系统里磁盘的恢复分区

说下我的情况 我买了块固态磁盘&#xff0c;插上主板&#xff0c;发现它自带了系统&#xff0c;这样我开机就会转到这块磁盘&#xff0c;即使在boot里改变也不行&#xff0c;后面我格式化了对应的盘符&#xff0c;但在磁盘管理里&#xff0c;发现有个EFI系统分区和恢复分区存在…

C++中的语句详细介绍:简单语句、条件、循环迭代语句、跳转语句、异常处理语句、try语句等

文章目录 C中的语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 C中的语句 (1)简单语句 简单语句包括&#…

卷麻了!字节软件测试四轮面试,成功拿到offer啦!

❗️❗️字节面试攻略❗️❗️ ⭕️招聘特点&#xff1a;关注可复制直接上手的人才&#xff01; 字节是人才扎堆的地方&#xff0c;人来就马上能做&#xff0c;只招现成的人才。 字节软件测试的面试题同样也是分了四轮&#xff0c;成功拿到ooffer了&#xff0c;给大家总结一下每…

MyBatis源码中的设计模式1

1. 建造者模式的应用 建造者模式属于创建类模式&#xff0c;通过一步一步地创建一个复杂的对象&#xff0c;能够将部件与其组装过程分开。用户只需指定复杂对象的类型&#xff0c;就可以得到该对象&#xff0c;而不需要了解其内部的具体构造细节。《Effective Java》中也提到&…

捷配PCB打样采用机械盲埋孔制造,有何优势?

在电子制造领域&#xff0c;盲孔&#xff08;Blind Vias&#xff09;与埋孔&#xff08;Buried Vias&#xff09;是两种关键的PCB&#xff08;印刷电路板&#xff09;过孔技术。盲孔特指那些连接内层走线至外层走线的过孔&#xff0c;但并不贯穿整个板体。相对地&#xff0c;埋…

镜舟科技荣获优秀数字化服务商奖,助力企业用数智技术重塑新消费

7 月 13 日&#xff0c;由 ITShare智享会和 BT商业科技观察主办的2024 第八届 FMCG 零售消费品数字化峰会于上海落幕。在现场&#xff0c;镜舟科技凭借在多家零售企业构建与实施智能数据中台解决方案的成功经验&#xff0c;荣获优秀数字化服务商奖项。 在会上&#xff0c;麦当劳…

云动态摘要 2024-07-16

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起&#xff01; [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造&…

C语言 ——— 编写代码,判断 整型数组 是否 有序

目录 题目要求 代码实现 题目要求 判断 整型数组 是否有序 如果 整型数组 有序输出 sorted&#xff1b;否则输出 unsorted 代码实现 #include<stdio.h> int main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//输入for (int i 0; i < sz; i){s…

线程控制

对线程的控制思路和进程相似&#xff0c;创建、等待、终止&#xff0c;只需要调用接口就行。但是在Linux下没有线程的概念&#xff0c;因为Linux的设计者认为&#xff0c;线程是一种轻量级的进程&#xff0c;毕竟创建线程只需要创建PCB。因此Linux中使用多线程必须使用第三方pt…

Spring MVC入门2

Postman的使用 接上期我们抛出了一个问题&#xff0c;Postman的使用 可以点击链接下载 https://www.postman.com/downloads/ 安装之后会提示版本升级&#xff0c;直接点击dissmiss即可。 要想发送数据&#xff0c;具体歩奏如下简图&#xff1a; 还有一个更具体的图&#xff…