ROS2服務通信的實現

文章目錄

  • 1.服務通信的概念及應用場景
    • 1.1概念
    • 1.2 應用場景
  • 2.準備工作
  • 3.服務通信的實現
    • 3.1 服務通信接口消息
    • 3.2 服務端實現
    • 3.3 客戶端實現
    • 3.4 編譯及運行
      • 3.4.1 修改CMakeLists
      • 3.4.2 服務端運行結果
      • 3.4.2 客戶端運行結果


1.服務通信的概念及應用場景

1.1概念

服務通信也是ROS中一種極其常用的通信模式,服務通信是基于請求響應模式的,是一種應答機制。也即:一個節點A向另一個節點B發送請求,B接收處理請求并產生響應結果返回給A。
在這里插入圖片描述
服務端只能有一個,客戶端可以有多個:
在這里插入圖片描述

1.2 應用場景

機器人巡邏過程中,控制系統分析傳感器數據發現可疑物體或人… 此時需要拍攝照片并留存。

也就是數據分析節點A需要向相機相關節點B發送圖片存儲請求,節點B處理請求,并返回處理結果。

2.準備工作

在這里插入圖片描述

3.服務通信的實現

3.1 服務通信接口消息

定義服務接口消息與定義話題接口消息流程類似,主要步驟如下:
①創建并編輯 .srv文件;
②編輯配置文件;
③編譯;
④測試。

在這里插入圖片描述

3.2 服務端實現

// 1.包含頭文件
#include "rclcpp/rclcpp.hpp"
#include "base_interfaces_demo/srv/add_ints.hpp"
using base_interfaces_demo::srv::AddInts;
using std::placeholders::_1;
using std::placeholders::_2;// 3.定義節點類;
class MinimalService: public rclcpp::Node{ public:  MinimalService():Node("minimal_service"){     // 3-1.創建服務端;     server = this->create_service<AddInts>("add_ints", std::bind(&MinimalService::add, this, _1, _2));RCLCPP_INFO(this->get_logger(),"add_ints 服務端啟動完畢,等待請求提交..."); }  private:    rclcpp::Service<AddInts>::SharedPtr server;   // 3-2.處理請求數據并響應結果。   void add(const AddInts::Request::SharedPtr req, const AddInts::Response::SharedPtr res){      res->sum = req->num1 + req->num2;      RCLCPP_INFO(this->get_logger(),"請求數據:(%d,%d),響應結果:%d", req->num1, req->num2, res->sum);    } 
};int main(int argc, char const *argv[])
{  // 2.初始化 ROS2 客戶端; rclcpp::init(argc,argv);  // 4.調用spin函數,并傳入節點對象指針; auto server = std::make_shared<MinimalService>(); rclcpp::spin(server);  // 5.釋放資源。  rclcpp::shutdown();  return 0; 
} 

代碼分析:
在這里插入圖片描述

3.3 客戶端實現

// 1.包含頭文件; 
#include "rclcpp/rclcpp.hpp"
#include "base_interfaces_demo/srv/add_ints.hpp"
using base_interfaces_demo::srv::AddInts;using namespace std::chrono_literals;
// 3.定義節點類; 
class MinimalClient: public rclcpp::Node{
public:
MinimalClient():Node("minimal_client"){
// 3-1.創建客戶端;
client = this->create_client<AddInts>("add_ints");
RCLCPP_INFO(this->get_logger(),"客戶端創建, 等待連接服務端! ");
} 
// 3-2.等待服務連接;
bool connect_server(){
while (!client->wait_for_service(1s))
{
if (!rclcpp::ok())
{
RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"強制退出! ");
return false;
} 
RCLCPP_INFO(this->get_logger(),"服務連接中, 請稍候...");
} 
return true;
}
// 3-3.組織請求數據并發送;
rclcpp::Client<AddInts>::FutureAndRequestId send_request(int32_t num1, int32_t num2){
auto request = std::make_shared<AddInts::Request>();
request->num1 = num1;
request->num2 = num2;
return client->async_send_request(request);
}
private:
rclcpp::Client<AddInts>::SharedPtr client;
};
int main(int argc, char ** argv){
if (argc != 3){
RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"請提交兩個整型數據! ");
return 1;
} 
// 2.初始化 ROS2 客戶端;
rclcpp::init(argc,argv);
// 4.創建對象指針并調用其功能;
auto client = std::make_shared<MinimalClient>();
bool flag = client->connect_server();
if (!flag)
{
RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"服務連接失敗! ");
return 0;
} 
auto response = client->send_request(atoi(argv[1]),atoi(argv[2]));
// 處理響應
if (rclcpp::spin_until_future_complete(client,response) ==
rclcpp::FutureReturnCode::SUCCESS)
{
RCLCPP_INFO(client->get_logger(),"請求正常處理");
RCLCPP_INFO(client->get_logger(),"響應結果:%d!", response.get()->sum);
} 
else {
RCLCPP_INFO(client->get_logger(),"請求異常");
} 
// 5.釋放資源。
rclcpp::shutdown();
return 0;
}

在這里插入圖片描述
代碼分析:
在這里插入圖片描述

3.4 編譯及運行

3.4.1 修改CMakeLists

別忘了修改CMakeLists文件
在這里插入圖片描述

3.4.2 服務端運行結果

在這里插入圖片描述

3.4.2 客戶端運行結果

在這里插入圖片描述

提示:這里對文章進行總結:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719418.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抖店0元入駐不交錢會怎么樣?個人店和個體店的利弊分析,開店必看

我是王路飛。 現在的抖店是可以開通個人店的。 也就是不需要營業執照、直接使用個人身份證就可以在抖音開店&#xff0c;而且也不需要繳納店鋪保證金就能開店運營了。 但真實情況是怎么樣的呢&#xff1f;新手0元入駐抖店不交這個保證金會怎么樣呢&#xff1f; 今天給想在抖…

AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用

原文鏈接&#xff1a;AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用 一開啟大模型 1 開啟大模型 1)大模型的發展歷程與最新功能 2)大模型的強大功能與應用場景 3)國內外經典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diff…

ios App 發送廣播失敗解決

記錄開發 ios App 使用 c 混編時遇到的問題&#xff1a; 開發環境 macOS Sonoma&#xff08;最新版本14.3.1&#xff09; Xcode Version 15.2 ipadOS&#xff08;最新版本17.3.1&#xff09; 問題&#xff1a;在mac 上 和 ipad上測試&#xff0c;當 udp 發送廣播&#xff…

跨域引起的兩個接口的session_id不是同一個

來源場景&#xff1a; RequestMapping(“/captcha”)接口設置了SESSION_KEY&#xff0c;也能獲取到&#xff0c;但是到了PostMapping(“/login”)接口就是空的&#xff0c;由于跨域導致的兩個session_id不是同一個 /*** 系統用戶 前端控制器*/ Controller CrossOrigin(origins…

【數據結構和算法初階(C語言)】雙向循環帶頭鏈表的增刪查改詳解(天才設計的鏈表結構,應用簡單逆天!!!!!)

目錄 ?編輯?編輯 1.雙向鏈表的定義&#xff1a;前赴后繼 2.帶頭鏈表的定義-----哨兵位 3.增刪查改 3.1創建新節點函數----方便后續增加節點調用 3.2創建哨兵位----創建頭結點 3.3增加節點&#xff0c;尾部插入數據 3.4尾刪除 3.5查找函數----遍歷對比&#xff…

AcWing 562.壁畫

咱先看一眼算法標簽&#xff0c;發現是思維題、枚舉、前綴和 Buttt其實我們根據上訴的樣例解釋部分就會發現&#xff0c;其實這就是一個長度為?n/2?&#xff08;向上取整哦&#xff09;的連續子數組的最大和。 這題我也用暴力法試過啦&#xff0c;很明顯會TLE 如果你對dp題…

Mac M系列芯片如何重新安裝系統

使用可引導安裝器重新安裝&#xff08;可用于安裝非最新的 Mac OS&#xff0c;系統降級&#xff0c;需要清除所有數據&#xff0c;過程確保連接上網絡&#xff0c;雖然這種方式不會下載 Mac OS&#xff0c;但是需要下載固件等信息&#xff09; 插入制作好的可引導安裝器&#x…

【使用imgaug庫調整圖像大小并修改對應的XML標簽框】

使用imgaug庫可以方便地進行圖像增強操作&#xff0c;包括調整圖像大小。以下是使用imgaug庫調整圖像大小并修改對應的XML標簽框的示例腳本&#xff1a; 注意修改輸入文件夾路徑、輸出文件夾路徑和目標尺寸為自己內容。 input_folder "path/to/your/input_folder" …

kalibr標定ZED2i雙目加imu

一、錄制bag 本人使用的zed2i相機。 rosbag record -O 32 /zed2i/zed_node/imu/data /zed2i/zed_node/imdata_raw /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color /zed2i/zed_node/left_raw/image_raw_color /zed2i/zed_node/right_raw/ima…

Matlab|【免費】基于合作博弈的綜合能源系統利益分配優化調度

目錄 主要內容 部分代碼 結果一覽 下載鏈接 主要內容 該程序實現的模型為綜合能源系統利益分配優化調度&#xff0c;采用合作博弈方法&#xff0c;模型針對IES系統的P2G、電解槽、甲烷反應器、儲氫罐、CHP和燃氣鍋爐等設備進行建模&#xff0c;實現基于合作博弈的…

std::shared_from_this注意事項:exception bad_weak_ptr

1.不可以在構造函數中調用shared_from_this() 因為它的實現是&#xff1a; _LIBCPP_INLINE_VISIBILITYshared_ptr<_Tp> shared_from_this(){return shared_ptr<_Tp>(__weak_this_);}也就是它依賴的__weak_this_此時還未創建完成。 2.一定要public繼承 class MyTy…

大數據開發(Java面試真題-卷二)

大數據開發&#xff08;Java面試真題&#xff09; 1、請簡要說明Java中equeals()和hashCode()的作用及區別&#xff1f;2、Java中的四種訪問修飾符及它們之間的區別&#xff1f;3、請解釋Java中的異常處理機制&#xff0c;包括checked exception和unchecked exception?4、Java…

Linux 學習筆記(10)

十、 進程管理 進程就是運行中的程序&#xff0c;一個運行著的程序&#xff0c;可能有多個進程。 比如 LinuxSir.Org 所用的 WWW 服務器是 apache 服務器&#xff0c;當管理員啟動服務后&#xff0c;可能會有好多人來訪問&#xff0c;也就是說許多用戶來同時請 求 htt…

QT debug編譯失敗:xxx/bin/ld.exe: cannot find -lxxd1

原因&#xff1a;由于編譯時&#xff0c;使用debug模式下&#xff0c;動態庫沒有對應的lxxd1中的xx庫 解決方案1&#xff1a;改為release編譯&#xff1b; 解決方案2&#xff1a;在引用的三方pri文件中&#xff0c;去掉多余的d #修改前 if(!debug_and_release|build_pass):CON…

沃德的背包

題目描述 沃德進入源碼世界的路上有很多寶石&#xff0c;可是沃德的背包只能背總重量不超過m的寶石&#xff0c;路上一共有n個寶石&#xff0c;每個寶石的重量為wi&#xff0c;請你幫沃德選擇盡量多的寶石裝進背包&#xff0c;請注意寶石的總重量不超過m。 輸入描述 第一行輸…

Django官網項目 二

官網地址&#xff1a;Writing your first Django app, part 2 | Django documentation | Django 創建模組&#xff1a; 注冊model &#xff08;bug&#xff1a;沒有加后面的逗號&#xff09; 在manage.py 的目錄下&#xff1a; python manage.py makemigrations polls pyth…

redis09 集群(cluster)

思維草圖 為什么要使用集群 單臺redis內存容量的限制單臺redis并發寫量太大有性能瓶頸 redis集群認識 redis集群是對redis的水平擴容&#xff0c;即啟動N個redis節點&#xff0c;將整個數據分布存儲在這個N個節點中&#xff0c;每個節點存儲總數據的1/N。 如下圖&#xff1…

C++ 根據公式計算橢圓任意點到中心的距離

#include <iostream> using namespace std;double fact(int x) //定義階乘函數。注意是double類型 {double y x; //注意是double類型for (int i x-1; i > 0; i--)y * i;return y; };double My_sin(int x) //定義sin函數。注意是double類型 {double y 0; //注意是do…

【視頻圖像取證篇】Amped FIVE專業法醫圖像和視頻增強軟件之模糊圖像去隔行功能

【視頻圖像取證篇】Amped FIVE專業法醫圖像和視頻增強軟件之模糊圖像去隔行功能 法醫圖像和視頻增強軟件&#xff0c;專業又強大&#xff01;&#xff01;&#xff01;超過 140 種過濾器和工具&#xff0c;用于分析、恢復和增強數字圖像和視頻。Amped FIVE能夠穩定抖動的視頻&…

Linux:ansible-playbook配置文件(劇本)(進階)

Linux&#xff1a;ansible-playbook配置文件&#xff08;劇本&#xff09;_ansible-playbook -i參數-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522s…