首页 > 编程语言 >ROS服务通信机制实操Python

ROS服务通信机制实操Python

时间:2024-07-17 20:56:31浏览次数:19  
标签:__ Python client rospy 实操 ROS 服务端 客户端

ROS服务通信机制实操Python

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 python3
      
      
      import rospy
      from plumbing_server_client.srv import AddInts, AddIntsRequest, AddIntsResponse
      
      """
      服务端:解析客户端请求,产生响应。
          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__":
          # 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 python
    
    import 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 python3

import 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 python3

import 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)

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

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

在这里插入图片描述

标签:__,Python,client,rospy,实操,ROS,服务端,客户端
From: https://blog.csdn.net/m0_49289284/article/details/140450924

相关文章

  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......
  • Python回归、聚类、相关分析上海公租房租金满意度影响因素数据可视化
    全文链接:https://tecdat.cn/?p=37013原文出处:拓端数据部落公众号随着城市化进程的加速,住房问题日益成为城市居民关注的焦点。公租房作为政府为解决中低收入家庭住房困难而推出的一种重要住房保障形式,其租金水平、居住条件及租住体验直接关系到广大租户的切身利益和生活质量......
  • Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析|附代码数据
    全文下载链接:http://tecdat.cn/?p=17748最近我们被客户要求撰写关于销售量时间序列建模的研究报告,包括一些图形和统计输出。在本文中,在数据科学学习之旅中,我经常处理日常工作中的时间序列数据集,并据此做出预测我将通过以下步骤:探索性数据分析(EDA)问题定义(我们要解决什么)变量......
  • python环境配置及基础学习
    python环境配置及基础学习Miniconda安装及使用创建环境condacreate-nnamepython=3.10进入环境condaactivatename退出环境condadeactivateVSCode安装安装成功后,在左边“extensions”搜索Chinese语音包点击install,按照提示重启VSCode在左边“拓展”搜索python,安装......
  • 企业级环境部署:在 Linux 服务器上如何搭建和部署 Python 环境?
     在大部分企业里,自动化测试框架落地都肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。所以,我们如果要在Linux上的Jenkins服......
  • Python函数基础编写定义
    目录1、函数目的2、函数定义3、函数声明4、函数调用5、函数形参6、函数实参7、函数返回值8、函数的参数类型9、匿名函数1、函数目的函数又叫方法,能减少重复代码的编写,提升代码的复用。函数封装了一定的功能,方便不断使用,可以达到简化代码、重复调用的效果,比如系......
  • python 模拟电力系统
    要模拟一个电力系统,你需要使用Python编写一个程序来建立系统的模型,包括发电机、变压器、输电线路、负载等组件,并模拟它们之间的相互作用。这是一个复杂的任务,通常需要使用数学建模和模拟技术,以便分析电力系统的运行情况。以下是一个简单的示例,展示了如何使用Python模拟电力系......
  • 使用Apache POI 处理Miscrosoft Office各种格式文件
    介绍ApachePOI是一个处理MiscrosoftOffice各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java程序中对MiscrosoftOffice各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。ApachePOI的应用场景:●银行网银系统导出交易明细●各种业务系......
  • Python电力系统PyPsa
    PyPsa是一款电力系统分析包,其可以进行稳态潮流计算(使用非线性/线性网络方程);线性最优潮流计算(线性网络约束下,计算电厂和储能分布的最小成本,使用线性网络方程);安全约束下线性最优潮流计算全电力/能源系统最小投资成本优化(使用线性网络方程,对发电、储能分布、投资优化)等操作。本文主......
  • Python文件与数据处理:掌握I/O操作与序列化的艺术
    在Python编程的世界里,文件操作和数据序列化犹如画家手中的画笔和调色板,是构建强大应用程序不可或缺的工具。本文将深入探讨open()函数的巧妙使用、JSON和pickle模块的序列化魔法,以及os模块在文件系统操作中的关键角色。让我们一同揭开Python文件与数据处理的神秘面纱,掌握I/O操......