【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

news2025/1/16 14:01:03
img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。
本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令

本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令

  • 0.服务通信概念
  • 1.自定义srv消息
    • 1.1定义srv格式消息
    • 1.2修改配置文件
  • 2.自定义srv服务通信客户端python实现:
  • 3.自定义srv服务通信服务端python实现:
  • 4.优化客户端
  • 5.启动运行

在这里插入图片描述

0.服务通信概念

在ros中,一个节点想要获取某种服务(例如:一个节点想要获取此时的相机数据,节点就需要向相机发送一个请求,而相机接收到请求后可以根据消息类型将数据类型返回),这就是基本的服务通信使用场景。

以请求响应的方式实现不同节点间的数据交互
在这里插入图片描述
我们现阶段也不需要了解具体这代表什么意思,只需要知道:

client客户端/server服务端先后在rosmaster中注册本身信息,然后通过相同话题匹配.

  1. server 与 client 的启动无先后顺序要求
  2. server 与 client 都可以有多个
  3. server 与 client 连接后不再需要rosmaster,也就是说仅在尝试连接的时候需要rosmaster

1.自定义srv消息

srv消息是服务端与客户端之间通信的一个数据载体,可用数据类型与std_msgs里的数据类型一致,但需要自己定义.

步骤大概为以下几步:

  1. 根据需要定义srv格式消息
  2. 修改配置文件
  3. 编译生成中间文件并引用

1.1定义srv格式消息

这是一个自己定义的srv的消息格式
因为要实现的是两个数相加,所以这样定义。

其中—上方为client客户端发送的消息格式,下方为服务端响应的消息格式。

# 客户端请求
int32 num1
int32 num2
---
# 服务端响应
int32 ans

1.2修改配置文件

  1. 和定义msg类似,也要先修改功能包目录下的package.xml,
    在这里插入图片描述
    其中54行的message_generation是编译时的消息软件包
    而59行message_runtime是运行时的消息软件包
  2. 在CMakeList中找到这些地方并修改
     # 1.编译时的依赖包
     find_package(catkin REQUIRED COMPONENTS
     rospy
     std_msgs
     message_generation
     )
     # 2.加入自己定义的srv文件名字
     add_service_files(
     FILES
     Addints.srv 
     )
     # 3.编译包时的消息依赖
     generate_messages(
     DEPENDENCIES
     std_msgs
     )
     # 4.加入message_runtime,但官网没有这一步似乎也可以.
     catkin_package(**chmod +x py文件**
     CATKIN_DEPENDS rospy std_msgs message_runtime
     )
    
  3. 编译一下,可以在这个路径中找到刚刚编译完的中间件
    之后调用的方法如下
    # 
    from packagename.srv import * 
    
    至于为什么要import * 我们可以先来看看编译完产生的文件是什么样的

请添加图片描述

其产生了一个srv的中间件,出现了三个类,我们之后这三个类都需要使用到,所以一般都是直接import*

2.自定义srv服务通信客户端python实现:

先来分析下作为一个客户端我们需要做什么事

  1. 初始化ros节点
  2. 创建请求对象,设置通信话题
  3. 请求响应,获得响应结果
import rospy

import lesson3_srv.srv import *

rospy.init_node("sum_client")

client=rospy.ServiceProxy("sum2",Addints)

if(len(sys.argv)!=3):

    rospy.logerr("参数不对")

    sys.exit(1)

num=int(sys.argv[1])

num2=int(sys.argv[2])

response=client.call(num,num2)

rospy.loginfo("%d",response.ans)

这里先导入了rospy的包以及消息类型,初始化了节点信息与话题。

创建了请求服务的对象,serviceprovy(话题,srv消息)

对传入的参数进行了一个处理
clint.call返回类型为自定义消息类型的格式,call(srv中的参数)

最后处理返回的消息

这就是客户端实现,当然还有一些优化内容,等服务端实现完在提

3.自定义srv服务通信服务端python实现:

先来分析下作为一个服务端我们需要做什么事

  1. 初始化节点
  2. 设置订阅话题
  3. 设置处理消息的回调函数
import rospy

from lesson3_srv.srv import *

def doNum(request):

    num1=request.num1

    num2=request.num2

    sum=num1+num2

    response=AddintsResponse()

    response.ans=sum

    rospy.loginfo("%d %d %d",request.num1,request.num2,response.ans)

    return response

rospy.init_node("sum")

server=rospy.Service("sum2",Addints,doNum)

rospy.spin()

这里先导包

然后通过service(话题名称,srv消息类型,回调函数)创建服务对象

刚刚客户端传入的数据,会作为回调函数的参数

先将其取出,之后通过AddintsResponse的方法创建一个返回对象,改变ans后返回此时的返回值是给了客户端

4.优化客户端

这里的客户端有个很小的问题,仅能在服务器启动后进行通信,若服务器没有启动,而先启动了客户端就会出错,ros官方提供了两个解决方法,二者选其一即可

# rospy.wait_for_service(话题名称)
# client.wait_for_service()

所以改进的客户端代码如下:

import rospy

import sys

from lesson3_srv.srv import *

rospy.init_node("sum_client")

client=rospy.ServiceProxy("sum2",Addints)

if(len(sys.argv)!=3):

    rospy.logerr("参数不对")

    sys.exit(1)

num=int(sys.argv[1])

num2=int(sys.argv[2])

#client.wait_for_service()

rospy.wait_for_service("sum2")

response=client.call(num,num2)

rospy.loginfo("%d",response.ans)

5.启动运行

  1. 先添加可执行权限 chmod +x py文件
  2. 之后配置一下CMakeList.txt
     catkin_install_python(
         PROGRAMS
     scripts/demo01_server.py
     scripts/demo01_client.py
     DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
     )
    
  3.  rosrun lesson3_srv demo01_client.py
     rosrun lesson3_srv demo01_server.py
    

运行效果:传入2 3 返回值为 5
在这里插入图片描述
在这里插入图片描述

至此服务通信内容结束

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

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

相关文章

【数据结构与算法】常用数据结构(二)

😀大家好,我是白晨,一个不是很能熬夜,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪&#x1f4…

asp.net+sqlserver基于web的奖学金助学金评定系统

管理员部分功能 管理员管理,管理系统内的所有管理人员信息 1.学生信息管理,管理系统内需要进行奖助学金评定的学生信息 2.教师信息管理,管理学院内的所有教师信息 3.一级指标管理,管理奖助学金评定过程中的一级指标内容 4.二级指标…

IPC:匿名管道和命名管道

一 管道初级测试 写两个小程序&#xff0c;一个负责向管道发数据&#xff0c;一个从管道接收数据&#xff1b; pipe.cpp #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } pipe2.cpp #inclu…

【LeetCode】环形链表+结论证明

题目链接&#xff1a;环形链表 题目&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 p…

中级软件设计师备考--解答题--数据流图

目录 基本概念基本元素数据流图的分层平衡原则 数据字典 基本概念 数据流图也称为数据流程图&#xff08;DFD&#xff09;&#xff0c;它摆脱了系统的物理内容&#xff0c;精确地在逻辑上描述系统的功能、输入、输出和数据存储&#xff0c;是系统逻辑模型的重要组成部分。 基…

《走进对象村3》找对象送孩子之特殊的构造方法

文章目录 &#x1f680;文章导读1. 构造方法1.1 构造方法的分类1.1.1 非默认的静态方法1.1.2 默认的构造方法1.1.3 带参数的构造方法 构造方法的特性&#xff1a; &#x1f680;文章导读 在本篇文章中&#xff0c;对构造方法进行了一些总结&#xff0c;可能也有不足的地方&…

Golang每日一练(leetDay0059) 两数之和II、Excel表列名称

目录 167. 两数之和 II 输入有序数组 Two-sum-ii-input-array-is-sorted &#x1f31f;&#x1f31f; 168. Excel表列名称 Excel Sheet Column Title &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…

MySQL多表查询之连接查询

0. 数据源 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : tempdbTarget Server Type : MySQLTarget Server Version…

《走进对象村6》面向对象的第三大特性——多态

文章目录 &#x1f680;文章导读1.1 多态的概念1.2 多态的实现条件1.3 向上转型和向下转型1.4 重写 **面试问题&#xff1a;重写和重载的区别**多态的实现 &#x1f680;文章导读 在本篇文章中&#xff0c;将会有很多的干货和知识点掌握&#xff0c;希望读者慢慢耐心阅读 在本篇…

如何设定项目中的里程碑?

项目管理中非常重要的就是合理设置阶段性的里程碑&#xff0c;在项目实施过程中&#xff0c;根据里程碑来灵活控制项目进度和节奏。那么一个IT项目该如何合理地安排里程碑呢&#xff1f; 在IT项目管理中&#xff0c;里程碑是一种非常重要的工具&#xff0c;它能够帮助项目经理和…

谈谈架构分层

大家好&#xff0c;我是易安&#xff01; 在系统从0到1的阶段&#xff0c;为了让系统快速上线&#xff0c;我们通常是不考虑分层的。但是随着业务越来越复杂&#xff0c;大量的代码纠缠在一起&#xff0c;会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动…

IIS6.0和网络管理软件SNMPc

一.IIS6.0 IIS 6.0提供了更为方便的安装/管理功能和增强的应用环境、基于标准的分布协议、改进的性能表现和扩展性&#xff0c;以及更好的稳定性和易用性。其服务组件包括&#xff1a; ①WWW服务。WWW是图形最为丰富的Internet服务。Web具有很强的链接能力&#xff0c;支持协…

软考中级——系统集成项目管理工程师(20天冲刺)

PV:计划价值(计划要成的价值) EV:挣值(实际做了的事儿的价值) AC:实际成本(实际花出去多少钱) SV:进度偏差EV-PV(项目提前或者落后的进度)>0项目进度超前<0项目进度落后 CV:成本偏差EV-AC(项目预算的号空成者盈利)>0成本节约<0成本超支 SPI:进度绩效指数EV/PV(挣值…

创建VUE2 前端以及后端的交互

创建vue2项目 1.javascript–>vue(不要勾选)–>安装element-ui(组件 | Element)–>执行指令&#xff08;npm i element-ui -S&#xff09;–>在main.js中引入&#xff08;import ElementUI from ‘element-ui’; ​ import ‘element-ui/lib/theme-chalk/index.c…

JavaWeb:Web 的基本概念、Tomcat 服务器、Http 详解、Maven 的下载安装步骤、模仿一个 Servlet

文章目录 JavaWeb - 01一、基本概念1、静态 Web2、动态 Web3、Web 应用程序4、三个技术 二、Web 服务器三、Tomcat 详解四、发布一个 Web 网站五、Http 详解1. Http 请求&#xff08;1&#xff09;请求行&#xff08;2&#xff09;消息头 2. Http 响应&#xff08;1&#xff09…

sourceTree离线环境部署

目录 1、下载sourceTree安装包&#xff0c;打开之后弹出注册界面&#xff08;需要去国外网站注册&#xff09;2、使用技术手段跳过注册步骤3、打开安装包进行安装 注&#xff1a;建议提前安装好git 1、下载sourceTree安装包&#xff0c;打开之后弹出注册界面&#xff08;需要去…

27 - 两数、三数、四数问题

文章目录 1. 两数之和2. 三数之和3. 最接近的三数之和4. 四数之和5. 四数相加 1. 两数之和 在遍历数组的时候只需要在map中去查询是否有个目前元素target - numbers[i]匹配的数值&#xff0c;如果有&#xff0c;就找到匹配对&#xff0c;如果没有就把目前遍历的元素放入map中&a…

融合有序,创造无限——解密力扣“合并两个有序数组”

本篇博客会讲解力扣“88. 合并两个有序数组”这道题&#xff0c;这是题目链接。 其实&#xff0c;有经验的朋友一看到这个题目的名字&#xff0c;应该就明白了&#xff0c;这玩意和归并排序脱不了干系。下面我们来审题&#xff1a; 输出示例如下&#xff1a; 以下是一些提…

3.是人就能学会的Spring源码教学-IOC容器的核心实现原理

是人就能学会的Spring源码教学-IOC容器的核心实现原理 我们学习Spring源码的动力&#xff0c;估计大部分人都是因为面试中会问到吧。 那么我们今天就以面试问Spring来开头。 关于Spring&#xff0c;在面试的时候一般会问到的两个最基础的问题。 第一个什么是IOC&#xff1f…

技术控,看这里,一款支持断点调试的数据科学工具

数据科学是一门利用统计学、机器学习、数据挖掘、数据可视化等技术和方法&#xff0c;从数据中提取知识和信息的交叉学科。自上世纪60年代&#xff0c;统计学家John W.Tukey首次提出“数据分析”&#xff08;Data Analysis&#xff09;的概念起&#xff0c;数据科学已历经了几十…