ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

2023-05-16

ROS服务通信具体实现流程

demo:实现两个整型数相加求和,客户端发送两个整型数,服务端对其求和。

​ ​ 服务通信也需要自定义服务数据类型,即自定义srv文件,该过程和自定义msg文件非常类似。主要实现流程分为以下三步:①按照固定格式创建srv文件②编辑相关配置文件③编译生成中间文件

​ ​ 开始之前首先要在工作空间中的src文件夹中新建一个功能包,可以用catkin_create_pkg 功能包名 依赖,建立一个新的功能包。这里我命名为server_client。

(1)按照固定格式创建srv文件

​ ​  在新建功能包server_client中新建一个文件夹命名为srv,在srv文件中新建文件命名为AddInts.srv用于存放我们的消息载体。

在这里插入图片描述
​ ​ srv文件中存放的变量结构体按照请求和相应分为两部分,用—隔开

在这里插入图片描述

(2)编辑配置文件package.xml和CMakelist.txt

①首先编辑package.xml文件

在这里插入图片描述

②编辑CMakelist.txt文件

在这里插入图片描述

​ ​ 注意下面这个不同于话题通信,需要配置srv相关部分,将注释放开,并把我们新建的AddInts.srv更换到文件下面

在这里插入图片描述

​ ​ 将generate_messages注释放开,因为这里虽然我们的通信数据格式是自定义的,但是它的产生依然依赖于标准包std_msgs

在这里插入图片描述

​ ​ 放开注释catkin_packages,类似话题通信,这里也是为了满足包之间的依赖关系。

在这里插入图片描述

到这里呢,我们的配置就终于完成啦~接下来进入编译环节

(3)编译生成中间文件

ctrl+shift+B

​ ​ 可以看到我们的编译并未抛出异常

在这里插入图片描述

​ ​ 如果这里报错“Invoking “cmake”failed,很有可能是包名写错啦,回去检查一下重新编译就好啦

(3)编译生成中间文件

​ ​ 可以看到我们已经在开发空间devel中产生了一些后续被调用到的文件。这样我们的数据结构文件就配置好啦~可以进行下一步的开发咯

在这里插入图片描述

(4)自定义srv文件的调用

  模型实现中:rosmaster可以通过roscore启动,建立连接的具体过程已被官方封装好

  我们需要做的工作主要分为以下三个部分:①服务端程序编写②客户端程序编写③数据

VScode配置

  使用自定义srv文件时,需要对VScode进行一些配置,这样可以使VS提供对应的语法高亮,便于我们编程,也能防止VScode误抛异常。不配置也不影响使用。

服务端代码实现

  定位到功能包,新建文件夹scripts,新建文件server.py

  创建服务对象用到的函数rospy.Service(”话题名“,数据类型,回调函数),话题名自定义(服务端和客户端需要保持一致),数据类型取决于srv文件的自定义名称,回调函数自己编写和spin()成对出现。

#! /usr/bin/env python
import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse
#这里可以import*,不用写清楚具体的类和对象,这样会把该文件的所有对象都导入,但是要注意文件大的时候这样处理会变慢很多
"""
服务端:解析客户需求,产生响应
1、导包
2、初始化ros节点
3、创建服务端对象
4、数据处理逻辑(回调函数)
5、spin()
"""
#参数:封装了请求数据
#返回值:响应数据
def doAdd(request):
    #解析请求提交的两个数字
    num1 = request.num1
    num2 = request.num2
    #对解析出的数字进行求和
    sum = num1+num2
    #创建响应对象,将返回值封装入响应对象
    response = AddIntsResponse()
    response.sum = sum
    rospy.loginfo("服务器解析的数据是num1=%d,num2=%d,求和结果sum=%d",num1,num2,sum)
    return response
    
if __name__=="__main__":
    #初始化ROS节点
    rospy.init_node("fuwu")
    #创建服务对象,注意函数大小写,数据类型取决于srv文件的文件名
    server = rospy.Service("addints",AddInts,doAdd)
    rospy.loginfo("服务器已经启动了")
    rospy.spin()

配置CMakelist.txt

在这里插入图片描述

改变文件可执行权限,source刷新环境变量,rosrun运行,可以看到服务器启动了

在这里插入图片描述

客户端还未编写,我们这里可以用命令模拟客户端来测试服务端的功能,call后面要加自定义的建立通信链接的话题名,之后可以tab键自动补齐数据结构类型,手动修改数据并执行即可测试。

rosservice call addints "num1:1,num2:2"

在这里插入图片描述

客户端代码实现

定位到功能包,新建文件夹scripts,新建文件client.py

创建客户对象用到的函数rospy.ServiceProxy(”话题名“,消息数据类型),话题名和服务端保持一致,数据类型同服务端,取决于srv文件,这里是AddInts。

请求数据并发送请求:client.call(num1,num2)

#! /usr/lib/env python
import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse
"""
1、导包
2、初始化ros节点
3、创建客户端对象
4、组织请求数据,并发送请求
5、处理响应
"""

if __name__=="__main__":
    rospy.init_node("kehu")
    #创建客户端对象
    client = rospy.ServiceProxy("addints",AddInts)
    #组织请求数据,并发送请求
    response = client.call(12,23)
    #处理响应,这里直接打印一下
    rospy.loginfo("响应求和之后的数据是%d",response.sum)

程序执行结果:
在这里插入图片描述

优化实现:
(1)可以在执行节点时,动态传入参数
  用到模块sys中的argv。这个可以包含节点名称和传入的数据。
(2)解决问题:
  当客户端先于服务端启动时,程序会抛出异常,但是ROS节点在启动时是没有先后顺序的,那么在程序执行过程中可能会出现一些问题
解决方案:
  当客户端先于服务端启动时,不要抛出异常,而是要挂起等待。等待服务器启动后,再次发送请求
实现代码:
  ROS中的内置函数,判断服务器的状态,服务端未启动时客户端挂起。
   法一: client.wait_for_service(),不需要传入话题名称,它本身可以查找话题名
  法二: rospy.wait_for_service(“话题”)rospy需要传入参数话题名称

#! /usr/lib/env python
import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse
import sys

"""
1、导包
2、初始化ros节点
3、创建客户端对象
4、组织请求数据,并发送请求
5、处理响应


问题:
    当客户端先于服务端启动时,程序会抛出异常,但是ROS节点在启动时是没有先后顺序的,那么在程序执行过程中可能会出现一些问题
解决方案:
    当客户端先于服务端启动时,不要抛出异常,而是要挂起等待。等待服务器启动后,再次发送请求
实现代码:
    ROS中的内置函数,判断服务器的状态,服务端未启动时客户端挂起。
    法一:client.wait_for_service(),不需要传入话题名称,它本身可以查找话题名
    法二:rospy.wait_for_service("话题")rospy需要传入参数话题名称
"""

if __name__=="__main__":

    #判断参数长度,由于节点名也算一个参数,argv[0]是节点名,所以这里是3
    if len(sys.argv)!=3:
        rospy.logerr("传入的参数个数不对")
        sys.exit(1)

    rospy.init_node("kehu")
    #创建客户端对象
    client = rospy.ServiceProxy("addints",AddInts)
    #组织请求数据,并发送请求,argv[1]这里是字符串类型,需要强行将其转换为int类型
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
    #等待服务器启动
    #client.wait_for_service()
    #法二
    rospy.wait_for_service("addints")
    response = client.call(num1,num2)
    #处理响应,这里直接打印一下
    rospy.loginfo("响应求和之后的数据是%d",response.sum)

在这里插入图片描述
从程序执行结果可以看到,可以动态输入num1和num2,crtl C关闭服务端后,先执行客户端,客户端程序不会抛出异常而是会挂起等待,开启服务端后正常响应。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解 的相关文章

  • ROS之QtCreator开发环境搭建

    文章目录 系统环境 官方教程 安装 卸载 使用 导入工作空间 构建与运行 编写测试程序 系统环境 操作系统 Ubuntu20 04 ROS版本 Noetic 官方教程 按照官方教程或者下面笔记中的内容均能进行环境搭建 笔记中另外做了部分补充
  • ROS与navigation教程——ACML参数配置

  • ROS turtlebot_follower :让机器人跟随我们移动

    ROS turtlebot follower 学习 首先在catkin ws src目录下载源码 地址 https github com turtlebot turtlebot apps git 了解代码见注释 其中有些地方我也不是很明白
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • 激光雷达LMS111在ROS上的使用

    LMS111 10100 在ROS上的测试与使用 准备工作 设备 硬件 LMS111 101000激光雷达 软件 ubuntu16 04 ROS 开始 设备连接 将激光雷达与处理器 电脑 工控机等 通过以太网连接好 激光雷达默认的IP地址为
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件

    ROS 服务 现在 想象一下你在你的电脑后面 你想从这个服务中获取天气 你 在你身边 被认为是客户端 在线天气服务是服务器 您将能够通过带有 URL 的 HTTP 请求访问服务器 将 HTTP URL 视为 ROS 服务 首先 您的计算机将
  • 程序“catkin_init_workspace”尚未安装。 您可以使用以下命令安装: sudo apt install catkin

    程序 catkin init workspace 尚未安装 您可以使用以下命令安装 sudo apt install catkin 问题如图 先贴上解决后的效果 运行环境 ubuntu 16 04 ros版本 kinetic 问题解释 这个
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • catkin_make后找不到ROS包

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core

随机推荐

  • Mysql-解决创建存储函数This function has none of DETERMINISTIC

    问题 当二进制日志启用后 xff0c 这个变量就会启用 它控制是否可以信任存储函数创建者 xff0c 不会创建写入二进制日志引起不安全事件的存储函数 如果设置为0 xff08 默认值 xff09 xff0c 用户不得创建或修改存储函数 xf
  • JPA-ids for this class must be manually assigned before calling save (使用数据库的自增)

    问题 Spring Data JPA ids for this class must be manually assigned before calling save id的生成错误 xff0c 在调用 save 方法之前 xff0c 必须
  • Java-gradle编译忽略警告

    使用gradle打包的时候出现好多警告 如何忽略大部分的警告呢 使用如下配置即可 tasks span class token punctuation span span class token function withType span
  • JPA-排除实体类里不存在于数据库的字段

    在实体类与数据库表建立映射关系时添加 64 Table 注解 当表中不存在实体类中的某个属性的时候 就需要用到 64 Transient 注解 如果不好使那么在 64 Transient基础上在添加 64 Column updatable
  • SpringBoot-快速搭建一套JPA

    文章目录 结构Mavenapplication yml实体类daoservicecontroller测试 结构 Maven span class token tag span class token tag span class token
  • IntelliJ IDEA-Gradle-SpringBoot搭建

    前提条件 IntelliJ IDEA Gradle教学 Gradle 全局镜像配置和优先使用Maven 将Gradle进行安装和配置 创建项目 配置项目设置 指定自己的gradle的安装位置 以及仓库位置 用户主目录 用户主目录 Gradl
  • 我的喜马拉雅FM开播啦!

  • SpringBoot-JAP-JpaSpecificationExecutor详解

    文章目录 SpringBoot JAP JpaSpecificationExecutor详解使用方法接口介绍自定义工厂 SpringBoot JAP JpaSpecificationExecutor详解 JpaSpecificationEx
  • SwitchHosts-快速切换Hosts

    SwitchHosts是一个管理 快速切换Hosts小工具 xff0c 开源软件 xff0c 一键切换Hosts配置 xff0c 非常实用 xff0c 高效 其主要功能特性包括 xff1a 下载地址 https github com old
  • Java-新年抽奖-消息自动化发送脚本

    我们公司7点半开年会 然后大约8点半开始抽奖抢 使用腾讯会议的方式进行发关键字消息然后截图方式抽奖 然而我还在地铁上 手速慢的我只抽到了3等奖小米耳机一个 然后我回家后迫不及待第一时间赶紧使用java写一个机器人脚本 疯狂发消息 一言难尽啊
  • Java多线程-CompletableFuture(链式)

    线程池这个大家都知道 xff0c 是为了提高效率 xff0c 可以类比生活 xff0c 如果开个店 xff0c 需要几个员工 xff0c 正常的操作都是雇佣员工 xff0c 而不是每天使用临时工 xff0c 这样用完就解雇掉 xff0c 对
  • Java-Javassist(字节码修改)

    文章目录 开篇Javassist 常用类Javassist 的使用依赖代码示例 如何实现类似 AOP 的功能 开篇 说起 AOP 小伙伴们肯定很熟悉 xff0c 无论是 JDK 动态代理或者是 CGLIB 等 xff0c 其底层都是通过操作
  • Java多线程-Pip管道

    管道的意思 就是向一个管子一样从一端到另一端 只支持单方向的数据传输 需要注意的不能在同一个线程使用管道否则会导致死锁的情况 发生和接收必须在不同线程 通过使用管道 xff0c 实现不同线程间的通信 xff0c 而无需借助于临时文件之类的东
  • 新版本代码自动生成(MybatisPlus-generator) 代码示例+问题解决

    虽然MybatisPlus官网上已经给出了新版本代码生成器的核心依赖和核心代码 xff0c 但对于没接触过的小伙伴还是比较困难上手 x1f62d xff0c 本文将展现如何使用MybatisPlus generator快速生成代码 目录 1
  • 虚拟机如何使用共享文件夹传文件

    项目场景 xff1a 在使用VMware平台 xff0c ubuntu操作系统时 xff0c ftp文件传输一直报错 问题描述 xff1a 尝试了多种 xff0c 更改电脑设置 xff0c 甚至重装虚拟机 xff0c 始终如下图报错 解决方
  • 强化学习入门DQN详解

    Deep Q Network 参考资料 xff1a B站莫烦 xff1a https www bilibili com video BV13W411Y75P spm id from 61 333 337 search card all cl
  • 某项目因为多次流标导致实际项目时间严重压缩,我该咋办?

    问题 xff1a 某政府项目 xff0c 三个月前就开始招标 xff0c 因各种原因 xff0c 流标三次 xff0c 导致时间拖太长 原计划一期工期三个月 43 xff0c 1月底上线 xff0c 但因为招投标影响直到一个月前签订了合同
  • ROS创建工作空间及功能包流程总结整理(python)

    ROS创建工作空间及功能包流程总结整理 xff08 python xff09 参考资料 xff1a B站赵虚左 xff1a https www bilibili com video BV1Ci4y1L7ZZ p 61 19 amp vd s
  • ROS自定义发布消息类型

    ROS自定义发布消息类型 xff1a 在 ROS 通信协议中 xff0c 数据载体是一个较为重要组成部分 xff0c 在上一案例中 xff0c ROS 中通过 std msgs 封装了一些原生的数据类型 比如 String Int32 In
  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非