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.pswp.cn/web/65458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65458.shtml
英文地址,請注明出處:http://en.pswp.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;梯度下降算法 梯度下降&#…