上一節說到一個 package 可以包含多個可執行檔案(節點),可執行檔案需要被運作,就要了解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
會看到
隻有 roscore 啟動的日志輸出節點,用
rosnode info /rosout
檢視特定節點資訊
接下來運作節點,用 rosrun 指令
rosrun turtlesim turtlesim_node
出現
此時新開一個終端,再次運作 rosnode list
發現多了一個節點,再用 rosnode info /turtlesim
一個節點可以利用 rosrun + 包名 + 節點名,但是如果有幾十個幾百個呢?這時候 ROS 提供了一個更簡單的方法——roslaunch。上一節說到 pkg 下面存放有 launch 檔案,這個檔案就是 roslaunch 所要運作的檔案,是以,roslaunch + 包名 + launch名 就可以啟動 master 和 多個節點。
roslaunch 在啟動節點前會檢測系統是否已經啟動 master ,如果沒有,它會自動開啟 master。
launch 檔案寫法如下:
通信方式
ROS提供了 主題(topic),服務(service),參數伺服器(parameter service) 和動作庫(actionlib) 這四種通信方式。
1.topic 通信方式和message
兩個節點需要通信,需要先定義一個共同的話題,就像這樣
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
可以看到以下結果
message
message 是 topic 内容的資料類型,定義在 *.msg 檔案中。message 可以了解為 C++ 中的int,float,類等,它的資料類型有如下:
常用指令:
2.service 通信方式
topic 通信方式是異步通信,比如現在有兩個檢測路障的節點,節點 A 釋出路況資訊,節點 B 檢測,如果是用 topic 通信方式,那麼節點 B 會一直訂閱話題,可是有效的訂閱是檢測到路障,因而這種方式會浪費大量的計算資源。而 service 通信方式則實作了同步通信,它會解決這一問題。
service 通信方式中,兩個節點之間的通信方式是request - reply 方式。
和 topic 想似,srv 是 service 通信方式的資料格式,定義在 *.srv 檔案中。
常用指令:
3.parameter service 參數伺服器
參數伺服器維護一個存儲着各種參數的字典,字典就是為了友善讀寫一些不常改變的參數,給它們加上索引,這個索引是唯一的。
其中 rosparam load 後面的檔案必須遵從 yaml 格式
通俗的說就是 key : 鍵值 。
4.Action 通信方式
在 service 通信方式中,client 送出請求後,會進入阻塞狀态,直到 server 完成了請求,才轉而繼續運作,在這期間,server 端究竟是在完成别的任務還是 server 也進入阻塞狀态,無法知曉。是以,action 是在 service 基礎上改進的通信方式。
action 通信過程中,server 會帶有一個狀态回報,
發送的請求有 目标,取消目标,回傳的資訊有 狀态,任務完成後的結果,實時狀态。
通常用在 長時間(導航,機械臂運動),可搶占(可被打斷)的任務。
和 topic,service 相似,action 是 action 通信方式的資料格式,定義在 *.action 檔案中。
關于計算圖級的更詳細介紹會在後續文章中更新。