2.6 自定义srv python
功能介绍
以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出
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_depend
和exec_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 COMPONENTSroscpprospystd_msgsmessage_generation
)# 配置 srv 源文件
add_service_files(FILESAddTwoInts.srv
)# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs
)#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES leeCATKIN_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-8import rospy
from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse#接收到数据请求后,进入回调函数
def chatterCallback(req):# 解析提交的数据sum = req.num1 + req.num2rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)# 创建响应对象,赋值并返回# resp = AddIntsResponse()# resp.sum = sumresp = AddTwoIntsResponse(sum)return respif __name__ == "__main__":#初始化 ROS 节点:命名(唯一)rospy.init_node("lee_srv_add_server")#创建一个Service,服务名为chatter_srv的topic,注册回调函数为chatterCallbackserver = 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-8import rospy
from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse
import sysif __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的topicclient = 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、结果
2.6 自定义srv python相关推荐
- 2.5 自定义srv C++
功能介绍 以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出 1.工作空间 1.1 创建工作空间lee_ws mkdir -p ~ ...
- python导入自定义模块_如何Import自定义的Python模块?
原标题:如何Import自定义的Python模块? 实际工作中,经常要用的功能能不能像导入python模块一样,通过import导入呢?答案当然是可以的,本文教你如何做,大家一起来学习吧! 背景 在实 ...
- 【服务通信自定义srv调用3----客户端的优化】
客户端的优化 服务通信自定义srv调用,客户端随意提交两个数,完成数的相加.也就是实现参数的动态提交: 1.格式:rosrun xxxx xxxx 12 34 2.节点执行时候,需要获取命令中的参数, ...
- 聊聊如何制作自定义ArcGIS Python工具箱
前言 有时候手里就是闲不住,大好假期竟然无意休息.于是想和大家分享分享ArcGIS工具箱制作的一些经验.最先接触自定义工具箱制作是在大四,当时毕设就是写数字水印工具箱,但当时主要任务在于算法实现,所以 ...
- python文件用pyinstaller库进行打包时,代码中用到的图片和我们自定义的python package包的处理办法
在使用python打包.py文件时,如果我们在代码中使用到了图片,那么在打包成功后,运行.exe文件时会提示 Failed to execute script xxx的错误,当我们自定义了python ...
- 自定义制作python版本的CIFAR数据集
自定义制作python版本的CIFAR数据集 CIFAR-10/CIFAR-100数据集 1.准备图像 (以制作小数据集为例,便于理解) 这里自定义制作的数据集只包含2个类:dog,parrot,每个 ...
- #自定义srv消息:实现四则运算
#自定义srv消息:实现四则运算 tips:养成良好习惯,新建工作包之前,先把工作空间编译一下,确保之前建好的工作包没有错误,再新建新的工作包,以免后续编译出现错误一直找不到原因. 1.在工作空间下创 ...
- 自定义srv消息之ros
自定义消息 前言 在Ros中,如果没有现成的消息类型来描述要去传递的消息时,我们会自定义消息. 我们会新建一个Package来去自定义消息,通常这个Package写任何的业务逻辑,只是用来声明自定义的 ...
- 自定义安装python,退格,方向键无法正常使用(转)
请教下: redhat 5.3 64位的系统 系统自带的python 2.4.3箭头和退格正常使用 #python Python 2.4.3 (#1, Sep 17 2008, 16:07:00 [ ...
最新文章
- ajax form不回调函数,jQuery ajax form提交在IE8下不执行回调函数
- excel单元格斜线_如何用EXCEL做一套田字格模板?在家给小孩练习写字
- 又拍云上传文件后,如何访问?
- Eclipse中安装插件时提示:No repository found containing: osgi.bundle,org.eclipse.emf,2.8.0.v20180706-1146
- PHP的错误处理机制
- Python 线程优先队列 PriorityQueue - Python零基础入门教程
- entity framework框架生成摘要文档为空(没有元数据文档可用)的bug解决方案
- 厨师刀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- CentOS 缺少mysqli扩展 请检查PHP配置
- TP LINK交换机 console 超级终端链接设置
- 虚拟仿真实验室 服务器,中国美术学院|虚拟仿真实验教学共享平台
- 纽约州立大学环境与林业学院计算机科学专业,2020年纽约州立大学环境科学与林业科学学院专业设置...
- 20090726选股
- 怎么找主播卖货?最靠谱的5种直播带货方式
- 从现实世界的角度去理解计算机领域的知识
- 【技术方案】如何基于高清摄像头设备,搭建慢直播平台?
- python众数问题给定含有n个元素的多重集合s_ACM题目:众数给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数...
- EM算法双硬币模型的python实现
- mybatis-plus 主键自增问题
- CSS中min-height、min-width、max-width、max-height的理解及优先级问题