ROS的通信架構(gòu)是ROS的靈魂所在,它包括數(shù)據(jù)處理,進(jìn)程運(yùn)行,消息傳遞等 。這篇文章主要介紹ROS1的通信架構(gòu)的基礎(chǔ)通信方式和相關(guān)概念,因?yàn)镽OS1和ROS2的通信方式相差很大,文章后面會(huì)介紹ROS2 的通信框架和差異。
接下來介紹一下三組概念:master<-->node<-->launch、topic<-->msg、service<-->srv<-->parameter <-->action.
一、master<-->node<-->launch
node: ROS最小的進(jìn)程單元就是節(jié)點(diǎn)node。一個(gè)軟件包里面有多個(gè)可執(zhí)行文件,可執(zhí)行文件被運(yùn)行就是進(jìn)程(process),這個(gè)進(jìn)程就是節(jié)點(diǎn)node。
rosnode list 列出當(dāng)前運(yùn)行的node信息
rosnode info node_name 顯示出node的詳細(xì)信息
rosnode kill node_name 結(jié)束某個(gè)node
rosnode ping 測試鏈接節(jié)點(diǎn)
rosnode machine 列出在特定機(jī)器或列表機(jī)器上運(yùn)行的節(jié)點(diǎn)
rosnode cleanup 清除不可到達(dá)節(jié)點(diǎn)的注冊(cè)信息
master: ROS網(wǎng)絡(luò)架構(gòu)的管理中心,管理著各個(gè)node。node先在master進(jìn)行注冊(cè),node之間通信需要經(jīng)過master編排才能點(diǎn)對(duì)點(diǎn)的通信。所以ROS程序啟動(dòng), 第一步先執(zhí)行roscore指令啟動(dòng)master,執(zhí)行指令后同時(shí)啟動(dòng)的還有rosout(負(fù)責(zé)日志輸出、記錄當(dāng)前系統(tǒng)狀態(tài))和parameter server(參數(shù)服務(wù)器,非node,負(fù)責(zé)存儲(chǔ)參數(shù)配置) ,再由節(jié)點(diǎn)管理器按照cmakelists.txt、package.xml配置執(zhí)行rosrun pkgname node_name 依次啟動(dòng)node 。
launch: 復(fù)雜節(jié)點(diǎn)啟動(dòng)管理文件。執(zhí)行roslaunch pkg_name file_name.launch 指令后,首先系統(tǒng)先檢測roscore是否啟動(dòng),如果沒有啟動(dòng)會(huì)默認(rèn)自動(dòng)拉起。然后按照launch配置啟動(dòng)規(guī)則,有序啟動(dòng)多個(gè)節(jié)點(diǎn),減少終端輸入。
二、topic<-->msg
ROS1的通信方式有四種:topic主題,service服務(wù),parameter service 參數(shù)服務(wù)器 ,actionlib動(dòng)作庫。
topic: ROS通信最常用的一種,對(duì)實(shí)時(shí)性、周期性消息,使用topic傳輸是最佳選擇。簡單的說,啟動(dòng)topic 首先需要publisher和subscriber 節(jié)點(diǎn)到master進(jìn)行注冊(cè),然后publisher 會(huì)發(fā)布topic,subscriber在master指揮下會(huì)訂閱topic,從而建立sub-pub之間的通信。一個(gè)topic可以有多個(gè)publisher,一個(gè)publisher可以同時(shí)向多個(gè)subscriber發(fā)送消息,subscriber 接收消息會(huì)進(jìn)行處理(回調(diào)函數(shù) callback),publisher發(fā)送消息后就繼續(xù)執(zhí)行下一個(gè)動(dòng)作,消息的狀態(tài)和處理結(jié)構(gòu)都不會(huì)影響publisher執(zhí)行,subscriber只管消息接受和處理,publisher掛死不會(huì)對(duì)subscriber節(jié)點(diǎn)狀態(tài)影響,所以topic通信實(shí)現(xiàn)了node之間的解耦,此通信方式屬于異步通信。
rostopic list 列出當(dāng)前所有topic
rostopic info topic_name 顯示某個(gè)topic的屬性信息
rostopic echo topic_name 顯示某個(gè)topic的內(nèi)容
rostopic pub topic_name 向某個(gè)topic發(fā)布內(nèi)容
rostopic bw topic_name 查看某個(gè)topic的帶寬
rostopic hz 查看某個(gè)topic的頻率
rostopic find topic_type 查看某個(gè)類型的topic
rostopic type topic_name 查看某個(gè)topic類型的msg
message: 直觀查看message就是一種數(shù)據(jù)格式。嚴(yán)格說按照規(guī)定的格式發(fā)送的數(shù)據(jù)就是message消息,所以消息既是內(nèi)容也是標(biāo)準(zhǔn)格式。基本的msg包括bool、int8、int16、int32、int64(以及uint)、float、float64、string、time、 duration、header、可變長數(shù)組array[]、固定長度數(shù)組array[C]。
rosmsg list 列出系統(tǒng)消息
rosmsg show msg_name 顯示某個(gè)msg的格式
---常見消息名稱--
Vector 矢量; 向量
twist 轉(zhuǎn)動(dòng),旋轉(zhuǎn)
covariance 協(xié)方差;協(xié)變性;共離散;
Odometry 里程計(jì)
quaternion 四元組
- 話題的通信機(jī)制
此處假設(shè) Talker 首先啟動(dòng),可分成圖中所示的七步來分析建立通信的詳細(xì)過程:
-
Talker 注冊(cè)Talker 啟動(dòng),通過 1234 端口使用 RPC 向 ROS Master 注冊(cè)發(fā)布者的信息,包含所發(fā)布消息的話題名;ROS master 會(huì)將節(jié)點(diǎn)的注冊(cè)信息加入注冊(cè)列表中。
-
Listener 注冊(cè)Listener 啟動(dòng),同樣通過 RPC 向 ROS Master 注冊(cè)訂閱者的信息,包含需要訂閱的話題名。
-
ROS Master 進(jìn)行信息匹配Master 根據(jù) Listener 的訂閱信息從注冊(cè)列表中進(jìn)行查找,如果沒有找到匹配的發(fā)布者,則等待發(fā)布者的加入;如果找到匹配的發(fā)布者信息,則通過 RPC 向 Listener 發(fā)布 Talker 的 RPC 地址信息。
-
Listener 發(fā)送連接請(qǐng)求Listener 接收到 Master 發(fā)回的 Talker 地址信息,嘗試通過 RPC 向 Talker 發(fā)送連接請(qǐng)求,傳輸訂閱的話題名、消息類型以及通信協(xié)議(TCP/UDP)。
-
Talker 確認(rèn)連接請(qǐng)求Talker 接收到 listener 發(fā)送的連接請(qǐng)求后,繼續(xù)通過 RPC 向 Listener 確認(rèn)鏈接信息,其中包含自身的 TCP 地址信息。
-
Listener 嘗試與 Talker 建立網(wǎng)絡(luò)連接Listener 接收到確認(rèn)信息后,使用 TCP 嘗試與 Talker 建立網(wǎng)絡(luò)連接。
-
Talker 向 Listener 發(fā)布數(shù)據(jù)成功建立連接后,Talker 開始向 Listener 發(fā)送話題消息數(shù)據(jù)。
從上面的分析中可以發(fā)現(xiàn),前五個(gè)步驟使用的通信協(xié)議都是 RPC,最后發(fā)布數(shù)據(jù)的過程才使用到 TCP。ROS Master 在節(jié)點(diǎn)建立連接的過程中起到了重要作用,但是并不參與節(jié)點(diǎn)之間最終的數(shù)據(jù)傳輸。
三、service<-->srv<-->parameter <-->action
service: 請(qǐng)求--查詢雙向同步通信模型,service分層兩部分,客戶端(client)和服務(wù)端(server)。客戶端(client)發(fā)送請(qǐng)求(request)要等服務(wù)端(server)處理,反饋回復(fù)(reply)才會(huì)發(fā)送下一個(gè)請(qǐng)求到服務(wù)端(server).
名稱 | topic | service |
---|---|---|
通信方式 | 異步通信 | 同步通信 |
實(shí)現(xiàn)原理 | TCP/IP | TCP/IP |
通信模型 | publisher/subscriber | request/replay |
映射關(guān)系 | 多對(duì)多 | 多對(duì)一 |
特點(diǎn) | subs收到數(shù)據(jù)會(huì)回調(diào)callback | 遠(yuǎn)程過程調(diào)用(RPC)服務(wù)器端的服務(wù) |
應(yīng)用場景 | 連續(xù)、高頻的數(shù)據(jù)發(fā)布 | 偶爾使用的功能、具體任務(wù) |
舉例 | 激光雷達(dá)、里程計(jì)發(fā)布數(shù)據(jù) | 拍照、逆解計(jì)算、開關(guān)傳感器 |
注意:遠(yuǎn)程過程調(diào)用(RPC)可以理解為一個(gè)進(jìn)程里面調(diào)用另外一個(gè)進(jìn)程的函數(shù)。
rosservice list 顯示服務(wù)列表
rosservice info 打印服務(wù)信息
rosservice type 打印服務(wù)類型
rosservice uri 打印服務(wù)ROSRPC uri(統(tǒng)一資源標(biāo)識(shí),URI包含URL)
rosservice call 使用所提供的args調(diào)用服務(wù)
rosservice args 打印服務(wù)參數(shù)
rosservice find 查找服務(wù)
srv: service的數(shù)據(jù)類型,service通信的數(shù)據(jù)格式定義在*srv中,包含請(qǐng)求(request)和響應(yīng)(reply)兩部分。
rossrv show 顯示服務(wù)描述
rossrv list 列出所有服務(wù)
rossrv md5 顯示服務(wù)md5
rossrv package 列出包服務(wù)
rossrv packages 列出包含服務(wù)的包
- 服務(wù)通信機(jī)制
服務(wù)是一種帶有應(yīng)答的通信機(jī)制,通信原理如下圖所示,與話題的通信相比,其減少了 Listener 與 Talker 之間的 RPC 通信。
- Talker 注冊(cè)Talker 啟動(dòng),通過 1234 端口使用 RPC 向 ROS Master 注冊(cè)發(fā)布者的信息,包含所發(fā)布消息的話題名;ROS master 會(huì)將節(jié)點(diǎn)的注冊(cè)信息加入注冊(cè)列表中。
- Listener 注冊(cè)Listener 啟動(dòng),同樣通過 RPC 向 ROS Master 注冊(cè)訂閱者的信息,包含需要訂閱的服務(wù)名。
- ROS Master 進(jìn)行信息匹配Master 根據(jù) Listener 的訂閱信息從注冊(cè)列表中進(jìn)行查找,如果沒有找到匹配的服務(wù)提供者,則等待該服務(wù)提供者的加入;如果找到匹配的服務(wù)提供者信息,則通過 RPC 向 Listener 發(fā)布 Talker 的 TCP 地址信息。
- Listener 嘗試與 Talker 建立網(wǎng)絡(luò)連接Listener 接收到確認(rèn)信息后,使用 TCP 嘗試與 Talker 建立網(wǎng)絡(luò)連接,并發(fā)送服務(wù)的請(qǐng)求數(shù)據(jù)。
- Talker 向 Listener 發(fā)布數(shù)據(jù)Talker 接收到服務(wù)請(qǐng)求和參數(shù)后,開始執(zhí)行服務(wù)功能,執(zhí)行完成后,向 Listener 發(fā)送應(yīng)答數(shù)據(jù)。
parameter server: 參數(shù)服務(wù)器維護(hù)的一般是靜態(tài)數(shù)據(jù)字典,它使用互聯(lián)網(wǎng)傳輸,在節(jié)點(diǎn)管理器master中運(yùn)行,實(shí)現(xiàn)整個(gè)通信。
rosparam set param_key param_value 設(shè)置參數(shù)****rosparam get param_key 顯示參數(shù) rosparam load file_name 從文件加載參數(shù) (yaml格式) rosparam dump file_name 保存參數(shù)到文件 (yaml格式)rosparam delete 刪除參數(shù)rosparam list 列出參數(shù)名稱
-
參數(shù)管理機(jī)制
參數(shù)類似于 ROS 中的全局變量,由 ROS Master 進(jìn)行管理,其通信機(jī)制較為簡單,不涉及 TCP/UDP 的通信。
-
- Talker 設(shè)置變量Talker 使用 RPC 向 ROS Master 發(fā)送參數(shù)設(shè)置數(shù)據(jù),包含參數(shù)名和參數(shù)值;ROS Master 會(huì)將參數(shù)名和參數(shù)值保存到參數(shù)列表中。
- Listener 查詢參數(shù)值Listener 通過 RPC 向 ROS Master 發(fā)送參數(shù)查找請(qǐng)求,包含索要查找的參數(shù)名。
- ROS Master 向 Listener 發(fā)送參數(shù)值Master 根據(jù) Listener 的查找請(qǐng)求從參數(shù)列表中進(jìn)行查找,查找到參數(shù)后,使用RPC 將參數(shù)數(shù)值發(fā)送給 Listener。
這里需要注意的是,如果 Talker 向 Master 更新參數(shù)值,Listener 在不重新查詢參數(shù)值的情況下是無法知曉參數(shù)值已經(jīng)被更新的。所以在很多場景中,需要一種動(dòng)態(tài)參數(shù)更新機(jī)制。
action: 動(dòng)作類似service,屬于請(qǐng)求--查詢雙向同步通信模型,但是通信過程連續(xù)反饋狀態(tài)信息和隨時(shí)終止請(qǐng)求。通信雙方在action protocol 下通過消息進(jìn)行數(shù)據(jù)交流,client和server為用戶提供API來請(qǐng)求目標(biāo)或者通過函數(shù)調(diào)用和回調(diào)來執(zhí)行目標(biāo)。
action protocal: action協(xié)議包含三部分,目標(biāo)(設(shè)定終點(diǎn)),反饋(實(shí)時(shí)狀態(tài)信息),結(jié)果(時(shí)長、最終姿態(tài))。
ROS1和ROS2通信架構(gòu)比對(duì)
這里主要給大家介紹ROS2和ROS1的通信架構(gòu)區(qū)別,ROS1和ROS2的架構(gòu)如下,可以分成3層:OS層、中間層和應(yīng)用層
- OS層:ROS1主要構(gòu)建在Linux上,但ROS2支持多個(gè)操作系統(tǒng)。
- 中間層:ROS1通信基于TCPROS/UDPROS,而ROS2通信基于DDS(data distribution service)數(shù)據(jù)分發(fā)服務(wù)。它是專門為RTOS設(shè)計(jì)的數(shù)據(jù)分發(fā)/訂閱標(biāo)準(zhǔn),其技術(shù)關(guān)鍵是以數(shù)據(jù)為核心的發(fā)布/訂閱 模型 DCPS(data-centric publish-subscribe),DCPS模型類似現(xiàn)在流行的容器命名空間技術(shù),創(chuàng)建了一個(gè)全局?jǐn)?shù)據(jù)空間,空間內(nèi)的進(jìn)程都可以直接訪問。另外ROS2的intra-process 和ROS1的nodelet 數(shù)據(jù)傳輸方式類似,只是更名了而已,哈哈哈。
- 應(yīng)用層:ROS1強(qiáng)依賴于master單點(diǎn),只要單點(diǎn)就會(huì)降低系統(tǒng)的可靠性,所以ROS1只適用于實(shí)驗(yàn)室研究,無法商用。ROS2取消了master節(jié)點(diǎn)管理器,節(jié)點(diǎn)間使用discover發(fā)現(xiàn)機(jī)制幫助彼此建立鏈接。
ROS 2 的通信模型
ROS 1的通信模型主要包含話題、服務(wù)等通信機(jī)制,ROS 2的通信模型會(huì)稍顯復(fù)雜,加入了很多DDS的通信機(jī)制。如下圖所示:
基于DDS數(shù)據(jù)分發(fā)服務(wù)的ROS2模型包含以下幾個(gè)關(guān)鍵概念。
參與者(Participant) :在 DDS 中,每一個(gè)發(fā)布者或者訂閱者都成為參與者,對(duì)應(yīng)于一個(gè)使用 DDS 的用戶,可以使用某種定義好的數(shù)據(jù)類型來 讀/寫 全局?jǐn)?shù)據(jù)空間。
發(fā)布者(Publisher) :數(shù)據(jù)發(fā)布的執(zhí)行者,支持多種數(shù)據(jù)類型的發(fā)布,可以與多個(gè)數(shù)據(jù)寫入器(DataWriter)相聯(lián),發(fā)布一種或多種主題(Topic)的消息。
訂閱者(Subscriber) :數(shù)據(jù)訂閱的執(zhí)行者,支持多種數(shù)據(jù)類型的訂閱,可以與多個(gè)數(shù)據(jù)讀取器(DataReader)相聯(lián),訂閱一種或多種主題(Topic)的消息。
數(shù)據(jù)寫入器(DataWriter) :上層應(yīng)用向發(fā)布者更新數(shù)據(jù)的對(duì)象,每個(gè)數(shù)據(jù)寫入器對(duì)應(yīng)一個(gè)特定的Topic,類似于ROS 1中的一個(gè)消息發(fā)布者。
數(shù)據(jù)讀取器(DataReader) :上層應(yīng)用從訂閱者讀取數(shù)據(jù)的對(duì)象,每個(gè)數(shù)據(jù)讀取器對(duì)應(yīng)一個(gè)特定的Topic,類似于ROS 1中的一個(gè)消息訂閱者。
話題(Topic) :和 ROS 1 中的概念類似,話題需要定義一個(gè)名稱和一種數(shù)據(jù)結(jié)構(gòu),但 ROS 2 中的每個(gè)話題都是一個(gè)實(shí)例,可以存儲(chǔ)該話題中的歷史消息數(shù)據(jù)。
質(zhì)量服務(wù)原則(Quality of Service) :簡稱 QoS Policy,這是 ROS 2 中新增的、也是非常重要的一個(gè)概念,控制各方面與底層的通信機(jī)制,主要從時(shí)間限制、可靠性、持續(xù)性、歷史記錄這幾個(gè)方面,滿足用戶針對(duì)不同場景的數(shù)據(jù)需求。
- 實(shí)時(shí)性增強(qiáng):數(shù)據(jù)必須在 deadline 之前完成更新;
- 持續(xù)性增強(qiáng):DDS 可以為 ROS 2 提供數(shù)據(jù)歷史服務(wù),新加入的節(jié)點(diǎn)也可以獲取發(fā)布者發(fā)布的所有歷史數(shù)據(jù);
- 可靠性增強(qiáng):配置可靠性原則,用戶可以根據(jù)需求選擇性能模式(BEST_EFFORT)或者穩(wěn)定模式(RELIABLE)。
-
通信
+關(guān)注
關(guān)注
18文章
6174瀏覽量
137369 -
通信方式
+關(guān)注
關(guān)注
0文章
24瀏覽量
9230 -
ROS
+關(guān)注
關(guān)注
1文章
284瀏覽量
17560
發(fā)布評(píng)論請(qǐng)先 登錄
基于串口的STM32通過rosserial和ROS系統(tǒng)通信的代碼
ROS與STM32是如何進(jìn)行通信的
RT-Thread實(shí)時(shí)操作系統(tǒng)與ROS2是怎樣進(jìn)行通信的
基于無線wifi網(wǎng)絡(luò)的X3派和PC虛擬機(jī)通過ROS2實(shí)現(xiàn)跨設(shè)備通信
ROS與STM32通信

如何初始化ROS并創(chuàng)立鏈接

ros的基本概念是什么
ros1和ros2的通信模型

ROS通信接口機(jī)制介紹

評(píng)論