ROS学习——通信机制(服务通信)

news/2024/10/18 6:00:36/

 2.2.3 服务通信自定义srv调用A(C++) · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

 068服务通信(C++)3_客户端优化_Chapter2-ROS通信机制_哔哩哔哩_bilibili

一、理论模型

服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。比如如下场景:

机器人巡逻过程中,控制系统分析传感器数据发现可疑物体或人... 此时需要拍摄照片并留存。

在上述场景中,就使用到了服务通信。

  • 一个节点需要向相机节点发送拍照请求,相机节点处理请求,并返回处理结果

与上述应用类似的,服务通信更适用于对时时性有要求、具有一定逻辑处理的应用场景。

1.概念

以请求响应的方式实现不同节点之间数据交互的通信模式。

2.作用

用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。

3.

 二、自定义srv

需求:

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

流程:

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

  • 按照固定格式创建srv文件

  • 编辑配置文件

  • 编译生成中间文件

srv=请求部分+相应部分

1.新建文件并添加功能包

2.按照固定格式创建srv文件

新建文件夹->新建文件(该文件是自定义的服务消息的载体)

 请求与相应部分使用---分割

 3.编辑配置文件

 ②

 ③

 放开注释

 更改名

 ④

添加依赖,放开注释 

⑤ 

放开注释

添加

 4.编译(ctrl+shift+B)

5.生成中间文件

 三、需求分析及vscode配置

1.

需求:

编写服务通信,客户端提交两个整数至服务端,服务端求和并响应结果到客户端。

分析:

在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:

  • 服务端
  • 客户端
  • 数据

流程:

  • 编写服务端实现;
  • 编写客户端实现;
  • 编辑配置文件;
  • 编译并执行。

2.vscode配置

在devel中使用集成终端打开,打印路径,复制路径到c_cpp_properties.json中,修改格式与上文对齐(如果在话题通信中配置就不需要重复操作)

 四、服务方实现

1.新建文件,搭建框架(删除char 后面的const修饰)

 2.包含头文件

3.初始化ROS节点

 4.创建节点句柄

 

5.创建一个服务对象,定义回调函数

 回调函数返回值为bool值

有中文输出需要此函数:

 加上打印语句

6. spin()函数

 7.配置

参数1——要映射的名称,建议和原名称一致

参数2——被执行的cpp源文件名

③ 

 更改为:

 8.编译,测试

(1)roscore

(2)启动服务器端

(3)调用命令测试

 五、客户端实现

1.新建文件夹,搭建框架

2. 包含头文件

3.初始化ROS节点

4.创建节点句柄

 5.创建一个客户端对象

 6.提交请求并处理相应

(1)创建addInts对象

(2)组织请求 

(3)处理响应

有中文输出,使用该函数,否则乱码: 

  

 7.配置

① 

② 

8.编译

9.测试

 (1)先运行服务端

rosrun 包名 服务

(2)再运行客户端

rosrun 包名 客户端 参数1 参数2

 10.优化

(1)实现参数的动态提交

获取命令中的参数

argc就是arg count,就是程序的参数个数。argc≥1,这个1是指该函数本身,所以有一个参数的话argc=2,函数本身1+参数1=argc2。

在该例中argc=3,因为第一个参数是程序名,第二个才是12,第三个是34

char* argv[]是一个数组  每个元素都存储一个指针  也就是你传进去参数的地址

  atoi是字符串转成int

(2)解决先启动客户端导致运行失败问题

①方法一

在客户端发送请求前添加:

 ②方法二

 该函数传入参数为被等待的服务

 


http://www.ppmy.cn/news/330632.html

相关文章

JS逆向-搜狗词库加密

今天分析的网站是:https://pinyin.sogou.com/dict/ 加密的接口是这个: https://pinyin.sogou.com/dict/search/search_list/%CD%F5%D5%DF%C8%D9%D2%AB/normal,起初我还以为后面的那一大串是parse.quote()模块生成的,因为确实有点像,后来果然还是我想简单了。 分析一下,全局…

基于人工兔优化算法的函数寻优和工程优化

文章目录 一、理论基础1、人工兔优化算法(1)绕道觅食(探索)(2)随机躲藏(开发)(3)能量收缩(从探索转向开发) 2、ARO算法伪代码 二、仿真实验与结果分析1、函数寻优2、工程优化3、WSN覆盖优化 三、参考文献 一…

光流 | 近十年光流参考文献总结

博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 [1]Bruhn A, Weickert J, Kohlberger T, et al. A Multigrid Platform for Real-Time Motion Computation with Discontinuity-Preserving Variational Metho…

Mac 12 安装VUE 开发环境

1.Vue2.0推荐开发环境 软件功能HomeBrew3.2.3Mac系统下的包管理器,类似于Linux的apt-get,rpmNode.js16.5.0JavaScript 运行环境(runtime),操作系统不能直接运行各种编程语言的,通过Node.js 来解释执行Java…

RecyclerView使用 及 滑动时加载图片优化方案

RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解决防止图片乱序的问题,之前有在网上有看到大神对Android中ListView异步加载图片乱…

matlab由公式绘制根轨迹步骤,第4章利用MATLAB绘制系统根轨迹.doc

第4章利用MATLAB绘制系统根轨迹 第4章 利用MATLAB绘制系统根轨迹 一、 利用MATLAB绘制系统根轨迹相关知识 假设闭环系统中的开环传递函数可以表示为: 则闭环特征方程为: 特征方程的根随参数K的变化而变化,即为闭环根轨迹。控制系统工具箱中提供了rlocus()函数,可以用来绘制…

RecyclerView 实现横向滚动效果

我相信很久以前,大家在谈横向图片轮播是时候,优先会选择具有HorizontalScrollView效果和ViewPager来做,不过自从Google大会之后,系统为我们提供了另一个控件RecyclerView。RecyclerView是listview之后的又一利器,它可以…

电商零售交易数据分析

1、项目背景 以英国的在线电子零售公司的跨国交易数据集作为分析样本,通过对该公司的运营指标统计分析以及构建RMF模型、K-Means机器学习算法从大量的电子零售交易数据中分析并找出价值用户,针对价值用户提供以消费者为中心的智能商业模式。 2、数据详…