在開始閱讀本篇文章前,請先確保完成與知悉下列事項:
- 準備好已安裝 ROS 1.0 系統之個人電腦或單板電腦,安裝方式可查閱 輕鬆應用 ROS 機器人操作系統的技術 – ROS 1.0 安裝教學
- 開啟分頁型 Terminal 的快捷鍵為 「 Ctrl + shift + T」
Ø 開頭若是此符號,表示為需要輸入的指令
若上述事項已準備就緒,便可以開始閱讀下列的教學文章囉 !
當我們將 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 系統中的部分運作方式。
- ROS 系統 執行單一程式的 API : rosrun 【package】【node_name】
Ø 開啟小烏龜指令: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 系統的電腦喔(或是單板電腦,如樹莓派)!