ROS學習(3) ROS通訊架構

2021-10-01 16:45:46 字數 3641 閱讀 3386

ros有三個層級的概念,分別是:檔案系統級、計算圖級和開源社群級。

ros計算圖:主要是指程序之間(節點之間)的通訊。ros建立了乙個連線所有程序的網路,通過這個網路節點之間完成互動,獲取其他節點發布的資訊。圍繞計算圖級和節點,一些重要的概念也隨即產生:節點節點管理器引數伺服器訊息服務主題(或稱話題)和訊息記錄包

ros的通訊架構是ros的靈魂,也是整個ros正常執行的關鍵所在。ros的通訊方式有以下四種:

topic 主題

service 服務

parameter service 引數伺服器

actionlib 動作庫

ros中的通訊方式中,topic是常用的一種。對於實時性、週期性的訊息,使用topic來傳輸是最佳的選擇。topic是一種點對點的單向通訊方式,這裡的「點」指的是node,也就是說node之間可以通過topic方式來傳遞資訊。topic要經歷下面幾步的初始化過程:首先,publisher節點和subscriber節點都要到節點管理器進行註冊,然後publisher會發布topic,subscriber在master的指揮下會訂閱該topic,從而建立起sub-pub之間的通訊。注意整個過程是單向的。其結構示意圖如下:

主題主題型別

訊息格式

訊息舉例

rostopic list

rostopic type [topic name ]

rosmsg show [topic type]

rostopic echo [topic name]

msg檔名

topic是ros中的一種單向的非同步通訊方式。然而有些時候單向的通訊滿足不了通訊要求,比如當一些節點只是臨時而非週期性的需要某些資料,如果用topic通訊方式時就會消耗大量不必要的系統資源,造成系統的低效率高功耗。

這種情況下,就需要有另外一種請求-查詢式的通訊模型。這節我們來介紹ros通訊中的另一種通訊方式——service(服務)。

為了解決以上問題,service方式在通訊模型上與topic做了區別。service通訊是雙向的,它不僅可以傳送訊息,同時還會有反饋。所以service包括兩部分,一部分是請求方(clinet),另一部分是應答方/服務提供方(server)。這時請求方(client)就會傳送乙個request,要等待server處理,反饋回乙個reply,這樣通過類似「請求-應答」的機制完成整個服務通訊。

這種通訊方式的示意圖如下:

node b是server(應答方),提供了乙個服務的介面,叫做/service,我們一般都會用string型別來指定service的名稱,類似於topic。node a向node b發起了請求,經過處理後得到了反饋。

service是同步通訊方式,所謂同步就是說,此時node a發布請求後會在原地等待reply,直到node b處理完了請求並且完成了reply,node a才會繼續執行。node a等待過程中,是處於阻塞狀態的成通訊。這樣的通訊模型沒有頻繁的訊息傳遞,沒有衝突與高系統資源的占用,只有接受請求才執行服務,簡單而且高效。

與前兩種通訊方式不同,引數伺服器也可以說是特殊的「通訊方式」。特殊點在於引數伺服器是節點儲存引數的地方、用於配置引數,全域性共享引數。引數伺服器使用網際網路傳輸,在節點管理器中執行,實現整個通訊過程。

引數伺服器,作為ros中另外一種資料傳輸方式,有別於topic和service,它更加的靜態。引數伺服器維護著乙個資料字典,字典裡儲存著各種引數和配置。字典,其實就是乙個個的鍵值對。

命令功能

rosparam list

列出節點引數列表

rosparam get /

獲取伺服器所有引數資料

rosparam set

引數設定

actionlib是ros中乙個很重要的庫,類似service通訊機制,actionlib也是一種請求響應機制的通訊方式,actionlib主要彌補了service通訊的乙個不足,就是當機械人執行乙個長時間的任務時,假如利用service通訊方式,那麼publisher會很長時間接受不到反饋的reply,致使通訊受阻。當service通訊不能很好的完成任務時候,actionlib則可以比較適合實現長時間的通訊過程,actionlib通訊過程可以隨時被檢視過程進度,也可以終止請求,這樣的乙個特性,使得它在一些特別的機制中擁有很高的效率。

通訊機制名稱

用途topic

非同步通訊,實時群聊

service

臨時而非週期,查詢

parameter server

引數靜態不變

action

針對service模式,執行任務時間較長

2.6.1 topic

使用turtlesim模擬器學習ros通訊架構

# open the first terminal

roscore

# open the second terminal

rosrun turtlesim turtlesim_node

# open the thrid terminal

rosnode list #view the node

rosnode info /turtlesim #檢視改節點所有相關的通訊業務

rostopic list

rostopic type

/turtle1/color_sensor

rosmsg show turtlesim/color

rostopic echo

/turtle1/color_sensor

2.6.2 service服務

rosservice call < service name> < service argument>

rosservice call /turtle1/teleport_absolute 1 1 0
2.6.3 引數伺服器
rosparam list

rosparam get /

rosparam set background_b 0

rosparam set background_g 0

rosparam set background_r 255

rosservice call /clear #clear的型別為empty沒有實參

(3)ROS學習 建立ROS訊息和ROS服務

2 srv 服務 乙個srv檔案描述乙個服務。它由兩部分組成 請求 request 和響應 response 3 msg檔案存放在軟體包的msg目錄下,srv檔案則存放在srv目錄下。下面,我們將在之前建立的軟體包裡定義乙個新的訊息。1 在 catkin ws src learning commun...

ROS學習 ROS通訊架構

作用 每個node啟動時都要想master註冊,管理node之間的通訊 可實現點對點通訊 roscore 啟動ros master pkg裡面的可執行檔案執行的例項。啟動乙個node rosrun 包名 節點名 rosnode rosnode list檢視當前執行的node資訊 rosnode in...

學習3 ROS檔案系統

本次學習主要為掌握很多ros終端命令。這些終端命令非常接近於linux本身的終端命令,只不過命令前面加上了 ros 這3個字母。想象一下,我們現在是乙個ros作業系統。其他的系統檔案我們都不感興趣,我們只對ros感興趣。所以只使用roscd,來進入ros系統目錄下的某個包,用rospack find...