【自造DIARY】ROS 1.0 訊息傳遞方式教學(上)

作者:創客萊吧MakerLab

本文透過實際輸入指令查找的方式,講解主節點(Master Node)、發布者節點(Publisher Node)、訂閱者節點(Subscriber Node)、主題(Topic)、訊息(Message)的關係,一起輕鬆應用 ROS 技術。

ROS 1.0 系統安裝完成後,便可以利用 ROS 1.0 系統內建的教學 — package turtlesim 來了解 ROS 系統的訊息傳遞方式。在開始前,請先確保完成且知悉下列事項:

  1. 準備好已安裝 ROS 1.0 系統的個人電腦或單板電腦,安裝方式可查閱輕鬆應用 ROS 機器人操作系統的技術—ROS 1.0 安裝教學。當我們將 ROS 1.0 系統安裝完成後,便可以開始利用 ROS 1.0 系統內建的教學—package turtlesim 來了解 ROS 系統的訊息傳遞方式
  2. 開啟分頁型 Terminal 的快捷鍵為 「 Ctrl + shift + T」
  3. Ø 開頭若是此符號,表示為需要輸入的指令

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

讓註冊 Master 的電腦,擁有一組 IP 位置

讓電腦擁有 IP 位置(圖片來源:創客萊吧提供)

這張圖所代表的意思,便是決定由哪一台電腦執行「roscore」指令,向電腦所處的區域網路,註冊「 Master Node」。首先,我們需要先讓虛擬機器(本篇文章皆採用實體名稱為 makerlab 的虛擬機器)擁有一組 IP 位置,而我們使用的 「虛擬機器 Virtual box」,預設是透過「NAT」的方式獲取 IP位置,因此若是僅在虛擬機器上使用 ROS 1.0 系統,是可以正常執行的;但若是想與外部任何設備進行訊息傳遞可能就沒辦法了。(解決方法將會在輕鬆應用 ROS 的技術—理解 ROS 1.0 機器人操作系統訊息傳遞方式(下) 說明)

向所在的區域網路,註冊 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 的指令(圖片來源:創客萊吧提供)

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

查詢目前的節點(Node)、主題(Topic)、 訊息(Message)(圖片來源:創客萊吧提供)

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

查詢目前系統正在執行的節點與資訊(圖片來源:創客萊吧提供)

由上方的 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),或是訂閱(Subscribe)多個主題(Topic)。

接下來,我們來查看主題(Topic) /turtle1/cmd_vel 的資訊,Ø 查看主題(Topic)/turtle1/cmd_vel 資訊的指令為 rostopic info /turtle1/cmd_vel

Ø 查看主題(Topic)/turtle1/cmd_vel 資訊的指令為 rostopic info /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),而其實每個主題(Topic)裡的資訊內容,便是訊息(Message)。

那我們就來查看主題(Topic)/turtle1/cmd_vel 的訊息(Message)geometry_msgs/Twist ,看看它擁有什麼樣的資料格式?Ø 查看訊息(Message)geometry_msgs/Twist 的指令為 rosmsg show geometry_msgs/Twist

輸入查看訊息(Message)geometry_msgs/Twist 的指令 rosmsg show geometry_msgs/Twist(圖片來源:創客萊吧提供)

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

(圖片來源:創客萊吧提供)

烏龜老闆移動時所需要的動作

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 1.0 系統,完成多台電腦之間的互相通訊。這意味著你將學會按下 A 電腦的方向鍵,然後遠端操控 B 電腦的烏龜老闆喔!也請記得準備好另外一台已裝好 ROS 1.0 系統的電腦(或是單板電腦,如樹梅派)。

(本文轉載自創客萊吧MakerLab原文連結;責任編輯:賴佩萱)

創客萊吧MakerLab

分享有趣的創作與教學,提供Maker們創作的軍火庫,DIY 零件 | 套件| 工具。
創客萊吧MakerLab

Author: 創客萊吧MakerLab

分享有趣的創作與教學,提供Maker們創作的軍火庫,DIY 零件 | 套件| 工具。

Share This Post On

2 Comments

  1. very useful for beginner!! nice job.

    Post a Reply

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *