ROS知识【10】:ROS通信
一、前言
????????ROS的核心——分布式通信機制
????????ROS是一個分布式框架,為用戶提供多節點(進程)之間的通信服務,所有軟件功能和工具都建立在這種分布式通信機制上,所以ROS的通信機制是最底層也是最核心的技術。在大多數應用場景下,盡管我們不需要關注底層通信的實現機制,但是了解其相關原理一定會幫助我們在開發過程中更好地使用ROS。ROS最核心的三種通信機制如下。
- ? ? ? ? Topic機制
- ? ? ? ? service機制
- ? ? ? ? 共享參數機制
二、Topic機制
2.1 Topic原理:
????????話題在ROS中使用最為頻繁,其通信模型也較為復雜。在ROS中有兩個節點:一個是發布者Talker,另一個是訂閱著Listener。兩個節點分別發布、訂閱同一個話題,啟動順序沒有強制要求,此處假設Talker首先啟動,可分為如下七步分析建立通信的詳細過程。
-
1、Talker注冊
????????Talker啟動,通過1234端口使用RPC向ROS Master注冊發布者的信息,包含所發布消息的話題名;ROS Master會將節點的注冊信息加入注冊列表中。
-
2、Listener注冊
????????Listener啟動,同樣通過RPC向ROS Master注冊訂閱者的信息,包含需要訂閱的話題名。
-
3、ROS Master進行信息匹配
????????Master根據Listener的訂閱信息從注冊列表中進行查找,如果沒有找到匹配的發布者,則等待發布者的加入:如果找到匹配的發布者信息,則通過RPC向Listener發送Talker的RPC地址信息。
-
4、Listener發送連接請求
????????Listener接收到Master發回的Talker地址信息,嘗試通過RPC向Talker發送連接請求,傳輸訂閱的話題名、消息類型以及通信協議(TCP/UDP)
-
5、Talker確認連接請求
????????Talker接收到Listener發送的連接請求后,繼續通過RPC向Listener確認連接信息,其中包含自身的TCP地址信息。
-
6、Listener嘗試與Talker建立網絡連接
????????Listener接收到確認信息后,使用TCP嘗試與Talker建立網絡連接。
-
7、Talker向Listener發布數據
????????成功建立連接后,Talker開始向Listener發送話題消息數據。
????????從上面的分析中可以發現,前五個步驟使用的通信協議都是RPC,最后發布數據的過程才使用到TCP。ROS Master在節點建立連接的過程中起到了重要作用,但是并不參與節點之間最終的數據傳輸。
2.2 一個相機機器人例子
????????此時我們有一臺搭載了相機的機器人,我們希望機器人能夠獲取并處理相機采集的圖像數據,同時可以在筆記本上看到這些圖像。因此,我們定義了三個節點:相機節點(Camera Node)、圖像處理節點(Image Processing Node)和圖像顯示節點(Image Display Node)。所有的節點都注冊在節點管理器(ROS Master)中,管理器可以視為一個查詢表,各個節點能查到消息要發送到其他的哪個節點。
?節點可以發布消息到話題,或通過訂閱某個話題來接受消息。完成注冊后,Camera Node聲明它發布(Publish)了一個叫做/image_data的話題(Topic)。Image Processing Node和Image Display Node聲明它們訂閱(Subscribe)了這個Topic。話題中數據為Message,具有一定類型和數據結構(ROS中提供了標準數據類型,用戶也可自己定義),當Camera Node接收到相機發動的數據后,就立即將數據發送到另外兩個節點上。
三、通信機制二——服務通信機制
3.1 服務是一種帶有應答的通信機制,
與話題的通信相比,其減少了Listener與Talker之間的RPC通信。
?1、Talker注冊
Talker啟動,通過1234端口使用RPC向ROS Master注冊發布者的信息,包含所提供的服務名;ROS Master會將節點的注冊信息加入注冊列表中。
2、Listener注冊
Listener啟動,同樣通過RPC向ROS Master注冊訂閱者的信息,包含需要訂閱的服務名。
3、ROS Master進行信息匹配
Master根據Listener的訂閱信息從注冊列表中進行查找,如果沒有找到匹配的服務提供者,則等待該服務的提供者加入:如果找到匹配的服務提供者信息,則通過RPC向Listener發送Talker的TCP地址信息。
4、Listener與Talker建立網絡連接
Listener接收到確認信息后,使用TCP嘗試與Talker建立網絡連接,并且發送服務的請求數據。
5、Talker向Listener發布服務應答數據
Talker接收到服務請求和參數后,開始執行服務功能,執行完成后,向Listener發送應答數據。
?3.2 案例服務通信
????????話題通信的數據傳輸是單向的,訂閱端(Image Processing Node)被動接收發布端(Camera Node)的數據?這時候有人就問了,如果Image Processing Node想主動接收數據怎么辦。ROS中提供了另一種通信方式:服務通信。服務通信由請求方(Client)和應答方(Server)組成。
在服務通信中,Camera Node可以在ROS Master上注冊一個特定的服務(Service)。請求方(Image Processing Node)發送一個request,等待應答方(Camera Node)處理后,反饋回一個reply。
四、通信機制三——參數管理機制
參數類似于ROS中的全局變量,由ROS Master進行管理,其通信機制較為簡單,不涉及TCP/UDP的通信。
1、Talker設置變量
????????Talker使用RPC向ROS Master發送參數設置數據,包含參數名和參數值;ROS Master會將參數名和參數值保存到參數列表中。
2、Listener查詢參數值
????????Listener通過RPC向ROS Master發送參數查找請求,包含所要查找的參數名。
3、ROS Master向Listener發送參數值
????????Master根據Listener的查找請求從參數列表中進行查找,查找到參數后,使用RPC將參數值發送給Listener。
五、話題與服務的區別
話題和服務是ROS中最基礎也是使用最多的通信方法。具體總結如表所示。
話題與服務的區別
Name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 話題? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服務
同步性? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 異步? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?同步
通信模型? ? ? ? ? ? ? ? ? ? ? ? ? ?發布/訂閱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 客戶端/服務端
底層協議? ? ? ? ? ? ? ? ? ? ? ? ?ROSTCP/ROSUDP? ? ? ? ? ? ? ? ? ? ? ? ROSTCP/ROSUDP
反饋機制? ? ? ? ? ? ? ? ? ? ? ? ? ?無? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有
緩沖區? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 無
實時性? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?弱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 強
節點關系? ? ? ? ? ? ? ? ? ? ? ? ? ? ?多對多? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一對多(一個Server)
適用場景? ? ? ? ? ? ? ? ? ? ? ? ? ?數據傳輸? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯處理
????????
????????總之,話題是ROS中基于發布/訂閱模型的異步通信模式,這種方式將信息的產生和使用雙方解耦,常用于不斷更新的、含有較少邏輯處理的數據通信;而服務多用于處理ROS中的同步通信,采用客戶端/服務器模型,常用于數據量較少但有強邏輯處理的數據交換。
總結
以上是生活随笔為你收集整理的ROS知识【10】:ROS通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ros知识【09】:功能包介绍
- 下一篇: 华硕笔记本:Ubuntu 18.04安装