ROS C++ : 通过 ROS Service 实现进程间同步函数调用

news2024/11/30 10:39:12

文章目录

    • 1、基本概念
      • 1.1、官方定义
      • 1.2、Service服务与Topic话题的区别
    • 2、C++ 代码编写
      • 2.1、自定义 .srv 文件
      • 2.2、C++ 服务端代码编写
      • 2.3、C++ 客户端代码编写
      • 2.4、CMakeLists.txt 文件编写
      • 2.5、package.xml文件编写
    • 3、编译运行
      • 3.1、执行 catkin_make 编译程序
      • 3.2、执行 source 部署
      • 3.3、 执行 rossrv show 查看测试是否已经安装成功:
      • 3.4、 服务端运行
      • 3.5、 客户端运行
    • 4. 常用命令

1、基本概念

1.1、官方定义

Request / reply is done via a Service, which is defined by a pair of messages: one for the request and one for the reply.

服务是同步的跨进程函数调用。使用 client/server 模型,能够让客户端节点调用运行在服务端节点中的函数。

service服务通讯机制是一种双向同步数据传输模式。基于客户端/服务器模型,两部分通信数据类型:一个用于请求,一个用于应答,类似web服务器。

同步:客户端发送请求数据,服务端完成处理后返回应答数据。client 端发送请求后会阻塞,直到 server 端返回结果才会继续执行。

1.2、Service服务与Topic话题的区别

Topic话题:订阅/发布话题是不同步的,发布者只管发布消息,不管有没有或有几个订阅者,也不管订阅者能不能跟得上自己的发布速度。订阅者则只管监听消息,不会告诉发布者听没听到。这种方式交换数据的效率高,但完全不具备应答功能。

Service服务:当服务端收到服务请求后,会对请求做出响应,将数据的处理结果返回给客户端。这种模式更适用于双向同步的信息传输。服务调用非常适合那些只需要偶尔去做,并且会在有限的时间里完成的事。

2、C++ 代码编写

2.1、自定义 .srv 文件

ros 已经定义了一些服务,但我们也可以定义自己的服务。服务自定义文件通常放在功能包的 srv 文件夹下,文件扩展名为 .srv 。
在这里插入图片描述
服务包含请求(request)数据和应答(response)数据,中间用三个小短线(—)隔开。示例内容service_sample.srv 如下:

在这里插入图片描述

2.2、C++ 服务端代码编写

service_sample_server.cpp


#include <ros/ros.h>
#include <service_sample.h>

/* respose the client request of query service_sample info */

bool Server_Callback_ResposeQueryInfo(service_sample::Request &req,
                                                 service_sample::Response &res)
{
    //res.c = req.a * req.b;
    res.count = 10;  
    printf("Server: query_all_service_sample_info result is as following: \n");
    printf(".count = [%d] \n", res.count);    
    return true;
}


int main(int argc, char **argv)
{
    ros::init(argc, argv, "simple_marker");
    ros::NodeHandle nh2;
    ros::ServiceServer server = nh2.advertiseService("query_all_service_sample_info",    Server_Callback_ResposeQueryInfo);
    ROS_INFO("waiting query_all_service_sample_info result ... \n ");
    
    while (nh2.ok())
  {
      ros::spinOnce();
  }

    return 0;
}

2.3、C++ 客户端代码编写

service_sample_client.cpp


#include <ros/ros.h>
#include<cstdlib>
#include <time.h>

#include <service_sample.h>

int main(int argc, char **argv)
{
    srand(int(time(0)));
    double a = rand()/(double(RAND_MAX)/100);
    double b = rand()/(double(RAND_MAX)/100);
    ros::init(argc, argv, "multi_client");
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<service_sample>("query_all_service_sample_info");

    service_sample srv;
    srv.request.cmdType = std::to_string(a);

    if (client.call(srv))
    {
        printf("Client: query_all_service_sample result is as following: \n");
        printf("count = [%d] \n", srv.response.count);

    }
    else
    {
        ROS_ERROR("Failed to call service");
    }
    
    return 0;
    
}

2.4、CMakeLists.txt 文件编写


cmake_minimum_required(VERSION 3.0.2)
project(service_sample)

find_package(catkin REQUIRED COMPONENTS
             roscpp
             visualization_msgs tf
             rospy     
             std_msgs  
             message_generation  

add_service_files(FILES service_sample.srv)

generate_messages(DEPENDENCIES std_msgs) 

catkin_package(
        CATKIN_DEPENDS interactive_markers
        roscpp visualization_msgs tf
        rospy            
        std_msg          
        message_runtime  
)

include_directories(include
  ${catkin_INCLUDE_DIRS}
)


add_executable(service_sample_server src/service_sample_server.cpp)
target_link_libraries(service_sample_server
   ${catkin_LIBRARIES}
)


add_executable(service_sample_client src/service_sample_client.cpp)
target_link_libraries(service_sample_client
        ${catkin_LIBRARIES}
        )

2.5、package.xml文件编写

在原文件中,增加:


<depend>rospy</depend>
<depend>std_msg</depend>

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

3、编译运行

3.1、执行 catkin_make 编译程序

运行 catkin_make 会生成三个类:service_sample,service_sampleRequest,和 service_sampleResponse。可以在 devel 文件夹下找到相应的生成文件,当然你可能永远都不需要去查看这些细节。

catkin_make

3.2、执行 source 部署

source devel/setup.bash

3.3、 执行 rossrv show 查看测试是否已经安装成功:

rossrv show service_sample

3.4、 服务端运行

rosrun service_sample service_sample_server

或者

cd devel/lib/service_sample
./service_sample_server

3.5、 客户端运行

rosrun service_sample service_sample_client

或者

cd devel/lib/service_sample
./service_sample_client

4. 常用命令


#查看服务列表
rosservice list



#查看服务结构定义
rossrv show service_sample

注意:务必在 source setup.bash 后执行 rossrv show 命令。

在这里插入图片描述

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

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

相关文章

爬虫——XPath基本用法

第一章XML 一、xml简介 1.什么是XML&#xff1f; 1&#xff0c;XML指可扩展标记语言 2&#xff0c;XML是一种标记语言&#xff0c;类似于HTML 3&#xff0c;XML的设计宗旨是传输数据&#xff0c;而非显示数据 4&#xff0c;XML标签需要我们自己自定义 5&#xff0c;XML被…

计算机网络——ftp

在网络通信中&#xff0c;控制连接和数据连接是两种不同类型的连接&#xff0c;它们各自具有特定的功能和用途。 一、控制连接 定义与功能&#xff1a; 控制连接主要用于在通信双方之间传输控制信息&#xff0c;以建立、维护和终止数据连接。它负责协调和管理数据传输的过程&am…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-05

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04目录1. LLM-Augmented Symbolic Reinforcement Learning with Landmark-Based Task Decomposition摘要研究背景问题与挑战如何…

如何用python抓取豆瓣电影TOP250

1.如何获取网站信息&#xff1f; &#xff08;1&#xff09;调用requests库、bs4库 #检查库是否下载好的方法&#xff1a;打开终端界面&#xff08;terminal&#xff09;输入pip install bs4, 如果返回的信息里有Successfully installed bs4 说明安装成功&#xff08;request…

【JavaEE】——文件IO的应用

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;文件的搜索&#xff08;面试高频&#xff09; 二&#xff1a;文件的复制 三&#xff1a…

森林火灾的预防方案

对于森林火灾的预防&#xff0c;我们需要了解森林火灾形成的原因。一般来森林火灾的形成分为自然原因和人为原因&#xff1b;自然原因多为干燥天气的自燃、雷电火等&#xff0c;而人为原因多是农、林、牧业生产用火&#xff0c;林副业生产用火&#xff0c;以及工矿运输生产用火…

无人机(自组穿越机,航模)-芯片选型

飞控MCU: 型号尺寸子型号参数规格备注STM325*532位ARM Cortex-M3 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;20KB RAMLQFP 48F33*332位ARM Cortex-M4 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;40KB RAMMPU6050F45*532位ARM Cortex-M4 CPU&…

分享我“Excel 表格”关键字的博客笔记(python脚本全程自动)

Python脚本全程自动&#xff0c;全部Python内建工具脚本纯净。 (笔记模板由python脚本于2024年10月05日 19:51:06创建&#xff0c;本篇笔记适合喜欢Excel和Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

MQ(仅供自己参考)

同步通讯的优缺点&#xff1a; 优点&#xff1a;时效高&#xff0c;数据一致&#xff0c;过程简单 缺点&#xff1a;耦合度高。性能下降。CPU等待资源的浪费。级联失败。 2、异步通讯&#xff1a;异步调用常见的实现就是事件驱动模式 异步的优缺点&#xff1a; 优点&#xf…

隐喻的使用及误用

Larry Constantine 著&#xff0c;whoisred 译 长期以来&#xff0c;在图形用户界面设计中&#xff0c;隐喻&#xff08;metaphor&#xff09;一直很流行。但是&#xff0c;虽然有少数简单的隐喻——如文件夹及垃圾箱——令人击节叫好&#xff0c;可事实上&#xff0c;大多数隐…

去噪扩散模型

Denoising Diffusion Probabilistic Models 图像扩散模型是一种生成模型&#xff0c;它基于概率扩散过程来生成新的图像。 核心步骤包括&#xff1a;&#xff08;1&#xff09;前向扩散过程&#xff1b;&#xff08;2&#xff09;逆向扩散过程 前向扩散过程&#xff08;正向过…

第十五周:机器学习笔记

第十五周周报 摘要Abstract一、机器学习1. 各式各样神奇的自注意力机制1.1 Local Attention/Truncated Attention&#xff08;截断注意力机制&#xff09;1.2 Stride Attention&#xff08;跨步注意力机制&#xff09;1.3 Global Attention&#xff08;全局注意力机制&#xff…

Jenkins pipeline配置示例

前提条件&#xff1a;已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考&#xff1a; 1.创建pipeline 点击新建项目&#xff1a; 输入名称&#xff0c;选择pipeline&#xff1a; 进入配置页面&#xff0c;如果要配置GitHub Webhook要勾选&#xff1a;<fo…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

Uncaught TypeError: 0 is not a function的解决方法

好久不见&#xff0c;我胡汉三又回来了。 是的&#xff0c;我又发现问题了。 写JS的时候&#xff0c;发现了一堆原则性的问题&#xff0c;但是这些问题又刚好是别人没怎么遇到的。 是的&#xff0c;我用ChatGPT了。 (function frame() {window.requestAnimationFrame(frame)…

NVIDIA网卡系列之ConnectX-3规格信息(10G-PCIe 3.0x4-PF?VF?-2013年发布)

背景 NVIDIA ConnectX-3系列的网卡&#xff0c;早期还在Mellanox未被NVIDIA收购的时候就发布了&#xff0c;支持10G&#xff0c;PCIe3.0&#xff0c;最大x8通道lanes。 是10G级别的一代&#xff08;10G-CX3&#xff0c;50G-CX4&#xff0c;100G-CX5&#xff0c;200G-CX6&#…

Linux线程(七)线程安全详解

当我们编写的程序是一个多线程应用程序时&#xff0c;就不得不考虑到线程安全的问题&#xff0c;确保我们编写的程序是一个线程安全&#xff08;thread-safe&#xff09;的多线程应用程序&#xff0c;什么是线程安全以及如何保证线程安全&#xff1f;带着这些问题&#xff0c;本…

光伏项目管理如何更高效化?

一、项目规划与启动阶段的优化 1、智能规划工具&#xff1a;光伏管理软件通常配备有智能项目规划模块&#xff0c;能够根据地理位置、气候条件、政策补贴等因素&#xff0c;自动计算最佳装机容量、预测发电量及收益&#xff0c;帮助项目团队快速制定合理的项目方案。这大大缩短…

大数据毕业设计选题推荐-NBA球员数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

知识图谱入门——9: spaCy中命名实体识别(NER)任务中的预定义标签详解及案例(GPE、MONEY、PRODUCT、LAW、FAC、NORP是什么?)

命名实体识别&#xff08;NER, Named Entity Recognition&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的重要任务之一&#xff0c;旨在从文本中识别出特定的实体&#xff0c;如人名、地名、时间等。spaCy 是一个广泛使用的 NLP 库&#xff0c;它提供了预训练的模型…