当前位置: 首页 > news >正文

(四)ROS通信编程——服务通信

前言

学完了话题通信其实操作流程基本都已经很熟悉了,因此服务通讯的学习就会流畅许多。

服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。比如如下场景:机器人巡逻过程中,控制系统分析传感器数据发现可疑物体或人... 此时需要拍摄照片并留存。在上述场景中,就使用到了服务通信。类似于计算机网络的C/S模型一个节点需要向相机节点发送拍照请求,相机节点处理请求,并返回处理结果

服务通信更适用于对时时性(遇到需要拍照的地方就执行)有要求、具有一定逻辑处理的应用场景。用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景

服务编程通信:请求响应模式

1.服务通信的理论模型

1.演员列表

Ⅰ.管理者:roscore核心(114平台)

Ⅱ.服务端:(维修公司)

Ⅲ.客户端 :(俺)

2.流程

master根据话题实现client和server之间的连接的过程,master起到媒介的应用。

Ⅰ.维修平台(server)向中介平台(master)注册自己的信息(话题--疏通下水道+公司联系方式--RPC地址)。

Ⅱ.我(client)向中介平台(master)注册自己所需要的服务(话题--疏通下水道)。

Ⅲ.中介公司(master)进行话题匹配,并将服务端的联系方式(RPC地址)相应给我(客户端)。

Ⅳ.我打电话给保洁公司。

Ⅴ.保洁公司到我家修马桶(TCP)。

3.注意

Ⅰ.和话题通信相比较,应该保证服务端是先启动的,客户端是后请求的。

Ⅱ.服务端和客户端都可以有多个。

Ⅲ.流程被封装,只需要调用即可。

Ⅳ.也用到了话题,要保证话题相同。

2.服务通信自定义服务消息(srv)

1.需求

服务通信中,客户端提交两个整数至服务端,服务端求和并响应结果到客户端,请创建服务器与客户端通信的数据载体。

2.流程

srv 文件内的可用数据类型与 msg 文件一致,且定义 srv 实现流程与自定义 msg 实现流程类似:

按照固定格式创建srv文件——>编辑配置文件——>编译生成中间文件

3.具体实现

为了熟悉前边的操作这里建议从创建工作空间开始操作,具体细节就不展示了,如果从头认真过一遍都能理解下面的操作。

创建一个工作空间、对其初始化、对其进行编译、源码空间中创建一个功能包、创建自定义的服务消息

1.消息的内容:

在功能包plumbing_server_client下创建文件夹srv并创建文件addints.srv,填入如下内容;

int32 num1
int32 num2
---
int32 sum

服务消息分为两部分:请求部分(2个整形数字)和相应部分(1个整形数字)。三个杠是请求与响应的交界线 

2.编译配置文件package.xml
  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
3.编译配置文件CmakeLists.txt
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
## Generate services in the 'srv' folderadd_service_files(FILESaddints.srv)
## Generate added messages and services with any dependencies listed heregenerate_messages(DEPENDENCIESstd_msgs)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES plumbing_server_clientCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
4.编译catkin_make
5.生成的文件

3.实现服务通信(c++)

在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:服务端、客户端、数据。

流程:编写服务端实现;编写客户端实现;编辑配置文件;编译并执行

1.vscode的配置

pwd获取路径添加json文件中。

我自己的路径:/home/lvl/demo01_ws/devel/include/plumbing_server_client

2.创建服务端

1.创建一个实例

功能包源码空间下创建一个实例(demo01_server.cpp):

#include "ros/ros.h"
#include"plumbing_server_client/addints.h"
/*
服务端实现:解析客户端提交的数据,并运算再产生响应
1.包含相关头文件
2.初始化ros节点
3.创建节点句柄
4.创建服务对象
5.处理请求并产生响应
6.spin()
*/bool doNums(plumbing_server_client::addints::Request & request,plumbing_server_client::addints::Response &response)             //返回bool值,表明成功或者失败
{//1.处理请求int num1 = request.num1;int num2 = request.num2;ROS_INFO("收到的请求数据为:num1=%d,num2=%d",num1,num2);//2.组织响应int sum = num1+num2;response.sum = sum;ROS_INFO("求和结果为%d",sum);return true;
}int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"heishui");     //节点名称唯一ros::NodeHandle nh;ros::ServiceServer server = nh.advertiseService("addInts",doNums);  //话题名称、回调函数ros::spin();return 0;
}
2.配置CmakeLists.txt文件
3.编译catkin_make
4.运行可执行文件
5.测试是否运行成功(新操作)
rosservice call 话题 空格 Tab补齐

3.创建一个客户端
1.创建一个实例

功能包源码空间下创建一个实例(demo01_client.cpp):

#include "ros/ros.h"
#include "plumbing_server_client/addints.h"
/*
客户端:提交两个数据,处理响应结果
1.包含相关头文件
2.初始化ros节点
3.创建节点句柄
4.创建客户端对象
5.提交请求并产生响应
*/int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"daBao");ros::NodeHandle nh;ros::ServiceClient client = nh.serviceClient<plumbing_server_client::addints>("addInts");    //话题//5-1组织请求plumbing_server_client::addints ai;ai.request.num1 = 100;ai.request.num2 = 200;//5-2处理响应bool flag = client.call(ai);   //客户端带着ai对象访问服务器if(flag){ROS_INFO("响应成功");//获取sumROS_INFO("响应结果 = %d",ai.response.sum);    //传进去是引用变量}else{ROS_INFO("处理失败.........");}return 0;
}
2.配置CmakeLists.txt文件
3.编译catkin_make
4.运行可执行文件

优化

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。


http://www.mrgr.cn/news/83144.html

相关文章:

  • 2.8寒假作业
  • .yml文件_YAML格式文件
  • Spring Boot统一异常拦截实践指南
  • 【R语言】plyr包和dplyr包
  • SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言
  • 3D gpr仿真
  • Mapper XML 文件纳入 classpath 的解决方案
  • 微信小程序实现登录注册
  • C# 元组
  • 聚类系列 (二)——HDBSCAN算法详解
  • Vue3(一)
  • docker+ffmpeg+nginx+rtmp 拉取摄像机视频
  • vs2022开发.net窗体应用开发环境安装配置以及程序发布详细教程
  • 创建基本的 Electron 应用项目的详细步骤
  • spark汇总
  • 【W800】UART 的使用与问题
  • 电脑硬盘系统迁移及问题处理
  • C# 特性
  • Qt 5.14.2 学习记录 —— 팔 QWidget 常用控件(3)
  • 个人博客搭建(二)—Typora+PicGo+OSS
  • 学习记录:C++基类构造函数的调用:理解和实践
  • selenium+pyqt5自动化工具总结
  • 夯实前端基础之HTML篇
  • 算法 -归并排序
  • 华为OD E卷(100分)50-预订酒店
  • 示波器Oscilloscope的使用方法