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


在開始閱讀本篇文章前,請先確認完成下列事項:
- 準備好兩台已安裝 ROS 1.0 系統之個人電腦或單板電腦,安裝方式可查閱 輕鬆應用ROS的技術 – ROS 1.0機器人操作系統安裝教學
- 開啟分頁型 Terminal 的快捷鍵為 「 Ctrl + shift + T」
- 已閱讀完成此篇教學文章:輕鬆應用 ROS 機器人作業系統的技術 – 理解 ROS 1.0 訊息傳遞方式(上)
- 本文章範例的 IP位置皆是在CIRCUS Pi 測試時所使用的,操作時請使用自己查詢到的 IP位置
- Ø 開頭若是此符號,表示為需要輸入的指令
若上述事項已準備就緒,便可以開始閱讀下列的教學文章囉!
當我們能夠初步的使用 ROS 1.0 系統簡單控制 turtlesim 中的小烏龜後,接下來要挑戰的是,操控別台機器上的小烏龜囉! 在本篇文章中,我們將可以學習到
1. 虛擬機器 Virtualbox 的網路設定與測試
2. 多台機器運行ROS 1.0 的設定方法
3. 虛擬機器遠端遙控樹莓派上的小烏龜測試
本篇文章的重點,是在「室內」使用多台機器一同使用 ROS1.0 系統。為了達成這一個目的,首先需要了解的便是 ROS 1.0系統的遠端通訊架構了,如下圖所示。

在多台機器上運行 ROS 1.0系統遠端通訊架構示意圖
ROS 1.0 系統透過 TCP/IP的通訊協定來完成與多個機器人之間的通訊。用簡單的話語來說,就是只要知道各個機器人間的本地IP位置,便可以在「室內」使用 ROS 1.0系統來完成各種訊息的傳送。
但這種方法有一個限制:
- 機器人間需要形成「區域網路」後,ROS系統才有辦法透過各自的本地IP位置來完成通訊。
若是想要多個機器人在「室外」使用 ROS 系統,則需要設定「遠程 ROS 1.0系統網路」,相關資訊可以至 ROS的官方教學網址查詢。
因此,我們需要先將想要使用 ROS 1.0 系統的所有機器人,連接到同一個區域網路後,才能夠使用 ROS 1.0 系統進行遠端通訊。1. 虛擬機器 Virtualbox 的網路設定與測試
( 若您並不是使用虛擬機器操作 ROS 1.0 系統,可以直接跳到第 2 步驟:多台機器運行ROS 1.0 的設定方法 )
在 理解 ROS 1.0 機器人訊息傳遞方式(上) 文章中,我們有提到過 VirtualBox的網路介面卡設定,預設的使用模式是 「NAT」,這會讓 VirtualBox無法與其他機器通訊。因此若是想要使用 VirtualBox 與多台機器一同使用 ROS 1.0 系統的話,第一步便是要更改 Virtualbox的網路介面卡設定。
1-1
先選擇想要使用的虛擬機器專案,本次範例選擇 ros_tutorial 專案,開啟網路設定的畫面

Virtualbox 開啟虛擬機器專案的網路設定
1-2
在網路設定畫面中,我們可以發現到虛擬專案的網路介面卡預設模式為「NAT」,我們需要將此選項更改為「橋接介面卡」。

更改網路介面卡預設模式
1-3
接下來我們需要告知虛擬機器專案要橋接實體電腦中的網路卡名稱。在此我們選擇實體電腦中的無線網路卡名稱。請特別注意,每台電腦所配備的無線網路卡不盡相同,名稱也會有所不同。通常無線網路卡名稱都會擁有 「 Wireless 」字樣。

選擇想要橋接的網路卡名稱
操作到這裡為止,虛擬機器專案中的網路介面卡便可以透過實體電腦中的無線網路卡,向外部的 AP分享器取得一組由該AP分享器所分配的 IP位置了。
這裡需要注意的是,實體電腦一定要先連接 AP分享器,VirtualBox 才能夠向 AP分享器取得一組 本地 IP。

Virtualbox 中 ros_tutorial 專案的網路連接架構示意圖
1-4
接下來,我們將虛擬機器啟動後,開啟 Terminal 開始查詢虛擬機器的本地 IP位置。
Ø 輸入指令:ifconfig

查詢虛擬機器的本地 IP
輸入完成後,可以查詢虛擬機器目前為止,關於網路介面的狀態。我們可以發現到關於「enp0s3」這張網路卡,已經擁有了從 AP分享器所分配出來的 IP位置,本篇文章範例為 「 192.168.1.39 」。

虛擬機器 ros_tutroial 專案的網路狀態資訊
1-5
接著我們來查看第二台已安裝好 ROS系統之電腦或單板電腦的 IP 位置。本篇文章將以單板電腦「樹莓派3 model B」為範例 ( 點此查看購買資訊 ),下圖為樹莓派3 model B 開啟Terminal視窗後,所顯示的使用者帳戶資訊與主機名稱。並且為了方便與虛擬機器專案的 Terminal 視窗有所區別,會在右下角多貼上一個樹莓派的圖案。

樹莓派開啟 Terminal 的畫面資訊
1-6
在已裝好 ROS1.0系統之樹莓派3 model B 中,我們先將樹莓派連線至指定的 AP分享器,需要注意的是,想要使用同一個 ROS系統的所有電腦與機器人,都需要連接到同一個 AP 分享器,如下圖所示。

AP分享器、虛擬機器、樹莓派的連線示意圖
1-7
將樹莓派3 model B連線至指定 AP分享器成功後,在 Terminal 視窗輸入 「 ifconfig 」指令後,一樣可以查看關於網路介面的狀態。樹莓派3 model B中已具備無線網路卡,當使用 「 ifconfig 」指令查詢後,可以發現無線網路卡 「wlan0」已經擁有一組由 AP分享器指派的IP位置。

樹莓派的網路狀態資訊
操作到此步驟後,我們兩台電腦之間的區域網路已經形成了,相關的網路架構圖如下圖所示

AP分享器、虛擬機器、樹莓派的區域網路連線架構示意圖
仔細觀察 AP分享器、 VirtualBox 與樹莓派之間的擁有的 IP,我們可以發現網域皆是「 192.168.1.X」,這表示我們已經利用 AP分享器,讓兩台電腦形成一個簡單的區域網路囉!
1-8
接下來,我們需要使用 「ping 」指令,來測試兩台電腦是否能夠成功地進行通訊。
在虛擬機器上,打開 Terminal 視窗,輸入下面的指令。這裡需要注意的是,輸入的 IP 必須要是 樹莓派的本地 IP 。
Ø 輸入指令:ping 192.168.1.134

虛擬機器 ros_tutorial 與 樹莓派的連線測試成功動畫
若是發現無法成功連線時,主要問題有下面兩個:
1. 實體電腦未連接至指定的 AP 分享器
2. 實體電腦的防火牆未關閉,擋住虛擬機器與樹莓派之間的通訊
若上述兩個問題排除後,連線測試仍舊是失敗的,可以考慮讓虛擬機器掛載一個 USB 型無線網路卡 ,在這裡推薦此型號之 USB無線網路卡 : EDIMAX EW-7822ULC ( 點此查看購買資訊 )。
若測試連線成功後,我們便可以開始進行多台機器運行ROS 1.0 的設定方法囉!
2-0
多台機器運行 ROS 1.0的設定方法
當所有機器人都處在同一個區域網路時,我們便可以開始編輯 Terminal 的環境變數設定檔。在此之前,我們可以先將各個機器人的 本地IP位置,放入一開始提及的在多台機器上運ROS 1.0系統網路架構圖,讓自己知道 ROS 1.0系統進行遠端訊息傳輸時的狀態。

本篇文章範例多台機器運行 ROS 1.0 系統時的狀態
我們需要先決定哪一個機器人為 Master ,以上方的架構示意圖為例,是由虛擬機器註冊一個 Master ,之後所有的訊息皆由這個 Master 來管理接收與發放訊息。
2-1 編輯虛擬機器端的環境變數設定檔
因此,我們先開起虛擬機器上的 Terminal ,輸入指令進入其中的環境變數設定檔。
Ø 使用 gedit 編輯環境變數設定檔指令:sudo gedit ~/.bashrc

開啟環境變數設定檔動畫
2-2
開啟環境變數設定檔後,在環境變數設定檔最下方加入兩行指令


虛擬機器端新增的環境變數指令
動畫示意圖如下

在環境變數設定檔最下方加入兩行指令
- export ROS_MASTER_URI : 此行變數即是告知 ROS 1.0系統將會由哪一台機器註冊 Master
- export ROS_HOSTNAME : 此行變數即是告知 ROS 1.0 系統本台機器的本地IP
編輯好虛擬機器的Terminal環境變數設定檔後,便可以儲存關閉,並且重新啟動 Terminal。
2-3 編輯樹莓派的環境變數設定檔
接下來我們要編輯的是樹莓派的 Terminal 環境變數設定檔,首先一樣在樹莓派的 Terminal 視窗輸入指令進入樹莓派的環境變數設定檔,隨後在環境變數設定檔下方加入兩行指令。

樹莓派端新增的環境變數指令
需要特別注意的是變數 ROS_MASTER_URI 指定的是註冊 Master 的機器本地IP位置,在本篇文章範例中即是虛擬機器;而變數 ROS_HOSTNAME 則是輸入樹莓派端的本地 IP位置。編輯完成後的結果如下圖所示

確認編輯的環境變數沒有問題後,便可儲存關閉檔案囉! 3. 虛擬機器遠端遙控樹莓派上的小烏龜測試
將上述兩個準備步驟完成後,我們便可以開始進行小烏龜的測試了!
測試的方法非常簡單,在樹莓派上開啟小烏龜的節點後,再至虛擬機器端開起移動的節點,我們便可以使用虛擬機器的鍵盤指令,遠端遙控樹莓派上的小烏龜喔!
詳細的操作步驟如下:
3-1 虛擬機器 ros_tutorial 先在區域網路上註冊一個 Master
Ø註冊 Master 指令 : roscore

虛擬機器 ros_tutroial 註冊 Master
3-2 樹莓派端執行 turtlesim_node 節點
Ø 執行 turtlesim_node 節點 指令 : rosrun turtlesim turtlesim_node

樹莓派端執行 turtlesim_node 節點
3-3 虛擬機器執行 turtle_teleop_key 節點
Ø 執行 turtle_teleop_key 節點 指令 : rosrun turtlesim turtle_teleop_key

虛擬機器執行 turtle_teleop_key 節點
3-4 遠端遙控小烏龜!
在虛擬機器上執行 turtle_teleop_key 節點的 terminal 按下方向鍵,開始控制樹莓派上的小烏龜吧!

虛擬機器遠端遙控樹莓派的小烏龜本篇範例文章小結
ROS 1.0 系統其實是透過在 terminal 的環境變數 ROS_MASTER_URI 與 ROS_HOSTNAME ,來決定要向哪一台機器所註冊的 Master 發布與訂閱 各種訊息 。只要能夠熟練地應用這項技巧,便可以開始進一步地使用 ROS1.0 的各種 Package ,來打造屬於自己的機器人系統囉!
小小預告一下,下一篇文章小編預計要使用「聲音」,來控制小烏龜與一台真正的全向輪平台 – 「智慧機器人」喔 ! !