【ROS入门】使用 ROS 服务(Service)机制实现同步请求与答复

文章结构

  • 任务要求
  • 话题模型
  • 实现步骤
    • 自定义srv
      • 定义srv文件
      • 编辑配置文件
      • 编译
    • 自定义srv调用
      • vscode配置
      • 编写服务端实现
      • 编写客户端实现
    • 执行
      • 启动roscore
      • 编译
      • 启动客户端和服务端
        • 编译
        • 启动roscore
        • 启动节点

任务要求

编写代码实现 ROS 中的服务请求与答复:

  • 创建服务端,注册 Service
  • 当服务端收到客户端 Service 请求(携带整型参数 a,b)后服务端返回 a,b 的和给客户端
  • 客户端输出结果。

话题模型

在这里插入图片描述
ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。

实现步骤

自定义srv

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

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

  2. 编辑配置文件

  3. 编译生成中间文件

定义srv文件

进入工作空间,在src文件夹下创建新的功能包:

在这里插入图片描述

在新的功能包中创建名为srv的文件夹,并在该文件夹中创建srv文件,这里将其命名为addInts.srv:

在这里插入图片描述

服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用—分割,具体实现如下:

# 客户端请求时发送的两个数字
int32 a
int32 b
---
# 服务器响应发送的数据
int32 sum

注意,行末不要打分号

编辑配置文件

package.xml中添加编译依赖与执行依赖

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

在这里插入图片描述

CMakeLists.txt编辑 srv 相关配置:

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
# 需要加入 message_generation,必须有 std_msgs

在这里插入图片描述

add_service_files(FILESaddInt.srv
)

由于在srv文件内使用的数据类型都是基于标准消息的,即依赖于standard_messages,故有了下面的修改:

generate_messages(DEPENDENCIESstd_msgs
)

在这里插入图片描述
前面的find_package是指创建的功能包所依赖的包,而catkin_package是指find_package所依赖的包:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES service_demoCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

在这里插入图片描述

编译

命令行中:

$ catkin_make

或者在vscode中:ctrl+shift+B:

在这里插入图片描述

自定义srv调用

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

vscode配置

找到devel/include的路径
在这里插入图片描述
在.vscode中的c_cpp_properties.json中修改

{"configurations": [{"browse": {"databaseFilename": "","limitSymbolsToIncludedHeaders": true},"includePath": ["/opt/ros/noetic/include/**","/usr/include/**","/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径 ],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "c++17"}],"version": 4
}

在这里插入图片描述

编写服务端实现

编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器。服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,客户端再解析。

//1.头文件
#include "ros/ros.h"
#include "service_demo/addInt.h"    //该头文件名字和srv文件一致//5.处理请求并产生响应
bool doNums(service_demo::addInt::Request &request,service_demo::addInt::Response &response)   //请求对象和响应对象以参数的方式传入
{//1.处理请求int a = request.a;int b = request.b;ROS_INFO("收到的请求数据:a = %d, b = %d",a,b);//2.组织响应int sum = a+b;response.sum = sum;ROS_INFO("求和结果: sum = %d",sum);return true;
}
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");//2.初始化ROS节点ros::init(argc,argv,"addInt_Server");   //节点名称需要保持唯一//3.创建ROS句柄ros::NodeHandle n;//4.创建服务对象//参数1为话题名称/主题名称,用于将服务端和客户端关联在一起//参数2是一个回调函数,用于处理请求,返回值为布尔类型ros::ServiceServer server = n.advertiseService("addInt",doNums);   //6.多请求,需要调用ros::spin()ros::spin();return 0;
}

随后在CMakeLists进行编译设置修改:

在这里插入图片描述

编写客户端实现

实现参数的动态提交:

  1. 格式:rosrun xxxx xxxx 12 34
  2. 节点执行时,需要获取命令中的参数,并组织进request
// 1.包含头文件
// 1.包含头文件
#include "ros/ros.h"
#include "service_demo/addInt.h"int main(int argc, char *argv[])
{//如果输入的参数个数不对,会进行提示。argc为传入参数的个数。argv[]为参数的数组if(argc != 3){ROS_INFO("提交的参数个数不对");return 1;}setlocale(LC_ALL,"");// 2.初始化 ROS 节点ros::init(argc,argv,"addInt_Client");// 3.创建 ROS 句柄ros::NodeHandle n;// 4.创建 客户端 对象ros::ServiceClient client = n.serviceClient<service_demo::addInt>("addInt");// 5.组织请求数据service_demo::addInt ai;//5-1.组织请求//从argv数组中提取参数,将字符串类型转为整形ai.request.a = atoi(argv[1]);ai.request.b = atoi(argv[2]);//5-2.处理响应//调用判断服务器状态的函数,用于等待服务//函数1client.waitForExistence();//函数2// ros::service::waitForService("addInt");//客户端请求服务器bool flag = client.call(ai);if (flag){ROS_INFO("响应成功");//获取结果ROS_INFO("响应结果 = %d",ai.response.sum);}else{ROS_ERROR("请求处理失败....");return 1;}return 0;
}

随后在CMakeLists文件中修改配置:

在这里插入图片描述

执行

启动roscore

$ roscore

在这里插入图片描述

编译

命令行中:

$ catkin_make

或者在vscode中:ctrl+shift+B:

在这里插入图片描述

启动客户端和服务端

编译
$ catkin_make

在这里插入图片描述

启动roscore
$ roscore
启动节点
$ source ./devel/setup.bash
$ service_demo service_demo_server_c

再开一个终端

$ source ./devel/setup.bash
$ rosrun rosrun service_demo service_demo_client_c 10 10

效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141927.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

YZ09: VBA_Excel之读心术

【分享成果&#xff0c;随喜正能量】多要求自己&#xff0c;你会更加独立&#xff0c;少要求别人&#xff0c;你会减少失望&#xff0c;宁愿花时间去修炼 不完美的自己&#xff0c;也不要浪费时间去期待完美的别人&#xff01;。 我给VBA下的定义&#xff1a;VBA是个人小型自动…

uni-app:实现元素中实现竖直居中

效果展示 前&#xff1a; 后&#xff1a; 未实现前代码 <template><view class"container"><view class"centered-element">我是要被居中的元素</view></view> </template><script>export default {data() {r…

56块钱搭建一个ubuntu 2204 linux 服务器

硬件pdd上淘的一个linux小盒子 应该是以前的机顶盒之类的 实物图如下 今天刚收到小盒子 找了个显示器 键盘 查到小盒子上通电 本来指示灯应该亮的 老板刷机之后 led灯都不亮了 不知道有没有开机 我还以为坏了 刚开始 然后直接连到显示器上 有输出 那说明没问题…

MySQL-树型结构数据查询

表结构 进行树形结构查询&#xff0c;利用特殊语法进行操作 with recursive t as(select parent_id , business_namefrom business_line where id 21union allselect a.parent_id, a.business_namefrom business_line a join t on a.id t.parent_id) select business_name f…

OpenCV两张图片实现稀疏点云的生成

1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式是一个较为复杂的方式&#xff0c;需要使用棋盘进行定位获得&#xff0c;我们这里直接使用了 OpenMVG 提…

网络编程-UDP协议(发送数据和接收数据)

需要了解TCP协议的&#xff0c;可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 TCP/IP参考模型 通过此图&#xff0c;可以了解UDP所在哪一层级中 代码案例 发送数据 package com.hidata.devops.paas.udp;import java.io.IOException; …

HTML+CSS综合案例二:CSS简介

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title> CSS简介</title><style>h1{color: #33…

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久&#xff0c;Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送&#xff0c;Midjourney 会根据该图像生成四种可…

机器学习小白理解之一元线性回归

关于机器学习&#xff0c;百度上一搜一大摞&#xff0c;总之各有各的优劣&#xff0c;有的非常专业&#xff0c;有的看的似懂非懂。我作为一名机器学习的门外汉&#xff0c;为了看懂这些公式和名词真的花了不少时间&#xff0c;还因此去着重学了高数。 不过如果不去看公式&…

渗透测试信息收集方法和工具分享

文章目录 一、域名收集1.OneForAll2.子域名挖掘机3.subdomainsBurte4.ssl证书查询 二、获取真实ip1.17CE2.站长之家ping检测3.如何寻找真实IP4.纯真ip数据库工具5.c段&#xff0c;旁站查询 三、端口扫描1.端口扫描站长工具2.masscan(全端口扫描)nmap扫描3.scanport4.端口表5.利…

短信登录功能如何实现?

简介&#xff1a; 在日常生活中我们登录/注册某些网站/APP是通常可以选择 密码登录和手机号登录。 为什么手机号发送后会有验证码返回呢&#xff1f; 网站如何识别我的验证码是否正确&#xff1f; 如果我的个人网站也想要实现短信登录功能&#xff0c;具体该如何实现&#xff1…

GiliSoft USB Lock v10.5.0 电脑USB设备管控软件

网盘下载 软件功能特性 禁止USB / SD驱动器 禁用从USB / SD磁盘读取&#xff0c;禁用写入USB / SD磁盘&#xff0c;阻止非系统分区。它不允许任何类型的USB / SD驱动器访问您的计算机&#xff0c;除非您授权它或它已在可信设备白名单。 CD锁&#xff0c;块媒体和蓝光光盘 禁用…

混合Rollup:探秘 Metis、Fraxchain、Aztec、Miden和Ola

1. 引言 混合Rollup为新的以太坊L2扩容方案&#xff0c;其分为2大类&#xff1a; 将乐观与ZK技术结合的混合Rollup同时支持公开智能合约 和 私人智能合约 的混合Rollup 本文将重点关注Metis、Fraxchain、Aztec、Miden和Ola这五大项目。 2. 何为混合Rollup&#xff1f; 混合…

ADC数模转化器

简介 • ADC &#xff08; Analog-Digital Converter &#xff09;模拟 - 数字转换器 • ADC 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 • 12 位逐次逼近型 ADC &#xff0c; 1us 转换时间 &#xff08;12位:分辨率…

pycharm中配置torch

在控制台cmd中安装好torch后&#xff0c;在pycharm中使用torch&#xff0c;需要进行简单设置即可。 在pycharm中新建一个工程&#xff0c;在file文件中打开setting 在setting中找到project interpreter编译器 找到conda environment的环境配置&#xff0c;设置好相应的目录 新…

1688-阿里巴巴批发网(获取商品的名称,价格,图片)

1688 item_get-获得1688商品详情 为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个1688 应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载1688 API的SDK并掌握基本的API基础…

VSCode 和 CLion

文章目录 一、VSCode1、文档2、插件3、智能编写4、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff09;传参 &#xff08;3&…

MAC word 如何并列排列两张图片

系统&#xff1a;MAC os 参考博客 https://baijiahao.baidu.com/s?id1700824516945958911&wfrspider&forpc 步骤1 新建一个word文档和表格 修改表格属性 去掉自动重调尺寸以适应内容 插入图片 在表格的位置插入对应的图片如下 去除边框 最终结果如下

数据链路层协议

文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…

Unity之Hololens开发如何实现UI交互

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…