天天看點

ROS計算圖級

上一節說到一個 package 可以包含多個可執行檔案(節點),可執行檔案需要被運作,就要了解ROS的通信架構,也就是計算圖級,例:

ROS計算圖級

小蘿蔔機器人擁有驅動系統,感覺系統,控制系統等,要讓它從指定位置到另一位置一定得啟動多個節點,計算圖級展示了 ROS 如何對這些節點進行管理和通信的。

計算圖級結構如下:

ROS計算圖級

節點管理器(master)和節點(node)

在 ROS 中要管理節點和程序,需要一個節點管理器,它的名稱是 master,它的存在有兩個作用:

1.每個節點啟動時都必須向它注冊

2.master管理節點(node)間的通信

是以,在啟動節點前,需要使用 roscore 指令啟動 master,roscore 還順帶啟動了 rosout(日志輸出) 和 parameter server(參數伺服器)

rosout 也是一個節點,負責記錄目前系統中的 error 或 warning 資訊,parameter server 則是做一些參數配置。

這裡再介紹一下節點(node),一個 node 就是一個程序,程序就是程式的一次執行,是以節點隻是 ROS 對程序的專有稱呼,接下來介紹一些執行個體:

首先安裝一個模拟器,用你使用的ROS發行版本名稱(例如electric、fuerte、groovy、hydro等)替換掉'<distro>'

sudo apt-get install ros-<distro>-ros-tutorials
           

開啟一個終端,運作

roscore
           

新開一個終端,運作

rosnode list
           

會看到

ROS計算圖級

隻有 roscore 啟動的日志輸出節點,用

rosnode info /rosout
           

檢視特定節點資訊

ROS計算圖級

接下來運作節點,用 rosrun 指令

rosrun turtlesim turtlesim_node
           

出現

ROS計算圖級

此時新開一個終端,再次運作 rosnode list

ROS計算圖級

發現多了一個節點,再用 rosnode info /turtlesim

ROS計算圖級

一個節點可以利用 rosrun + 包名 + 節點名,但是如果有幾十個幾百個呢?這時候 ROS 提供了一個更簡單的方法——roslaunch。上一節說到 pkg 下面存放有 launch 檔案,這個檔案就是 roslaunch 所要運作的檔案,是以,roslaunch + 包名 + launch名 就可以啟動 master 和 多個節點。

roslaunch 在啟動節點前會檢測系統是否已經啟動 master ,如果沒有,它會自動開啟 master。

launch 檔案寫法如下:

ROS計算圖級

通信方式

ROS提供了 主題(topic),服務(service),參數伺服器(parameter service) 和動作庫(actionlib) 這四種通信方式。

1.topic 通信方式和message

兩個節點需要通信,需要先定義一個共同的話題,就像這樣

ROS計算圖級

node 之間通過 publish - subscribe 方式通信。即節點 A 通過 topic 釋出消息,節點 B 通過 topic 訂閱消息。

一個節點可以釋出多個話題,一個節點可以訂閱多個話題。

舉個例子:

在剛才的小烏龜的例子中,新開一個終端,運作這個節點

rosrun turtlesim turtle_teleop_key
           

它可以讓你用方向鍵來控制小烏龜的運動,再開一個終端,安裝如下軟體:

sudo apt-get install ros-indigo-rqt
sudo apt-get install ros-indigo-rqt-common-plugins
           

再運作

rosrun rqt_graph rqt_graph
           

可以看到以下結果

ROS計算圖級

message

message 是 topic 内容的資料類型,定義在  *.msg 檔案中。message 可以了解為 C++ 中的int,float,類等,它的資料類型有如下:

ROS計算圖級

常用指令:

ROS計算圖級

2.service 通信方式

topic 通信方式是異步通信,比如現在有兩個檢測路障的節點,節點 A 釋出路況資訊,節點 B 檢測,如果是用 topic 通信方式,那麼節點 B 會一直訂閱話題,可是有效的訂閱是檢測到路障,因而這種方式會浪費大量的計算資源。而 service 通信方式則實作了同步通信,它會解決這一問題。

service 通信方式中,兩個節點之間的通信方式是request - reply 方式。

ROS計算圖級

和 topic 想似,srv 是 service 通信方式的資料格式,定義在 *.srv 檔案中。

常用指令:

ROS計算圖級

3.parameter service 參數伺服器

參數伺服器維護一個存儲着各種參數的字典,字典就是為了友善讀寫一些不常改變的參數,給它們加上索引,這個索引是唯一的。

ROS計算圖級

其中 rosparam load 後面的檔案必須遵從 yaml 格式

ROS計算圖級

通俗的說就是 key : 鍵值 。

4.Action 通信方式

在 service 通信方式中,client 送出請求後,會進入阻塞狀态,直到 server 完成了請求,才轉而繼續運作,在這期間,server 端究竟是在完成别的任務還是 server 也進入阻塞狀态,無法知曉。是以,action 是在 service 基礎上改進的通信方式。

action 通信過程中,server 會帶有一個狀态回報,

ROS計算圖級

發送的請求有 目标,取消目标,回傳的資訊有 狀态,任務完成後的結果,實時狀态。

通常用在 長時間(導航,機械臂運動),可搶占(可被打斷)的任務。

和 topic,service 相似,action 是 action 通信方式的資料格式,定義在 *.action 檔案中。

關于計算圖級的更詳細介紹會在後續文章中更新。

繼續閱讀