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

这篇具有很好参考价值的文章主要介绍了【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

0.服务通信概念

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

以请求响应的方式实现不同节点间的数据交互
【ROS】如何让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,
    【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信
    其中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 * 我们可以先来看看编译完产生的文件是什么样的

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

其产生了一个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
【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信
【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

至此服务通信内容结束文章来源地址https://www.toymoban.com/news/detail-436639.html

到了这里,关于【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ROS】服务通信、话题通信的应用

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 本章将来学习如何利用话题通信,服务通信两种种方式对turtlesim进行一个控制 利用话题通信发布一个位姿信息,让乌龟一直做圆周运动 首先,先启动 turtlesim 这个节点 现在可以直

    2024年02月06日
    浏览(34)
  • ROS学习笔记(六)---服务通信机制

    在ROS中,服务通信机制是一种点对点的通信方式,用于节点之间的请求和响应。它允许一个节点(服务请求方)向另一个节点(服务提供方)发送请求,并等待响应。 服务通信机制在ROS中使用以下两个概念: 服务(Service):服务是一种在ROS中定义的一对相关消息类型,包括

    2024年02月07日
    浏览(45)
  • ROS2从入门到精通1-2:详解ROS2服务通信机制与自定义服务

    本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 服务 是 ROS 图中节点之间的另一种通信方法。服务基于 服务器-客户端 模型,不同于话题的 发布者-订阅者

    2024年04月09日
    浏览(37)
  • ROS实现一个节点同时发布订阅多个话题(C++版)

      如果想在一个节点同时发布订阅多个话题就要使用到多线程机制,在C++中如何使用多线程,在C++中开多线程模板已经有了介绍,就是下面这个:    但是有一点需要注意的是,创建节点的涉及到一个主线程,如果想同时发布订阅是不能使用主线程的(也就是不能主线程发

    2024年02月11日
    浏览(39)
  • 实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月07日
    浏览(43)
  • [ROS 系列学习教程] ROS参数服务器(Param):通信模型、Hello World与拓展

    ROS 系列学习教程(总目录) 参数服务器在ROS中主要用于实现不同节点之间的数据共享。 参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。 使用场景一般存储一些机器人的固有参数,

    2024年02月01日
    浏览(46)
  • 不用网闸、FTP的话 如何实现内外网数据交换?

    网络隔离已然成为很多企业首选的数据保护方式,即使是内部人员之间,也是不能随意的发送敏感文件的。但是,文件的流转交互,又是不可避免的,网络隔离保障了企业网络安全,但在具体实践中仍需解决各隔离网间的数据传输问题,不仅仅是内部人员之间,和外部伙伴之

    2024年02月04日
    浏览(32)
  • 医院如何实现安全又稳定的跨网文件数据交换呢?

    随着医疗信息化的发展,医院之间需要频繁地进行文件数据交换,以实现诊疗、科研、管理等方面的协同和共享。然而,由于医院网络环境的复杂性和敏感性,跨网文件数据交换面临着安全性和稳定性的双重挑战。如何在保证文件数据不被泄露、篡改、丢失的前提下,实现高

    2024年02月07日
    浏览(41)
  • 交换机不同vlan间如何通信?5分钟了解清楚

    有朋友问到,vlan间需要什么才能通信呢?如何让不同vlan之间通信,我们通常提到了,vlan间通信需要三层交换机,那么不用三层交换机能不能通信呢?   其实不同VLAN之间相互通信的两种方式, 单臂路由、三层交换机 ,它们分别如何配置呢?哪一种好呢?     本篇文章要从

    2024年02月15日
    浏览(45)
  • 交换机端口灯常亮 端口up状态 服务器设置ip交换机获取不到服务器网卡mac地址 不能通信

    深信服防火墙 8.0.75 AF-2000-FH2130B-SC S6520X-24ST-SI交换机 version 7.1.070, Release 6530P02 交换机一个vlan下有3台服务器,连接端口2、3、4,2和3连接的服务器正常,交换机3端口灯常亮 端口up状态 服务器自动获取不了地址,改为手动设置ip后,交换机查看arp表,获取不到服务器网卡mac地址

    2024年02月02日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包