服务通讯

  • 前言
  • 理论模型
  • 自定义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相关推荐

  1. python写一个服务_写一个Python的windows服务

    1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...

  2. 基于订阅的服务通讯架构体系

    说到订阅服务通讯一般都会想到基于队列的消息生产和消费模式,这也是在实际应该中比较常用的方式.一般生产者把消息发送到队列服务中心,然后消费者去中心订阅:然而这种方式需要一个消息服务中心,而在这里所说的订 ...

  3. AbpVnext 微服务 内部网关服务通讯 动态API客户端

    阅读此篇文章之前,你需要对Abpvnext 微服务样例项目<MicroService_Demo>有一定的熟悉度与理解度 文章并没有详细说明远程服务的配置相关,各位可自行查阅官网文档,或者相 ...

  4. 八:对微服务通讯方式RPC vs REST的理解

    微服务专栏地址 专栏:微服务 微服务系列总目录 目录 微服务专栏地址 目录 1. 简介 2. 关于RPC 2.1 什么是RPC 2.2 RPC有什么用 2.3 RPC的框架有哪些 2.3.1 服务治理 ...

  5. python 服务端与c++客户端通讯_[原创]python socket 服务端 与 c++客户端通讯,发包内容加密,支持大文件,并发...

    代码经过网络搜索,综合算是原创吧.py脚本为服务端 项目文件在 https://github.com/jinjie412/service_client_socket import socketserv ...

  6. angular2 组件之间通讯-使用服务通讯模式 2016.10.27 基于正式版ng2

    工作中用到ng2的组件通讯 奈何官方文档言简意赅 没说明白 自己搞明白后 整理后分享下 rxjs 不懂的看这篇文章 讲很详细 http://www.open-open.com/lib/view/ope ...

  7. python restful服务部署_用python为mysql实现restful接口

    编辑推荐: 本文来自于朱念洋 ,文中针对游戏服务层的案例详细介绍的,代码描述详细. 最近在做游戏服务分层的时候,一直想把mysql的访问独立成一个单独的服务DBGate,原因如下: 请求收拢到DBGa ...

  8. python 服务注册_将python程序注册为Ubuntu系统服务,并开机启动的方法。

    一.系统环境 操作系统:ubuntu 18 (该版本已默认使用systemd作为init) python版本:3.6 二.步骤 (一)准备python程序 1.在 /usr/bin/ 下新建pytho ...

  9. python云计算服务_阿里云python 云计算

    阿里云python 云计算 云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure as a Serv ...

最新文章

  1. 软件测试--测试Demo
  2. 简单扩展shiro 实现NOT、AND、OR权限验证(支持复杂一点的表达式)
  3. 今日arXiv精选 | 18篇近期值得关注的Transformer工作
  4. 不使用物理引擎,自己动手做真实物理的模拟投篮游戏
  5. css flex布局
  6. 总结几个与模块相关的命令
  7. FreeRTOS 教程指南 学习笔记 第六章 中断管理(二)
  8. 使用 webSocket 连接菜鸟打印(并获取当前电脑连接的打印机信息)
  9. Unity TexMeshPro中文字体
  10. LabVIEW的VISA函数串口数据采集例子——温度采集系统
  11. Cocos2d-js 音乐or音效
  12. 面向未来的100项颠覆性创新技术!欧盟重磅报告
  13. 谢国忠:2012年股市、楼市泡沫终将破灭
  14. 相似图像识别算法是什么,机器图像识别常用算法
  15. java权限控制是什么_Java访问权限控制的重要性深入讲解
  16. AirPods 2支持无限充电只要15分钟充满
  17. 【第29题】有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数
  18. 粗浅地浏览一下,待明日来嘞,认真去刷!
  19. centos 拨号上网
  20. 【程序人生】读出社会两年后的工作感受有感

热门文章

  1. threejs中设置物体的贴图+场景的6面贴图 +创建空间
  2. HTML——Header:请求头参数详解
  3. 艾宾浩斯遗忘曲线PHP,艾宾浩斯遗忘曲线计划表打印版
  4. 康威生命游戏简易版python_turtle实现
  5. SpringBoot笔记(四)其他框架介绍
  6. 一年中的第几天 哔哩哔哩2020校园招聘笔试题讲解
  7. 函数型数据主成分分析(FPCA)
  8. 平衡左右脑、加强记忆、提高情商……冥想的这些好处你知道吗?
  9. php 只取汉字,php怎么只保留汉字
  10. 杂谈——如何合并两个有序链表(时间复杂度为O(n))