2.6 自定义srv python

news2024/10/2 16:17:41

功能介绍

以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出

1、工作空间

1.1 创建工作空间lee_ws

mkdir -p ~/lee_ws/src
cd ~/lee_ws/src/
catkin_init_workspace 
cd ~/lee_ws/
catkin_make
echo "source ~/lee_ws/devel/setup.bash" >> ~/.bashrc
source devel/setup.bash 

1.2 创建功能包lee_srv

cd ~/lee_ws/src
catkin_create_pkg lee_srv std_msgs rospy roscpp
cd ~/lee_ws/
catkin_make
source ~/lee_ws/devel/setup.bash 

1.3 创建srv文件

路径: /home/lee/lee_ws/src/lee_srv/srv/AddTwoInts.srv

int64 num1
int64 num2
---
int64 sum

1.4 package.xml配置

在package.xml最下面的build_dependexec_depend附近添加即可

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

1.5 CMakeLists.txt配置

在CMakeLists.txt中配置下面相应的代码

# 需要加入 message_generation,必须有 std_msgs
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

# 配置 srv 源文件
add_service_files(
  FILES
  AddTwoInts.srv
)

# 生成消息时依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)

#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES lee
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

1.6 编译后的中间文件查看

Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/srv)

1.7 总结步骤1.3-1.5

  • 1.3建立的自定义srv文件
  • 需要通过1.4和1.5两个步骤的配置才能通过catkin_make对1.3的文件进行编译
  • 1.6为通过编译自定义文件生成的python、C++和js等头文件,用于相应编程代码的头文件调用

1.8 VScode编辑ros参数配置

快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build这一行,点击小齿轮配置设置,修改.vscode/tasks.json 文件,将下面复制进去即可
这么配置的原因:下一次快捷键 ctrl + shift + B直接进行代码编译
路径: /home/lee/lee_ws/.vscode/tasks.json

{
	"version": "2.0.0",
	"tasks": [
		{
			//代表提示的描述性信息
			"label": "catkin_make:debug", 

			//可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
			"type": "shell",  

			//这个是我们需要运行的命令
			"command": "catkin_make",
			
			"args": [],
		   
			"group": {"kind":"build","isDefault":true},
			
			//可选always或者silence,代表是否输出信息			
			"presentation": {"reveal": "always"},
			
			"problemMatcher": "$msCompile"
		}
	]
}

1.9 vscode 头文件配置

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将1.3-1.5生成的 head 中间文件路径配置进 c_cpp_properties.json 的 includepath属性,如果不配置vscode会报错代码,但是编译不受影响
路径: /home/lee/lee_ws/.vscode/c_cpp_properties.json

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "",
                "limitSymbolsToIncludedHeaders": true
            },
            "includePath": [
                "/opt/ros/noetic/include/**",
                "/home/lee/catkin_ws/src/lee/include/**",
                "/usr/include/**",
                "/home/lee/catkin_ws/devel/include/**" //配置 head 文件的路径 
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

2、服务端代码 Python

路径: /home/lee/lee_ws/src/lee_srv/scripts/lee_srv_add_server.py

2.1 代码部分

#! /usr/bin/env python
# coding=utf-8

import rospy
from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse

#接收到数据请求后,进入回调函数
def chatterCallback(req):

    # 解析提交的数据
    sum = req.num1 + req.num2
    rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)

    # 创建响应对象,赋值并返回
    # resp = AddIntsResponse()
    # resp.sum = sum
    resp = AddTwoIntsResponse(sum)
    return resp

if __name__ == "__main__":
   
    #初始化 ROS 节点:命名(唯一)
    rospy.init_node("lee_srv_add_server")

    #创建一个Service,服务名为chatter_srv的topic,注册回调函数为chatterCallback
    server = rospy.Service("chatter_srv",AddTwoInts,chatterCallback)

    #设置循环调用回调函数
    rospy.loginfo("服务已经启动....")
    rospy.spin()

2.2 CMakeLists.txt部分

在install下面直接添加如下代码即可

catkin_install_python(PROGRAMS scripts/lee_srv_add_server.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

3、客户端代码 Python

路径: /home/lee/lee_ws/src/lee_srv/src/lee_srv_add_client.cpp

3.1 代码部分

#! /usr/bin/env python
# coding=utf-8

import rospy
from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse
import sys

if __name__ == "__main__":
    #优化实现
    #if len(sys.argv) != 3  如果通过 launch 的 args 传参,需要传递的参数个数 3
    #if len(sys.argv) != 5  传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径)
    if len(sys.argv) != 3:
        rospy.logerr("请正确提交参数,需要两个数字")
        sys.exit(1)

    #初始化 ROS 节点:命名(唯一)
    rospy.init_node("lee_srv_add_client")

    #创建一个ServiceProxy,订阅名为chatter_srv的topic
    client = rospy.ServiceProxy("chatter_srv",AddTwoInts)

    # 请求前,等待服务已经就绪,如服务器没启动则一直在此等待
    client.wait_for_service()

    #整理请求的数据
    req = AddTwoIntsRequest()
    # req.num1 = 100
    # req.num2 = 200 
    #优化
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2]) 

    #发送请求,并接收并打印显示
    resp = client.call(req)
    rospy.loginfo("响应结果:%d",resp.sum)

3.2 CMakeLists.txt部分

在install下面直接添加如下代码即可

catkin_install_python(PROGRAMS scripts/lee_srv_add_client.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

4、代码测试

4.1 启动rosmaster

roscore

4.2 启动 lee_srv_add_server 节点

rosrun lee_srv lee_srv_add_server.py

4.3 启动 lee_srv_add_client 节点,并带参数

rosrun lee_srv lee_srv_add_client.py 1 2

5、结果

在这里插入图片描述

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

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

相关文章

leetcode134.加油站 贪心法求解 (c++版本)

题目描述 题目比较长&#xff0c;明确以下这点就可以 gas数组是当前下标i加油站所能加的油cost数组是从当前下标i加油站到下一加油站所消耗的油那么gas [i]与cost [i] 的大小就决定了车辆能否从当前加油站出发到达下一加油站 上面三点非常重要是能正确做出题目的必须要求 其实…

字符流,编码表,字符流写数据,字符流读数据

文章目录前言字符流编码表字符串中的编码解码问题字符流写数据字符流读数据总结前言 因为近期考试原因&#xff0c;还有自身惰性的问题&#xff0c;小编最近停更了一段时间&#xff0c;随之而来的罪恶感让我又开启了自学与创作之路&#xff0c;学习这么久&#xff0c;自己虽然…

来源稳定的l2逐笔接口数据去哪找?

l2逐笔接口的逐笔数据的最初来源均是从交易所获取&#xff0c;其授予了一些信息服务商L2非展示数据接口转发权限&#xff0c;其中包含了逐笔成交、逐笔委托等数据。使用时&#xff0c;通常是从信息商处购买&#xff0c;比如同花顺、万得、国泰安等等。那么小编认为通过交易所授…

mysql中find_in_set()函数的使用及in()用法详解

MySQL手册中find_in_set函数的语法解释&#xff1a; FIND_IN_SET(str,strlist) str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22) 查询字段(strlist)中包含(str)的结果&#xff0c;返回结果为null或记录 假如字符串str在由N个子链组成的字符串列表strli…

Linux:rpm与yum(内含:1.rpm介绍+2.卸载rpm包+3.安装rpm(应用案例)+4.yum(应用案例))

1.rpm介绍使用: 实例&#xff1a;查看当前系统是否安装了 firefox &#xff0c;操作如下&#xff1a; 解释&#xff1a; 名称&#xff1a;firefox 版本号&#xff1a;91.11.0-2 使用操作系统&#xff1a;el7.centos.x86_64 表示centos.x的64位系统。 查询软件包是否安装&#…

跨境电商卖家必知的9个圣诞节营销技巧

关键词&#xff1a;跨境电商卖家、圣诞节营销 圣诞节——对跨境电商卖家来说是非常重要的促销节日。根据以往的经验&#xff0c;您或许已经有了初步的促销想法&#xff0c;想知道您今年的跨境电子商务营销策略是否正确&#xff1f;为您整理了跨境电商卖家必须注意的营销技巧&am…

TiDB数据库架构——TiDB Server

TiDB Server架构 TiDB Server 是SQL层&#xff0c;无状态&#xff0c;启动多个TiDBServer&#xff0c;均匀分摊&#xff0c;解析SQL&#xff0c;获取真实数据。 Protocol Layer、&#xff1a;负责客户端的连接。 Parse、Compile&#xff1a;负责SQL语句的解析和编译&#xff…

信息控制信息卷积

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景

少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年9月

目录 2022年9月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 推荐资料

java学生作业带选课管理系统ssh

1.管理员具有对学校课程信息&#xff0c;教师信息&#xff0c;学生信息增删改查的权限 &#xff08;1&#xff09;可以录入学校所开课程&#xff0c;学生信息&#xff0c;教师信息&#xff1b; &#xff08;2&#xff09;可以对教师的开课信息进行增加&#xff0c;删除&#xf…

什么是 DeGods NFT 系列?

Nov. 2022, Vincy Data Source: Footprint Analytics - DeGods NFT Collection DeGods 系列有 10,000 个 Solana 铸造头牌的 NFT。 DeGods 持有者拥有访问 DeDAO 的权限和社区。 它在 1 月推出 DUST 协议&#xff0c;允许持有者质押他们的 DeGods NFT 并赚取 DUST。 10 月 …

cmake 工具 三 add_libary, set_target_properties,link_libary, target_link_libary

一起通过一个例子学一下 add_libary&#xff0c; set_target_properties&#xff0c;link_libary&#xff0c; target_link_libary 四个命令 首先创建如下的文件&#xff1a; 其中 build用于cmake编译&#xff0c;防止大量编译的中间文件污染代码文件夹具体可见cmake 构建工具…

手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图片不满足

上图是近期小编与一位店主的聊天截图&#xff0c;从截图中我们可以知道&#xff0c;这位店主在使用复制软件来复制宝贝上传时出现了一些问题&#xff0c;下面&#xff0c;小编将上传出现的错误、分析过程及解决方法列示如下&#xff0c;希望能给其他店主一些帮助&#xff1a;查…

批量图片压缩怎么做?分享三招图片压缩怎么操作的方法

因为工作需要在电脑上保存大量图片的小伙伴们&#xff0c;是不是图片一下子把电脑内存占满了&#xff0c;可是要怎么做才能减少图片的占用空间呢&#xff1f;我们可以把图片压缩&#xff0c;这样子就可以保存更多的图片啦。还不清楚批量图片压缩怎么做的小伙伴们&#xff0c;让…

光点数据中台,解决高校信息整合难题_光点科技

目前&#xff0c;国家和相关部门对教育信息化高度重视&#xff0c;先后出台了多项政策和文件&#xff0c;要求加快教育信息化的发展步伐&#xff0c;高校信息化进入了快速发展期。 在此背景下&#xff0c;数据也将会成为高校信息化的核心资产&#xff0c;并对高校信息化的快速发…

【Big Data】解决Hive查询出现Java.lang.OutMemoryError.java heap space

一、Introduction 在使用Hive时&#xff0c;出现了以下的问题 错误的原因是资源分配不够&#xff0c;但是错误的原因有很多&#xff0c;需要去查看日志文件观察具体的错误。 日志文件位置在 /tmp/root/hive.log 由此我们知道具体的错误原因是JVM资源分配不够 接下来可以尝试…

PE格式:手写PE结构解析工具

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,在PE文件中我们最需要关注,PE结构,导入表,…

Tech Lead如何组建你的全明星团队

当你成为 Tech lead&#xff0c;意味着你不再只是团队中的普通一员。现在你是开发团队的Leader&#xff0c;换句话讲&#xff0c;这是一支你的团队。你需要费尽心思组建和打造你的团队&#xff01; 组建搭配合理的团队 (图片来自于 pixabay) 作为Tech Lead&#xff0c;你要先…

Jmeter,将响应结果保存至csv文件,并读取csv文件

在做性能测试的时候&#xff0c;需要模拟多个不同的用户同时进行操作&#xff0c;此时可以将响应数据中的某些字段&#xff08;比如token字段&#xff09;提取出来&#xff0c;以供下一接口作为入参。 一、将响应结果中的字段提取&#xff0c;并保存至CSV文件【分为2个步骤】 …

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 Redis管理客户端&#xff0c;兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…