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

研究ROS通信機制

研究ROS通信機制

  • 0.前言
  • 1.話題通信
    • 1.1 理論模型
    • 1.2 話題通訊的基本操作
      • 1.2.1 C++
      • 1.2.2 Python中使用自己的虛擬環境包
        • 1.2.2.1 參考1
        • 1.2.2.2 參考2
        • 1.2.2.3 /usr/bin/env:“python”:沒有那個文件或目錄
      • 1.2.3 Python
        • 1.2.2.1 發布方
        • 1.2.2.2 訂閱方
        • 1.2.2.3 添加可執行權限
        • 1.2.2.4 配置CMakeLists.txt
        • 1.2.2.5 執行
        • 1.2.2.6 訂閱者少數據
    • 1.3 話題通信自定義msg
      • 1.3.1 創建自定義信息
      • 1.3.2 自定義msg,C++調用
        • 1.3.2.1 vscode配置
        • 1.3.2.2 發布方
        • 1.3.2.3 訂閱方
        • 1.3.2.4 配置cmakeList.txt
        • 1.3.2.5 執行
      • 1.3.3 自定義msg,Python調用
        • 1.3.3.1 vscode配置
        • 1.3.3.2 發布方
        • 1.3.3.3 訂閱方
        • 1.3.3.4 權限設置
        • 1.3.3.5 配置 CMakeLists.txt
        • 1.3.3.6 執行

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 照常通信。

1.2 話題通訊的基本操作

編寫發布訂閱實現,要求發布方以10HZ(每秒10次)的頻率發布文本消息,訂閱方訂閱消息并將消息內容打印輸出。

在模型實現中,ROS master 不需要實現,而連接的建立也已經被封裝了,需要關注的關鍵點有三個:發布方、接收方、數據(此處為普通文本)

流程:
編寫發布方實現;
編寫訂閱方實現;
編輯配置文件;
編譯并執行。

1.2.1 C++

  • 發布方
/*需求: 實現基本的話題通信,一方發布數據,一方接收數據,實現的關鍵點:1.發送方2.接收方3.數據(此處為普通文本)PS: 二者需要設置相同的話題消息發布方:循環發布信息:HelloWorld 后綴數字編號實現流程:1.包含頭文件 2.初始化 ROS 節點:命名(唯一)3.實例化 ROS 句柄4.實例化 發布者 對象5.組織被發布的數據,并編寫邏輯發布數據
*/
// 1.包含頭文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本類型的消息
#include <sstream>int main(int argc, char  *argv[])
{   //設置編碼setlocale(LC_ALL,"");//2.初始化 ROS 節點:命名(唯一)// 參數1和參數2 后期為節點傳值會使用// 參數3 是節點名稱,是一個標識符,需要保證運行后,在 ROS 網絡拓撲中唯一ros::init(argc,argv,"talker");//3.實例化 ROS 句柄ros::NodeHandle nh;//該類封裝了 ROS 中的一些常用功能//4.實例化 發布者 對象//泛型: 發布的消息類型//參數1: 要發布到的話題//參數2: 隊列中最大保存的消息數,超出此閥值時,先進的先銷毀(時間早的先銷毀)ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//5.組織被發布的數據,并編寫邏輯發布數據//數據(動態組織)std_msgs::String msg;// msg.data = "你好啊!!!";std::string msg_front = "Hello 你好!"; //消息前綴int count = 0; //消息計數器//邏輯(一秒10次)ros::Rate r(1);//節點不死while (ros::ok()){//使用 stringstream 拼接字符串與編號std::stringstream ss;ss << msg_front << count;msg.data = ss.str();//發布消息pub.publish(msg);//加入調試,打印發送的消息ROS_INFO("發送的消息:%s",msg.data.c_str());//根據前面制定的發送貧頻率自動休眠 休眠時間 = 1/頻率;r.sleep();count++;//循環結束前,讓 count 自增//暫無應用ros

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

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

相關文章

【八股系列】談談關于對webpack熱更新的原理?

文章目錄 1. 熱更新原理2. 熱更新配置 1. 熱更新原理 Webpack 的熱模塊替換&#xff08;Hot Module Replacement&#xff0c;HMR&#xff09;是一種在不完全刷新頁面的情況下更新應用代碼的技術&#xff0c;從而提高了開發效率。以下是 HMR 的核心原理&#xff1a; 步驟描述1…

tcpdump抓包,抓包導出.pcap文件用wireshark看

1、抓所有口的包 tcpdump -i any host 設備的ip2、抓特定口的包 tcpdump -i eth2 port 61182 -nne3、將抓到的包導出到pacb文件 tcpdump -i eth2 port 61182 -nne -s0 -w /tmp/61182.pcap -s0: Sets the snapshot length to capture the entire packet. The 0 means that tcpd…

《征服數據結構》目錄

我們知道要想學好算法&#xff0c;必須熟練掌握數據結構&#xff0c;數據結構常見的有 8 大類&#xff0c;分別是數組&#xff0c;鏈表&#xff0c;隊列&#xff0c;棧&#xff0c;散列表&#xff0c;樹&#xff0c;堆&#xff0c;圖。但如果細分的話就比較多了&#xff0c;比如…

go-zero 實戰(2)

go-zero 實戰&#xff08;1&#xff09; 中&#xff0c;使用了go-zero 創建了order 和 user 兩個微服務。而order作為grpc的客戶端&#xff0c;user 作為grpc的服務端&#xff0c;打通了 order 到 user的調用。接下來&#xff0c;我們在user中&#xff0c;加入mysql組件。確保數…

我說同事咋找工作命中率這么高,原來是學習了這些招式

最近有兩個同事離職了&#xff0c;其中一個還是專科&#xff0c;他倆一個是前端開發&#xff0c;一個是python開發&#xff0c;兩個人都接近35歲了。我們還勸告他們&#xff0c;不要離職&#xff0c;要騎驢找馬。但了解后&#xff0c;他倆非常有信心的說&#xff1a;不怕&#…

富格林:遵守可信準則安全交易

富格林指出&#xff0c;當下的金融市場&#xff0c;投資者大多都會更傾向于盈利效率高的理財產品&#xff0c;而近年來興起的現貨黃金&#xff0c;正合投資者的心意。不過&#xff0c;投資現貨黃金若是不遵循其中的可信準則&#xff0c;是難以實現安全盈利的。那么有哪些可信準…

3D視覺技術|螺栓分揀測試

隨著制造業自動化程度的不斷提高&#xff0c;某大型汽配企業為提升生產效率、減少人力成本&#xff0c;提出了使用復合機器人完成螺栓分揀的需求。富唯智能通過采用復合機器人&#xff0c;結合3D工業相機和高性能控制器&#xff0c;實現螺栓的自動抓取&#xff0c;從而提升生產…

鴻蒙OS開發:【一次開發,多端部署】(一多天氣)項目

一多天氣 介紹 本示例展示一個天氣應用界面&#xff0c;包括首頁、城市管理、添加城市、更新時間彈窗&#xff0c;體現一次開發&#xff0c;多端部署的能力。 1.本示例參考一次開發&#xff0c;多端部署的指導&#xff0c;主要使用響應式布局的柵格斷點系統實現在不同尺寸窗…

【Qt 學習筆記】Qt窗口 | 工具欄 | QToolBar的使用及說明

博客主頁&#xff1a;Duck Bro 博客主頁系列專欄&#xff1a;Qt 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Qt窗口 | 工具欄 | QToolBar的使用及說明 文章編號&#xff1a;Qt 學習…

怎么看智慧城市的發展?

智慧城市&#xff0c;就像一個擁有高度智慧和感知能力的未來城市居民&#xff0c;正在不斷地學習、適應和進化。它通過無數的眼睛&#xff08;傳感器&#xff09;和耳朵&#xff08;數據收集設備&#xff09;來觀察和傾聽城市的脈動&#xff0c;通過強大的大腦&#xff08;數據…

opencv文檔py_contours示例整理

文章目錄 目錄說明contours_begin目標什么是輪廓?如何畫等高線?輪廓逼近法contour_features目標1.Moments 時刻2. Contour Area 輪廓面積3. Contour Perimeter 輪廓周長4. Contour Approximation 輪廓近似5. Convex Hull 凸包6. Checking Convexity 檢查凸性7. Bounding Rect…

B2118 驗證子串

驗證子串 題目描述 輸入兩個字符串&#xff0c;驗證其中一個串是否為另一個串的子串。 輸入格式 兩行&#xff0c;每行一個字符串。 輸出格式 若第一個串 s 1 s_1 s1? 是第二個串 s 2 s_2 s2? 的子串&#xff0c;則輸出(s1) is substring of (s2)&#xff1b; 否則&…

Python并發與異步編程

Python的并發與異步編程是兩個不同的概念&#xff0c;但它們經常一起使用&#xff0c;以提高程序的性能和響應能力。以下是對這兩個概念的詳細講解&#xff1a; 并發編程 (Concurrency) 并發編程是指在程序中同時執行多個任務的能力。Python提供了幾種實現并發的機制&#xff…

嵌入式進階——RTC時鐘

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 RTC時鐘原理圖PCF8563寄存器控制與狀態寄存器 設備地址I2C環境初始化RTC寄存器數據讀取RTC寄存器數據寫入RTC鬧鐘設置RTC定時器設置…

2024.5.28晚訓題解

提前預告&#xff0c;市賽初中組會考算法題&#xff0c;應該會有兩道模板題 比如DFS BFS 二分 簡單動態規劃&#xff0c;雖然我們沒學多久&#xff0c;但是模板題你還是要會寫的 A題 編輯距離 動態規劃 注意多組輸入 #include<iostream> using namespace std; int dp[1…

9、C#【進階】特性

特性 文章目錄 1、特性概念2、自定義特性 Attribute3、特性的使用4、限制自定義特性的使用范圍5、系統自帶特性1、過時特性2、調用者信息特性3、條件編譯特性4、外部dll包函數特性 1、特性概念 特性是一種允許我們向程序的程序集添加元數據的語言結構 它是用于保存程序機構信息…

【機器學習300問】103、簡單的經典卷積神經網絡結構設計成什么樣?以LeNet-5為例說明。

一個簡單的經典CNN網絡結構由&#xff1a;輸入層、卷積層、池化層、全連接層和輸出層&#xff0c;這五種神經網絡層結構組成。它最最經典的實例是LeNet-5&#xff0c;它最早被設計用于手寫數字識別任務&#xff0c;包含兩個卷積層、兩個池化層、幾個全連接層&#xff0c;以及最…

ansible批量漏洞升級openssh版本

1、ansible宿主機準備好環境&#xff0c;并寫好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前記得提前發送秘鑰 ssh-copy-id 10.10.200.33/34/352、下載好安裝包&#xff0c;然后編寫yml [rootoxidized ansible]…

【實用的 IDEA 配置和操作技巧總結】

前置知識 IDEA的設置快捷鍵為ctrlalts鍵&#xff0c;后文介紹IDEA常見的配置就不再贅述這一點了。 基礎配置 取消默認打開上次項目 日常開發都會打開不同的項目&#xff0c;初次安裝IDEA之后&#xff0c;每次打開IDEA都會開啟上一次啟動的項目&#xff0c;所以我們需要進入設…

0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKB方案

大綱 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper測試代碼代碼 在《0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKT方案》中&#xff0c;我們介紹WTK方案的優點&#xff0c;也感受到它的繁瑣和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…