ROS学习笔记(六)---服务通信机制
1. 服务通信是什么
在ROS中,服务通信机制是一种点对点的通信方式,用于节点之间的请求和响应。它允许一个节点(服务请求方)向另一个节点(服务提供方)发送请求,并等待响应。
服务通信机制在ROS中使用以下两个概念:
服务(Service):服务是一种在ROS中定义的一对相关消息类型,包括请求消息和响应消息。请求消息用于向服务提供方发送请求,而响应消息用于服务提供方返回响应给请求方。
服务节点(Service Node):服务节点是一个ROS节点,它提供了一个或多个服务。服务节点注册自己提供的服务,并等待来自其他节点的请求。一旦接收到请求,服务节点执行相应的操作,并将响应发送回请求方。
下面是服务通信的基本流程:
-
服务定义
首先,需要在ROS中定义一个服务,包括请求消息和响应消息的格式。这可以使用ROS的消息描述语言(如.srv文件)来完成。 -
服务节点注册
服务提供方节点将自己注册为一个服务节点,并指定所提供的服务类型。 -
请求发送
服务请求方节点创建一个请求消息实例,并将其发送到服务提供方节点。 -
请求处理
服务提供方节点接收到请求消息后,执行相应的操作,可能包括计算、处理数据等。 -
响应发送
服务提供方节点生成一个响应消息,并将其发送回请求方节点。 -
响应接收
请求方节点接收到响应消息后,可以根据需要进行后续处理。
下面以打车的案例简单描述ROS中服务通信机制的场景:
(1)Master(管理者):Master是滴滴打车平台的中央控制器,负责协调和管理打车服务请求。在这个案例中,滴滴打车的后台系统可以充当Master的角色。它接收乘客的打车请求,处理请求并将其分派给合适的司机。
(2)Server(司机):Server指的是滴滴打车平台上的司机角色。他们是提供车辆和打车服务的实际执行者。当Master将乘客的打车请求分派给司机时,司机将接收到请求并决定是否接受该请求。
(3)Client(乘客):Client是需要使用滴滴打车服务的乘客。在这个案例中,乘客作为Client,他们使用滴滴打车应用程序来请求打车服务。乘客通过应用程序选择目的地、车型等选项,并发起打车请求。

上图参考了赵虚左老师的课程
2. 服务通信有什么用
以下是一些常见的ROS服务通信应用举例:
(1)传感器数据请求:在一个机器人系统中,可以使用服务通信来请求特定传感器(如摄像头、激光雷达)的数据。例如,一个节点可以向摄像头节点发送请求,要求获取当前的图像数据。
(2)控制指令发送:通过服务通信,可以向执行器节点发送控制指令,控制机器人的运动或执行特定任务。例如,一个导航节点可以向底盘控制节点发送请求,要求机器人移动到特定位置。
(3)参数配置和调整:服务通信可用于动态地配置和调整节点的参数。例如,在机器人系统中,可以使用服务通信来请求更改底盘控制节点的运动速度或其他参数,以适应不同的任务需求。
(4)数据处理和计算:通过服务通信,可以请求进行特定的数据处理或计算操作。例如,一个节点可以向图像处理节点发送请求,要求对图像进行特定的算法处理,如目标识别或图像滤波。
(5)任务协作和分布式计算:在多机器人系统中,可以使用服务通信来实现任务的协作和分布式计算。不同机器人节点可以通过服务通信交换任务信息、共享计算结果,并相互协作完成复杂的任务。
3.编写服务通信(客户端-服务端)的python案例
(1)任务要求
实现简单的整数加法运算。客户端提交两个数据至服务端,服务端相应之后将求和结果发送至客户端。
(2)流程
① 编写服务消息文件srv文件。(注意:与话题通信的不同,为了实现服务通信,需要定义服务消息类型,服务消息文件(.srv)描述了请求和响应的消息格式。服务服务器根据服务消息文件生成服务接口,服务客户端使用该接口与服务服务器进行通信。因此在编写客户端和服务端的python程序之前,我们需要先编写好服务消息文件。)
② 编写客户端和服务端的python程序。
(3)编程实现流程
① 创建功能包(默认继续在之前ROS学习笔记(二)上新建功能包server_client,然后新建一个scripts文件夹,用来编写python的服务通信程序,再新建一个srv文件,新建好之后如下图。
② 定义srv文件
- 按照固定格式创建srv文件
在srv文件夹下新建文件AddTwoInts.srv。也就是我们的服务消息srv文件)

编辑文件的内容如下。
# AddTwoInts.srv
int64 a
int64 b
---
int64 sum
- 编辑配置文件
1)在package.xml中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>

2)在CMakeLists.txt编辑 srv 相关配置
第一处:
message_generation

第二处:要改成你srv文件名
AddTwoInts.srv

第三处:
generate_messages(DEPENDENCIESstd_msgs
)

- 编译之后生成中间文件(编译 crtl + shift +b)

这样就完成服务消息srv的创建了。接下来来时编写服务通信的程序
(4)编写服务端和客户端的程序
① 我们在创建好的script文件内,继续创建add_two_ints_server.py和add_two_ints_client.py的Python文件。
- 服务端实现:
#!/usr/bin/env python
#coding:utf-8
#上面的coding:utf-8是放置程序有中文报错的
import rospy
from server_client.srv import AddTwoInts, AddTwoIntsResponsedef handle_add_two_ints(req):result = req.a + req.brospy.loginfo("Received request: %d + %d = %d", req.a, req.b, result)return AddTwoIntsResponse(result)def add_two_ints_server():rospy.init_node('add_two_ints_server')rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)rospy.loginfo("Ready to add two ints.")rospy.spin()if __name__ == '__main__':add_two_ints_server()
- 客户端实现:
#!/usr/bin/env python
#coding:utf-8
import rospy
from server_client.srv import AddTwoInts, AddTwoIntsRequest
import sysdef add_two_ints_client(x, y):rospy.wait_for_service('add_two_ints')try:add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)req = AddTwoIntsRequest()req.a = xreq.b = yresp = add_two_ints(req)return resp.sumexcept rospy.ServiceException as e:rospy.logerr("Service call failed: %s", str(e))if __name__ == '__main__':rospy.init_node('add_two_ints_client')x = int(sys.argv[1])y = int(sys.argv[2]) result = add_two_ints_client(x, y)rospy.loginfo("%d + %d = %d", x, y, result)
② 打开python可执行权限,然后编辑配置文件CMakeLists.txt


(5)查看实现的效果

② 通过计算图查看发布订阅模式的节点
在上述两个程序运行的情况下,在打开一个新的终端,输入:rqt_graph,就可以查看节点关系

可以看到计算图中,左边“/fangdong”是我们的发布方节点,右边“/dagongren”就是我们的订阅方节点,他们通过“fangzi”这个话题来搭建通信。](https://img-blog.csdnimg.cn/7b8ec8ed28314d618814104df5cb683e.png)
相关文章:
ROS学习笔记(六)---服务通信机制
1. 服务通信是什么 在ROS中,服务通信机制是一种点对点的通信方式,用于节点之间的请求和响应。它允许一个节点(服务请求方)向另一个节点(服务提供方)发送请求,并等待响应。 服务通信机制在ROS中…...
常见的C/C++开源QP问题求解器
1. qpSWIFT qpSWIFT 是面向嵌入式和机器人应用的轻量级稀疏二次规划求解器。它采用带有 Mehrotra Predictor 校正步骤和 Nesterov Todd 缩放的 Primal-Dual Interioir Point 方法。 开发语言:C文档:传送门项目:传送门 2. OSQP OSQP&#…...
前端axios发送请求,在请求头添加参数
1.在封装接口传参时,定义形参,params是正常传参,name则是我想要在请求头传参 export function getCurlList (params, name) {return request({url: ********,method: get,params,name}) } 2.接口调用 const res await getCurlList(params,…...
CTF Misc(3)流量分析基础以及原理
前言 流量分析在ctf比赛中也是常见的题目,参赛者通常会收到一个网络数据包的数据集,这些数据包记录了网络通信的内容和细节。参赛者的任务是通过分析这些数据包,识别出有用的信息,例如登录凭据、加密算法、漏洞利用等等 工具安装…...
Telink泰凌微TLSR8258蓝牙开发笔记(二)
在开发过程中遇到了以下问题,记录一下 1.在与ios手机连接后,手机app使能notify,设备与手机通过write和notify进行数据交换,但是在连接传输数据一端时间后,设备收到write命令后不能发出notify命令,打印错误…...
vue3+elementPlus:el-tree复制粘贴数据功能,并且有弹窗组件
在tree控件里添加contextmenu属性表示右键点击事件。 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置。 //html <div class"box-list"><el-tree ref"treeRef" node-key"id…...
JTS:10 Crosses
这里写目录标题 版本点与线点与面线与面线与线 版本 org.locationtech.jts:jts-core:1.19.0 链接: github public class GeometryCrosses {private final GeometryFactory geometryFactory new GeometryFactory();private static final Logger LOGGER LoggerFactory.getLog…...
MySQL中的SHOW FULL PROCESSLIST命令
在MySQL数据库管理中,理解和监控当前正在执行的进程是至关重要的一环。MySQL提供了一系列强大的工具和命令,使得这项任务变得相对容易。其中,SHOW FULL PROCESSLIST命令就是一个非常有用的工具,它可以帮助我们查看MySQL服务器中的…...
VsCode 常见的配置、常用好用插件
1、自动保存:不用装插件,在VsCode中设置一下就行 2、设置ctr滚轮改变字体大小 3、设置选项卡多行展示 这样打开了很多个文件,就不会导致有的打开的文件被隐藏 4、实时刷新网页的插件:LiveServer 5、open in browser 支持快捷键…...
深度学习问答题(更新中)
1. 各个激活函数的优缺点? 2. 为什么ReLU常用于神经网络的激活函数? 在前向传播和反向传播过程中,ReLU相比于Sigmoid等激活函数计算量小;避免梯度消失问题。对于深层网络,Sigmoid函数反向传播时,很容易就…...
JavaScript 笔记: 函数
1 函数声明 2 函数表达式 2.1 函数表达式作为property的value 3 箭头函数 4 构造函数创建函数(不推荐) 5 function 与object 5.1 typeof 5.2 object的操作也适用于function 5.3 区别于⼀般object的⼀个核⼼特征 6 回调函数 callback 7 利用function的pr…...
2023NOIP A层联测9-天竺葵
天竺葵/无法阻挡的子序列/很有味道的题目 我们称一个长度为 k k k 的序列 c c c 是好的,当且仅当对任意正整数 i i i 在 [ 1 , k − 1 ] [1,k-1] [1,k−1] 中,满足 c i 1 > b i c i c_{i1}>b_i \times c_i ci1>bici, …...
react antd table表格点击一行选中数据的方法
一、前言 antd的table,默认是点击左边的单选/复选按钮,才能选中一行数据; 现在想实现点击右边的部分,也可以触发操作选中这行数据。 可以使用onRow实现,样例如下。 二、代码 1.表格样式部分 //表格table样式部分{…...
【VUEX】最好用的传参方式--Vuex的详解
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于VuexElementUI的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Vuex是什么 1.定义 2…...
【.net core】yisha框架 SQL SERVER数据库 反向递归查询部门(子查父)
业务service.cs中ListFilter方法中内容 //反向递归查询部门列表List<DepartmentEntity> departmentList await departmentService.GetReverseRecurrenceList(new DepartmentListParam() { Ids operatorInfo.DepartmentId.ToString() });if (departmentList ! null &am…...
java处理时间-去除节假日以及双休日
文章目录 一、建表:activity_holiday_info二、java代码1、ActivitityHolidayController.java2、ActivityHolidayInfoService.java3、ActivityHolidayInfoServiceImpl.java 三、测试效果 有些场景需要计算数据非工作日的情况,eg:统计每个人每月工作日签到…...
快讯|Tubi 有 Rabbit AI 啦
在每月一期的 Tubi 快讯中,你将全面及时地获取 Tubi 最新发展动态,欢迎星标关注【比图科技】微信公众号,一起成长变强! Tubi 推出 Rabbit AI 帮助用户找到喜欢的视频内容 Tubi 于今年九月底推出了 Rabbit AI,这是一项…...
Zookeeper从入门到精通
Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。 目录 01-Zookeeper特性与节点数据类型详解02-Z…...
10.11作业
多继承代码实现沙发床 #include <iostream>using namespace std;class Sofa {private:int h;public:Sofa() {cout << "Sofa无参构造" << endl;}Sofa(int h): h(h) {cout << "Sofa有参构造" << endl;}Sofa(const Sofa& …...
如何对比github中不同commits的区别
有时候想要对比跨度几十个commits之前的代码区别,想直接使用github的用户界面。可以直接在官网操作。 示例 首先要创建一个旧commit的branch。进入该旧的commit,然后输入branch名字即可。 然后在项目网址后面加上compare即可对比旧的branch和新的bran…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
