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.mzph.cn/web/65458.shtml

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

相关文章

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

2024年12月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年12月15日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

【网络协议】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我们学习了 IPv4 地址的分配方式&#xff0c;了解了各种类型的 IPv4 地址&#xff0c;并进行了基础的子网划分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我们将继续学习子网划分&#xff0c;并引入一些新的概念。 【网络…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

7z 安装与使用指南

文章目录 1. 安装 7z1.1 在 Linux 上安装 7z对于 Debian/Ubuntu 系统&#xff1a;对于 CentOS/RHEL 系统&#xff1a;对于 Fedora 系统&#xff1a;对于 Arch Linux 系统&#xff1a; 1.2 在 Windows 上安装 7z 2. 使用 7z 进行压缩和解压2.1 压缩文件示例&#xff1a;压缩一个…

scanf:数据之舟的摆渡人,静卧输入港湾的诗意守候

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节我们主要来学习scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和赋值…

【ROS2】Arduino系列之电机驱动实现

内容学自&#xff1a;赵虚左老师。学后总结&#xff01; 实现机器人移动的一种策略是&#xff1a;控制系统会先发布预期的车辆速度信息&#xff0c;然后驱动系统订阅到该信息&#xff0c;不断调整电机转速直至达到预期速度&#xff0c;调速过程中还需要时时获取实际速度并反馈…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1&#xff1a;jenkins中如何配置npm的源 提问2&#xff1a;jenkins pipeline 类型为pipeline script from SCM时&#xff0c;如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…

常见的开源网络操作系统

常见的开源网络操作系统有很多,它们通常用于路由器、交换机、网络设备和服务器等场景,具有灵活、可定制、易于扩展的特点。以下是一些常见的开源网络操作系统: OpenWRT 用途:主要用于路由器、无线接入点和网络设备。提供了广泛的定制选项和高级功能,如防火墙配置、VPN 支持…

Java 日期时间格式化标准

文章目录 Java日期时间格式化符号ISO 8601中的日期时间ISO 8601标准的定义ISO 8601日期时间格式 周数年份ISO 8601中的周数年份Java中的周数年份 Java跨年日期格式化BUG注意事项 Java日期时间格式化符号 JDK官网截图&#xff1a; 格式化符号梳理&#xff1a; 符号描述符号用…

【2024华为OD-E卷-200分-数值同化】(题目+思路+JavaC++Python解析)

题目描述 题目名称&#xff1a;数值同化 题目背景&#xff1a; 在一个数值同化过程中&#xff0c;你需要将一组数值进行特定的处理&#xff0c;使得它们能够“同化”到一个目标值附近。具体做法是&#xff0c;给定一个数组 nums 和一个目标值 target&#xff0c;你需要对数组…

【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 结课测试

目录 一 单选 二 多选 三 判断 四 填空 一 单选 1 一张图片在存放过程中出现了很多小的噪声&#xff0c;或白或黑&#xff0c;对其扫描进行以下哪一个操作的去噪效果最好&#xff1f; A.均值滤波 B.中值滤波 C.高斯滤波 D.拉普拉斯滤波 2 以下哪个方法中使用了掩码语…

ESP32-S3模组上实现低功耗(6)

接前一篇文章:ESP32-S3模组上实现低功耗(5) 本文内容参考: 系统低功耗模式介绍 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 电源管理 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档

chrome浏览器的更新提示弹窗无法更新Chrome解决方法

使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本&#xff0c;家庭版系统没有组策略功能。 按下Win R键&#xff0c;打开 “运行” 对话框&#xff0c;输入gpedit.msc并回车&#xff0c;打开组策略编辑器。 在组策略编辑器中&#xff0c;依次展开 “计算机…

高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解

在高山旅游景区&#xff0c;传统的物资运输方式往往面临人力成本高昂、效率低下等问题&#xff0c;而无人机技术的引入为这一难题提供了新的解决方案。以下是对无人机从山下到山上进行物资吊运技术的详细解析&#xff1a; 一、无人机物资吊运技术的优势 1. 降低人力成本&#…

读博生涯记录2 __ 2025.1.8 --- 关于博一上学期的一些经历和感受

时间过得好快&#xff0c;2024年8月底入学至今都快半年了。学校已经放寒假了&#xff0c;我也计划过多几天就回去&#xff0c;在这个太阳早已落山的午后&#xff0c;在这工位区的一隅&#xff0c;想着记录一下本学期我的一些经历和感受。 专业上&#xff1a;本学期我给自己的规…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

2501d,d17年前就有了编译时

D在17年前就有了编译时!D功能稳步进入其他语言. :此处的编译时关键字指示在编译时运行它前面的块. D不使用关键字来触发它.触发它的是"常 式".当然,必须在编译时可计算常式.如: int sum(int a, int b) > a b; void test() {int s sum(3, 4); //在运行时运行,e…

Taro地图组件和小程序定位

在 Taro 中使用腾讯地图 1.首先在项目配置文件 project.config.json 中添加权限&#xff1a; {"permission": {"scope.userLocation": {"desc": "你的位置信息将用于小程序位置接口的效果展示"}} }2.在 app.config.ts 中配置&#x…

深度学习——回归实战

线性回归&#xff1a; 线性&#xff1a;自变量和应变量之间是线性关系&#xff0c;如&#xff1a;y wx b 回归&#xff1a;拟合一条曲线&#xff0c;使真实值和拟合值差距尽可能小 目标&#xff1a;求解参数w和b 所用算法&#xff1a;梯度下降算法 梯度下降&#…