昨天有提到,ROS 架構下最常是用的文件系統就是 Package,而在 Package 當中又能劃分出更細的工作 (例如資料獲取、分析計算等等 ),因此,筆者在這邊先大概介紹整個 ROS 的運作系統,以下是示意圖:
這邊舉一個較為具體的說明,首先我們把 Node 想像是人, Publisher 是傳 Line 的人,Subscriber 是接收 Line 的人,而 Topic 就是聊天的主題,聊天的訊息內容則是 Message,最後 ROS master 可以理解為 Line 的伺服器。所以,ROS 架構下最小的單元其實是 Node。不同的 Nodes 之間可以透過主題 (Topic) 以及訊息 (Message) 來交換所需的 Data,而負責管理所有節點之間交換訊息的則是 Master,往後幾天我們也會逐步介紹這些東西,那麼現在就開始進入今天的主題 — Node 的介紹。
有了 Package 分工了,還需要再建立 Nodes 的理由,其包含以下幾個特點:
即使已經將一個龐大的專案分成許多的 Package 來運行,但是在每個 Package 中可能又能劃分出更多更微小的工作,如同現在社會結構,精密的分工,達到社會資源區愈趨向均衡,機器人的運作也是如此。例如某些 Nodes 負責接收數據,而某些負責發送數據等等,妥善的運用 Node 的優點,能夠讓整個專案更有效的管理、運行與維護。
了解 Node 的基本概念後,緊接著就來實作一個 Node 並且運行吧!上面有提到 Node 可以使用許多語言來撰寫,以下便是利用 Python 編寫 Node 的方法。首先先在昨天建立好的 Package 下創建一個 hello.py 檔:
roscd beginner_tutorial/src/
touch hello.py
vi touch hello.py
接著在裡面輸入程式,記得使用 vi 編輯檔案時,要按 i 才會進入編輯模式:
#!/usr/bin/env python
import rospy
rospy.init_node(‘hello_node’)
rospy.loginfo(‘Hello World’)
簡單的解釋一下 code 內容:
#!/usr/bin/env python # 告訴系統該檔案為 Python 檔。
import rospy # 導入 rospy 這個 class。
rospy.init_node(‘hello_node’) # 初始化一個名叫 hello_node 這個 node。
rospy.loginfo(‘Hello World’) # 在 Terminal 上印出 Hello World。
補充說明:
/usr(unix software resource) 放置系統相關軟體服務資料夾
/bin 放置主要應用工具必備執行檔 例:c++, g++, python...等
/env 環境配置參數存放
接著就直接在 Terminal 上輸入 python hello.py
,不過得注意的是,必須在此檔案所在的資料夾下才能用該指令 python [file_name]
執行,否則系統會找不到檔案!
而會產生這個錯誤其實上面有隱約提到,是因為目前這個 Node 還缺少了一個 Master 來管理他,雖然這個 Node 並沒有與其他 Nodes 交換訊息的需求,但基本上運行任何 Node 之前都必須先執行一個 Master,因此我們先執行 roscore
這個指令。
接著,由於 Node 執行的過程中都必須要有 Master 的存在,所以我們必須再新增一個 Terminal,重新輸入 python hello.py
,以下是成功執行這個 Node 的結果:
不知道這次介紹結束後,大家對 Node 的概念有沒有一些基本的認知呢?熟悉 Node 是 ROS 當中非常重要且基本的一環,因此,明天的主題仍然會與 Node 相關,請大家敬請期待!!