學習輕鬆應用 ROS 機器人作業系統的技術 – 理解 ROS 訊息傳遞方式(上)

在開始閱讀本篇文章前,請先確保完成與知悉下列事項:

Ø 開頭若是此符號,表示為需要輸入的指令

若上述事項已準備就緒,便可以開始閱讀下列的教學文章囉 !

當我們將 ROS 1.0 系統安裝完成後,便可以開始利用 ROS 1.0 系統內建的教學 – package turtlesim 來了解 ROS系統的訊息傳遞方喔 !

在本篇文章中,我們將可以學習到:

  • Master、Node 、Topic與Message 的關係
  • rosrun、rostopic、rosnode、rosmsg 應用程式介面( API )的基本使用方法

那就先讓我們來看一下輕鬆的小漫畫吧

( 請注意 IP 位置為杜撰之位置 )

創客萊吧原創

ROS系統傳遞訊息過程 ( 創客萊吧原創漫畫 )

烏龜老闆前進兩步 gif 動畫圖

上述的小漫畫中,便簡略的介紹了,如果要讓turtlesim教學中的小烏龜前進時,所需要的各種準備與訊息傳遞方式。下面我們將用一格一格解析的方式,讓你更清楚的理解Master、Node 、Topic與 Message 之間的關係。1. 讓想要註冊Master 的電腦,擁有一組 IP位置

讓電腦擁有 IP 位置

第一格漫畫所代表的意思,便是決定由哪一台電腦執行 「 roscore 」指令,向電腦所處的區域網路,註冊 「 Master Node 」。

因此,我們需要先讓虛擬機器( 本篇文章皆採用實體名稱為 makerlab 的虛擬機器 ) 確保擁有一組 IP 位置。

而我們使用的 「虛擬機器 Virtualbox」,預設使用「NAT」方式來獲取 IP位置( 點此查看說明 )。

因此若是僅在虛擬機器上使用 ROS 1.0系統,是可以正常執行的。

但若是想與外部任何設備進行訊息傳遞時,將是沒有辦法的。( 解決方法將會在 輕鬆應用ROS的技術 – 理解ROS 1.0機器人操作系統訊息傳遞方式(下) 說明 )2. 向所在的區域網路,註冊 Master Node

向所在的區域網路註冊 Master Node

當虛擬機器擁有一組 IP 位置後,便可以執行指令,在該網域註冊 Master Node。

執行完畢後,請記得查看 ROS_MASTER_URI 所顯示的資訊,是否為虛擬機器的實體名稱 ( 本篇文章皆為 makerlab ),或是虛擬機器的 IP位置。

Ø 註冊 Master Node 指令: roscore

執行 roscore 指令輸入

接著,為了讓我們能夠更方便的學習 ROS 1.0 系統,官方教學中可以執行一個 「小烏龜」的程式碼檔案 ( 包含訂閱者節點 ( subscriber node ) ),讓我們能夠觀察小烏龜的運動軌跡,來理解 ROS 系統中的部分運作方式。

Ø 開啟小烏龜指令:rosrun turtlesim turtlesim_node

開啟小烏龜指令輸入 (開啟分頁型 terminal 快捷鍵 :「 Ctrl + Shift + T」)

Package turtlesim 存放的程式碼檔案

順便提醒大家,通常在設計 ROS系統 程式碼檔案時,大致上會將「節點名稱」與「程式碼檔案名稱」取為一模一樣的名稱喔!

因此,在 ros 官方教學網頁上,才會在部分 API 的使用方法中,要求輸入 「node_name」參數 ( 實際上是輸入程式碼檔案名稱 )。

當然若是取不一樣的名稱, ROS系統還是可以運作的。例如下面第三部份的介紹中,程式碼檔案名稱與節點名稱便為不一樣的名稱,此處的不同是為了讓大家理解程式碼檔案名稱與節點名稱的區別。 3.執行包含發布者節點(Publisher Node)的程式碼檔案

執行發布者節點( Publisher Node )

接著,我們的節點 「 teleop_turtle 」先生,想要發布一個「主題」,於是他透過各種管道,找到了 「 Master 」,一個剛剛註冊的主節點。

發布者節點想要找到主節點 ( Master )這個過程,便是利用ROS 1.0系統,執行發布者節點這個指令了。

Ø 執行包含發布者節點 teleop_turtle 的程式碼檔案 – 「 turtle_teleop_key 」指令: rosrun turtlesim turtle_teleop_key

執行 turtle_teleop_key 指令輸入4.查詢目前的節點( Node )、主題 ( Topic ) 、 訊息( Message )

查詢目前的節點( Node )、主題 ( Topic ) 、 訊息( Message )

當我們執行完 turtle_teleop_key的程式碼檔案之後,便可以利用 ROS系統中的小工具,查詢目前系統中正在執行的節點與其資訊。

Ø 查詢 ROS系統中正在執行的節點:rosnode list

查詢 ROS系統中正在執行的節點指令輸入

由上方的 gif 動畫,可以得知目前發布的節點有 3 個

  • /rosout
  • /teleop_turtle
  • /turtlesim

而想要查看這些節點的詳細資訊,可以使用 「 rosnode info 【node name】」指令。例如想要查看 /teleop_turtle 節點的資訊

Ø 查看 /teleop_turtle 節點的資訊指令:rosnode info /teleop_turtle

查看 /teleop_turtle 節點的資訊指令輸入

從ROS系統中回應的資訊,我們可以看到的結果如下圖

ROS系統回應的 /teleop_turtle 節點的資訊

從上圖我們可以知道,/teleop_turtle 節點發布了兩個主題( Topic )

  • /rosout
  • /turtle1/cmd_vel

需要特別注意的是:

  • 每個節點本身是可以同時進行發布與接收主題 ( Topic ) 的動作
  • 每個節點可以發佈( Publish ),或是訂閱( Subscriber )多個主題( Topic )

接下來,我們可以查看主題( Topic ) /turtle1/cmd_vel 的資訊

Ø 查看主題( Topic ) /turtle1/cmd_vel 的資訊指令:rostopic info /turtle1/cmd_vel

查看主題( Topic ) /turtle1/cmd_vel 的資訊指令輸入

到目前為止,我們分別查看了 Node 與 Topic。但如果系統過於龐大,開啟的節點多達上百個時,上述的查詢方法將變得有點繁複。因此,ROS系統中的 rqt 工具,便可以「動態流程圖 ( dynamic graph )」的方式,來呈現出節點(Node) 與 主題(Topic) 之間的關係。

Ø 呼叫動態流程圖 ( dynamic graph ) 的指令:rosrun rqt_graph rqt_graph

呼叫動態流程圖 ( dynamic graph ) 的指令輸入

接著,便會跳出動態流程圖 ( dynamic graph )的畫面,我們還需要將滑鼠移動到 主題( Topic ) 的字樣上,才會顯示出顏色讓我們更加方便的區分節點(Node)。

將滑鼠移動到主題( Topic ) 的字樣上

其中:

  • 藍色字體 : 發布者節點 ( Publisher Node )
  • 紅色字體 : 主題 ( Topic )
  • 綠色字體 : 訂閱者節點 ( Subscriber Node )

這樣,透過呼叫動態流程圖 ( dynamic graph )的方法,我們便可以快速了解到ROS系統中各個節點(Node)之間的關係與傳遞的主題(Topic)。

當我們知道了傳遞的主題( Topic ) 之後,接下來要了解的是訊息( Message )。

透過第4格漫畫,你可以清楚的理解到,每個主題( Topic )裡的資訊內容,便是 訊息( Message )。

這次,我們要來查看主題( Topic ) /turtle1/cmd_vel 的 訊息( Message ), geometry_msgs/Twist ,擁有的是什麼樣的資料格式。

Ø 查看訊息( Message ) geometry_msgs/Twist 的指令: rosmsg show geometry_msgs/Twist

查看訊息( Message ) geometry_msgs/Twist 的指令輸入

根據 ROS系統回應的資訊,訊息( Message ) geometry_msgs/Twist所記錄的資料格式為下圖:

訊息( Message ) geometry_msgs/Twist所記錄的資料格式5.烏龜老闆移動時所需要的動作

Turtle1 移動畫面

接著,要讓烏龜老闆開始動作的時候,實際上會透過訂閱者節點 ( Subscriber Node ) /turtlesim ,不斷地向主節點( Master Node )訂閱主題 ( Topic ) /turtle1/cmd_vel ,來理解現在他自己應該要如何動作才是正確的。

我們可以使用查看主題( Topic ) 回應的方式,將該主題( Topic ) 所發布的訊息 ( Message ) 內容,輸出在終端機上。

Ø 查看主題( Topic ) /turtle1/cmd_vel 所發布的訊息 ( Message )內容: rostopic echo /turtle1/cmd_vel

查看主題( Topic ) /turtle1/cmd_vel 所發布的訊息 ( Message )內容指令輸入

想要移動烏龜老闆時, 請記得要在開啟 turtle_teleop_key 程式碼檔案終端機內按下方向鍵喔!

本篇文章我們仔細地將主節點 ( Master Node ) 、發布者節點 ( Publisher Node )、訂閱者節點( Subscriber Node )、主題 ( Topic ) 、 訊息 ( Message )之間的關係,透過實際輸入指令查找的方式,一一地整理出來。

我們可以以一張圖來解釋上述的關係

主節點(Master Node) 、發布者(Publisher Node)、訂閱者(Subscriber Mode)與主題(Topic)的關係

下一篇文章,「 輕鬆應用 ROS 機器人操作系統的技術 – 理解 ROS 1.0 訊息傳遞方式(下) 」,我們將會介紹如何使用 ROS 1.0 系統,完成多台電腦之間的互相通訊喔~!這意味著你將學會按下 A電腦的方向鍵,然後遠端操控 B電腦的 烏龜老闆喔!

請記得準備好另外一台已裝好 ROS 1.0 系統的電腦喔(或是單板電腦,如樹莓派)!