ROS基礎學習-ROS通信機制研究

研究ROS通信機制

研究ROS通信機制

  • 0.前言
  • 1.話題通信
    • 1.1 理論模型
    • 1.2 話題通訊的基本操作
      • 1.2.1 C++
      • 1.2.2 Python

0.前言

機器人是一種高度復雜的系統性實現,在機器人上可能集成各種傳感器(雷達、攝像頭、GPS…)以及運動控制實現,為了解耦合,在ROS中每一個功能點都是一個單獨的進程,每一個進程都是獨立運行的。更確切的講,ROS是進程(也稱為Nodes)的分布式框架。 因為這些進程甚至還可分布于不同主機,不同主機協同工作,從而分散計算壓力。不過隨之也有一個問題: 不同的進程是如何通信的?也即不同進程間如何實現數據交換的?在此我們就需要介紹一下ROS中的通信機制了。

ROS 中的基本通信機制主要有如下三種實現策略:
話題通信(發布訂閱模式)
服務通信(請求響應模式)
參數服務器(參數共享模式)—相當于共享內存?共享數據池?

1.話題通信

話題通信是ROS中使用頻率最高的一種通信模式,話題通信是基于發布訂閱模式的,也即:一個節點發布消息,另一個節點訂閱該消息。話題通信的應用場景也極其廣泛,比如下面一個常見場景:
機器人在執行導航功能,使用的傳感器是激光雷達,機器人會采集激光雷達感知到的信息并計算,然后生成運動控制信息驅動機器人底盤運動。
在上述場景中,就不止一次使用到了話題通信。
以激光雷達信息的采集處理為例,在 ROS 中有一個節點需要時時的發布當前雷達采集到的數據,導航模塊中也有節點會訂閱并解析雷達數據。
再以運動消息的發布為例,導航模塊會根據傳感器采集的數據時時的計算出運動控制信息并發布給底盤,底盤也可以有一個節點訂閱運動信息并最終轉換成控制電機的脈沖信號。
以此類推,像雷達、攝像頭、GPS… 等等一些傳感器數據的采集,也都是使用了話題通信,換言之,話題通信適用于不斷更新的數據傳輸相關的應用場景

概念:以發布訂閱的方式實現不同節點之間數據交互的通信模式。

作用:用于不斷更新的、少邏輯處理的數據傳輸場景。

另可參考:
http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29


疑惑:話題通信,有實時性問題嗎?實時性如何保證的?


1.1 理論模型

話題通信實現模型是比較復雜的,該模型如下圖所示,該模型中涉及到三個角色:ROS Master (管理者)、Talker (發布者)、Listener (訂閱者)
ROS Master 負責保管 Talker 和 Listener 注冊的信息,并匹配話題相同的 Talker 與 Listener,幫助 Talker 與 Listener 建立連接,連接建立后,Talker 可以發布消息,且發布的消息會被 Listener 訂閱。
在這里插入圖片描述
需要說明的是:
使用的協議由RPC和TCP
talker和listener都可以存在多個
talker和listener建立連接后,master就可以關閉了

整個流程由以下步驟實現:

0.Talker注冊
Talker啟動后,會通過RPC在 ROS Master 中注冊自身信息,其中包含所發布消息的話題名稱。ROS Master 會將節點的注冊信息加入到注冊表中。
1.Listener注冊
Listener啟動后,也會通過RPC在 ROS Master 中注冊自身信息,包含需要訂閱消息的話題名。ROS Master 會將節點的注冊信息加入到注冊表中。
2.ROS Master實現信息匹配
ROS Master 會根據注冊表中的信息匹配Talker 和 Listener,并通過 RPC 向 Listener 發送 Talker 的 RPC 地址信息。
3.Listener向Talker發送請求
Listener 根據接收到的 RPC 地址,通過 RPC 向 Talker 發送連接請求,傳輸訂閱的話題名稱、消息類型以及通信協議(TCP/UDP)。
4.Talker確認請求
Talker 接收到 Listener 的請求后,也是通過 RPC 向 Listener 確認連接信息,并發送自身的 TCP 地址信息。
5.Listener與Talker件里連接
Listener 根據步驟4 返回的消息使用 TCP 與 Talker 建立網絡連接。
6.Talker向Listener發送消息
連接建立后,Talker 開始向 Listener 發布消息。

注意1:上述實現流程中,前五步使用的 RPC協議,最后兩步使用的是 TCP 協議
注意2: Talker 與 Listener 的啟動無先后順序要求
注意3: Talker 與 Listener 都可以有多個
注意4: Talker 與 Listener 連接建立后,不再需要 ROS Master。也即,即便關閉ROS Master,Talker 與 Listern 照常通信。

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

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

相關文章

從File類開始,學習Java文件操作

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一…

windows安裝SQL Server

1、下載 下載網頁:SQL Server 下載 | Microsoft 2022版下載地址:https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下載結果:SQL2022-SSEI-Dev.exe 打開選第三個,下載介質&…

自定義Linux命令,顯示docker鏡像、容器信息

1、修改環境變量(僅對當前用戶有效) vim ~/.bashrc2、給命令取別名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、讓配置重新生效 source ~/.bashrc4、測試&…

ChatGPT技術演進簡介

chatGPT(chat generative pre-train transformer, 可以對話的預訓練trasformer模型),討論點: 1、chatGPT為什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o區別和特性,在不同應用場景中如何選對模型 3、未…

基于ESP8266的無線通信系統設計

本文介紹了一種基于ESP8266的無線通信系統設計方案。ESP8266是一款功能強大且成本低廉的WiFi模塊,非常適合用于構建無線通信系統。本設計主要圍繞ESP8266模塊的功能特點,闡述了系統的硬件組成、軟件設計以及實際應用示例。 關鍵詞:ESP8266&a…

【docker】倉庫harbor的部署

harbor介紹 Harbor 是一個用于存儲和管理 Docker 鏡像的開源倉庫。它提供了一系列的功能,比如用戶管理、訪問控制、鏡像管理、日志審計和安全掃描等。Harbor 可以作為私有倉庫來使用,也可以與公有倉庫(如 Docker Hub)集成使用。 …

python數據分析——apply 1

參考資料:活用pandas庫 apply是指把函數同時作用于DataFrame的每一行或每一列。類似于編寫一些跨每行或每列的for循環,并同時調用apply函數。 1、函數 函數是對python代碼進行分組和復用的一種方法。如果某段代碼會被多次使用,并且使用時是需…

JS Lab

如何用 JavaScript 在瀏覽器中彈窗如何在 JavaScript 中制作鼠標滑過按鈕改變背景顏色如何在 JS 中點擊按鈕使數字增加如何在 JS 中循環打印多少次 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…

優化FPGA SelectIO接口VREF生成電路

引言&#xff1a;FPGA設計中使用了各種PCB SelectIO?接口VREF生成電路。有時即使在以前的設計中已經成功的在電路板上設計了VREF生成電路&#xff0c;也會在VREF引腳上發現大量噪聲&#xff08;200–400mV&#xff09;。大量VREF噪聲的存在可能導致高性能SelectIO接口&#xf…

瑞昱半導體AMB82 MINI(RTL8735B)Arduino 方法介紹

介紹瑞昱半導體&#xff08;Realtek &#xff09;AMB82-Mini 物聯網 AI開發板 Ameba是一個易于編程的平臺&#xff0c;用于開發各種物聯網應用程序。AMB82 MINI配備了各種外設接口&#xff0c;包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通過這些接口&#xff0c;AM…

找出只出現一次的數字

輸入一些數字&#xff0c;每個數字以逗號分隔&#xff0c;其中有一個數字出現1次&#xff0c;其余數字均會出現2次。請找出那個只出現一次的數字! 提示&#xff1a;使用字典的方式實現 # 輸入一些數字&#xff0c;每個數字以逗號分隔 input_nums input("請輸入一些數字…

從0開始學統計-秩和檢驗

1.什么是秩和檢驗&#xff1f; 秩和檢驗&#xff0c;也稱為Wilcoxon 秩和檢驗&#xff0c;是一種非參數統計檢驗方法&#xff0c;用于比較兩個獨立樣本的中位數是否有顯著差異。它不要求數據滿足正態分布假設&#xff0c;因此適用于小樣本或者數據不滿足正態分布假設的情況。 …

51單片機-實機演示(單個數碼管)

仿真單個數碼管鏈接&#xff1a;http://t.csdnimg.cn/BLMut 一。插線 注意P00連接到A 測試代碼為 #include <reg52.h> //此文件中定義了單片機的一些特殊功能寄存器// sbit KEY2 P3^2; // 獨立按鍵2void main() {P0 0x00;while (1) {}…

Spring AOP實現Mapper層查詢返回重新賦值

需求&#xff1a; 針對查詢返回的數據&#xff0c;在數據庫層處理可能會影響到性能&#xff0c;在考慮性能及維護方便的情況下&#xff0c;采用AOP實現 1&#xff0c;自定義注解 import java.lang.annotation.*;/*** 針對 mapper層返回值 按照一定規則進行特殊處理后返回*/ Ta…

Vue學習JSON.parse()與JSON.stringify()對象與字符串互轉

Vue學習JSON.parse(&#xff09;與JSON.stringify(&#xff09;對象與字符串互轉 一、前言1、代碼 一、前言 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于處理 JSON 數據的兩個方法。 JSON.parse() 方法將一個 JSON 字符串解析為對應的 JavaScript 對象或數組。例…

kaggle競賽實戰3

接前文&#xff0c;本文主要做以下幾件事&#xff1a; 1、把前面處理完的幾個表拼成一個大表 2、做特征衍生&#xff08;把離散特征和連續特征兩兩組合得出&#xff09; # In[89]: #開始拼接表 transaction pd.concat([new_transaction, history_transaction], axis0, ignor…

JAVA實現圖書管理系統(初階)

一.抽象出對象: 1.要有書架&#xff0c;圖書&#xff0c;用戶&#xff08;包括普通用戶&#xff0c;管理員用戶&#xff09;。根據這些我們可以建立幾個包&#xff0c;來把繁雜的代碼分開&#xff0c;再通過一個類來把這些&#xff0c;對象整合起來實現系統。說到整合&#xf…

[數組查找]2.圖解二分查找及其代碼實現

二分查找 二分查找也是一種在數組中查找數據的算法。和線性查找不同&#xff0c;它只能查找已經排好序的數據。二分查找通過比較數組中間的數據與目標數據的大小&#xff0c;可以得知目標數據是在數組的左邊還是右邊。因此&#xff0c;比較一次就可以把查找范圍縮小一半。重復執…

嵌入式進階——舵機控制PWM

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 舵機信號線代碼示例初始化PWM初始化UART打印日志初始化外部中斷Extimain函數 舵機最早用于船舶上實現轉向功能,由于可以通過程序連…

MySQL中, 自增主鍵和UUID作為主鍵有什么區別?

首先我們來看看, 存儲自增主鍵和uuid的數據類型 我們知道, mysql中作為主鍵的通常是int類型的數據, 這個 數據從第一條記錄開始, 從1開始主鍵往后遞增, 例如我有100條數據, 那么根據主鍵排序后, 里面的記錄從上往下一次就是1, 2, 3 ... 100, 但是UUID就不一樣了, UUID是根據特殊…