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,一经查实,立即删除!

相关文章

科研绘图系列:R语言雷达图(radar plot)

介绍 雷达图,又称为蜘蛛网图或星形图,是一种以多轴方式显示数据的图表。它通常用于显示多个定量变量的值,这些变量被表示为从中心点向外延伸的轴。每个轴代表一个变量,而每个变量的值则通过从中心向外延伸的距离来表示。雷达图可以直观地展示多个变量之间的相对大小和关系…

【Java面向对象】对象和类(下)

文章目录 1.静态变量、常量和方法2.可见性修饰符2.1 声明包2.2 变量和方法的可见性修饰符2.3 类的可见性修饰符2.4 私有构造方法 3.数据域封装4.对象参数,对象数组5.不可变对象和类6.变量的作用域7.this引用7.1 使用 this 引用数据域7.2 使用 this 调用构造方法 1.静…

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

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

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

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

C#面:MVC中的TempData\ViewBag\ViewData区别?

TempData 保存在Session中,Controller每次执⾏请求的时候,会从Session中先获取 TempData, ⽽后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条⽬访问⼀次后就从字典表中删…

使用Scikit-Learn决策树:分类问题解决方案指南

如何用scikit-learn的决策树分类器解决分类问题 1. 引言 在本教程中,我们将探讨如何使用scikit-learn(sklearn)库中的决策树分类器解决分类问题。决策树是一种强大的机器学习算法,能够根据输入数据的特征属性学习决策规则&#…

[短笔记] Ubuntu配置环境变量的最佳实践

结论: 不确定是否要设为系统,则先针对当前用户设,写~/.profile确定为系统级,写/etc/environment,注意无需export不推荐写在~/.bashrc(Ubuntu不推荐,理由见references) References&…

陪玩系统小程序模式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…

【Druid 未授权访问漏洞】解决办法

【Druid 未授权访问漏洞】解决办法 漏洞描述 Alibaba Druid 未授权访问【原理扫描】 Alibaba Druid是一款Java语言开发的数据库连接池。Druid能够提供强大的监控和扩展功能。 Alibaba Druid 默认情况下未设置访问控制,攻击者可以登录以获取敏感信息 修改web.xml…

深入理解 React 18 中的 memo 和 useCallback:优化你的组件性能

深入理解 React 18 中的 memo 和 useCallback:优化你的组件性能 在现代前端开发中,性能优化是一个永恒的话题。React 18 引入了一些新的特性和改进,使得性能优化变得更加容易和高效。今天,我们将深入探讨两个非常重要的 Hooks&am…

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(…

AI技术在企业招聘中的应用案例分析

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在企业招聘领域的应用也越来越广泛。AI技术不仅改变了传统的招聘流程&#xff0c;还提高了招聘的效率和准确性&#xff0c;为企业招聘人员提供了更加便捷、高效的方式。本文将以某大型互联网公司…

opencv—常用函数学习_“干货“_2

目录 五、矩阵计算函数 归一化矩阵 (normalize) 转置矩阵 (transpose) 求矩阵的逆 (invert) 翻转矩阵 (flip) 旋转矩阵 (rotate) 求矩阵的行列式 (determinant) 求矩阵的迹 (trace) 求矩阵的特征值和特征向量 (eigen) 六、代数运算 矩阵加法 (add) 矩阵减法 (subtra…

通过手机控制家用电器的一个程序的设计(一)

一、概述 设计一款安卓平台上的家庭智能控制软件&#xff0c;通过语音识别指令控制家用电器。该软件结合离线语音识别技术、红外线和WIFI通讯技术&#xff0c;实现对家电的智能控制&#xff0c;如开关机、调温度、调频道等操作。 二、主要功能模块 离线语音识别模块 功能&…

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

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