2,服务通讯C++与python
服务通讯
- 前言
- 理论模型
- 自定义srv文件
- Package调整
- CmakeLists调整
- 服务器实现
- C++
- python
- 客户端实现
- C++
- python
- 测试与注意事项
前言
本文主要是跟着audolabor学习ROS笔记,多为操作性质,并从另一种角度对实现的顺序进行调整,想要多学习,可以参考autolabor教程
理论模型
与之前话题通讯之间有所区别,服务通讯适用于这样的场景:服务器处有一个公共资源,客户端可以调用这个资源,进行运算或者得到某些数据。而话题通讯更多是指发布方不进行数据处理,订阅方直接得到发布方的数据,而后进行自己的数据处理。
自定义srv文件
新建一个addint.srv文件,在文件中输入
# 以下为请求数据
int32 num1
int32 num2
---
# 以下为返回数据
int32 sum
Package调整
在package.xml中加入以下代码
<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
CmakeLists调整
找到CmakeLists.txt修改以下四个地方
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
add_message_files(FILESPerson.msg
)
generate_messages(DEPENDENCIESstd_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
服务器实现
为了代码补全功能,需要在c_cpp文件和setting文件加入srv中间文件的位置,需要注意的是,不要使用~来代替/home/用户,一定要从根目录下开始写,不然亲测python不会有自动补齐的功能,不知道是bug还是linux的奇怪特性
C++
#include "ros/ros.h"
#include "fuwu/addint.h"bool doNums(fuwu::addint::Request& req,fuwu::addint::Response& rep)//cpp同时传入请求数据和response数据,返回一个bool值,与下面python不同
{int num1 = req.num1;int num2 = req.num2;int sum = num1 + num2;rep.sum = sum;return 1;
}
int main(int argc, char *argv[])
{ros::init(argc,argv,"server");ros::NodeHandle nh;ros::ServiceServer server = nh.advertiseService("addint", doNums); //使用回调函数处理请求数据,并将处理结果返回ros::spin();return 0;
}
python
#! /usr/bin/env python #非常重要,不要忘了
import rospy
from huati.srv import *def pydoNum(request): #python传入的只有请求数据,通过函数返回数据传回responsenum1 = request.num1num2 = request.num2response = addintResponse()# python中不传入返回数据需要自己利用类定义返回数据,这个类在srv的中间文件中response.sum = num1 + num2return response# response中可以包括多个对象,本例只有一个对象,不要误解
if __name__ == "__main__":rospy.init_node("pyserver")server = rospy.Service("addpy",addint,pydoNum)#addint是srv的文件名,即是用户自定义的数据类型名字rospy.spin()
客户端实现
C++
argc是指输入参数的个数,最小为1,表示输入的只有程序本身,如果输入参数为n,则argc=n+1,argv是二维数组,argv[0]指向程序的地址,argv[1],…指向输入的参数,注意此时输入参数都为字符串
#include "ros/ros.h"
#include "fuwu/addint.h"int main(int argc, char* argv[])
{setlocale(LC_ALL,"");if(argc != 3){ROS_INFO("输入参数数量不对");return 1;}ros::init(argc,argv,"cppclient");ros::NodeHandle nh;ros::ServiceClient client = nh.serviceClient<fuwu::addint>("addints");fuwu::addint nums;//创建发送数据,nums有三个对象,num1,num2和responsenums.num1 = atoi(argv[1]);nums.num2 = atoi(argv[2]);ros::service::waitForService("addint")//等待服务器启动,传入的参数是话题名字。也可以使用clinet.waitForExistence();bool flag = clint.call(nums);if(flag){ROS_INFO("请求成功,返回数据为%d",nums.response.sum);}return 0;}
python
#! /usr/bin/env python
import rospy
from fuwu.srv import *
import sysif __name__ == "__main__":if len(sys.argv) != 3:rospy.logerr("参数个数不对")sys.exit(1)ros.init_node("pyclient")client = rospy.ServiceProxy("addints",addint)num1 = int(sys.argv[1])num2 = int(sys.argv[2])client.wait_for_service()# 或者使用rospy.wait_for_service("addint")response = client.call(num1, num2)rospy.loginfo("返回的数据是%d",response.sum)
测试与注意事项
rosrun fuwu pyserver.py
rosrun fuwu pyclient.py 2 4
- 注意对配置中间文件的更改,不能使用~代替/home/用户名
2,服务通讯C++与python相关推荐
- python写一个服务_写一个Python的windows服务
1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...
- 基于订阅的服务通讯架构体系
说到订阅服务通讯一般都会想到基于队列的消息生产和消费模式,这也是在实际应该中比较常用的方式.一般生产者把消息发送到队列服务中心,然后消费者去中心订阅:然而这种方式需要一个消息服务中心,而在这里所说的订 ...
- AbpVnext 微服务 内部网关服务通讯 动态API客户端
阅读此篇文章之前,你需要对Abpvnext 微服务样例项目<MicroService_Demo>有一定的熟悉度与理解度 文章并没有详细说明远程服务的配置相关,各位可自行查阅官网文档,或者相 ...
- 八:对微服务通讯方式RPC vs REST的理解
微服务专栏地址 专栏:微服务 微服务系列总目录 目录 微服务专栏地址 目录 1. 简介 2. 关于RPC 2.1 什么是RPC 2.2 RPC有什么用 2.3 RPC的框架有哪些 2.3.1 服务治理 ...
- python 服务端与c++客户端通讯_[原创]python socket 服务端 与 c++客户端通讯,发包内容加密,支持大文件,并发...
代码经过网络搜索,综合算是原创吧.py脚本为服务端 项目文件在 https://github.com/jinjie412/service_client_socket import socketserv ...
- angular2 组件之间通讯-使用服务通讯模式 2016.10.27 基于正式版ng2
工作中用到ng2的组件通讯 奈何官方文档言简意赅 没说明白 自己搞明白后 整理后分享下 rxjs 不懂的看这篇文章 讲很详细 http://www.open-open.com/lib/view/ope ...
- python restful服务部署_用python为mysql实现restful接口
编辑推荐: 本文来自于朱念洋 ,文中针对游戏服务层的案例详细介绍的,代码描述详细. 最近在做游戏服务分层的时候,一直想把mysql的访问独立成一个单独的服务DBGate,原因如下: 请求收拢到DBGa ...
- python 服务注册_将python程序注册为Ubuntu系统服务,并开机启动的方法。
一.系统环境 操作系统:ubuntu 18 (该版本已默认使用systemd作为init) python版本:3.6 二.步骤 (一)准备python程序 1.在 /usr/bin/ 下新建pytho ...
- python云计算服务_阿里云python 云计算
阿里云python 云计算 云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure as a Serv ...
最新文章
- 软件测试--测试Demo
- 简单扩展shiro 实现NOT、AND、OR权限验证(支持复杂一点的表达式)
- 今日arXiv精选 | 18篇近期值得关注的Transformer工作
- 不使用物理引擎,自己动手做真实物理的模拟投篮游戏
- css flex布局
- 总结几个与模块相关的命令
- FreeRTOS 教程指南 学习笔记 第六章 中断管理(二)
- 使用 webSocket 连接菜鸟打印(并获取当前电脑连接的打印机信息)
- Unity TexMeshPro中文字体
- LabVIEW的VISA函数串口数据采集例子——温度采集系统
- Cocos2d-js 音乐or音效
- 面向未来的100项颠覆性创新技术!欧盟重磅报告
- 谢国忠:2012年股市、楼市泡沫终将破灭
- 相似图像识别算法是什么,机器图像识别常用算法
- java权限控制是什么_Java访问权限控制的重要性深入讲解
- AirPods 2支持无限充电只要15分钟充满
- 【第29题】有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数
- 粗浅地浏览一下,待明日来嘞,认真去刷!
- centos 拨号上网
- 【程序人生】读出社会两年后的工作感受有感