ROS 略談與基本安裝步驟

1. ROS 是什麼?

ROS 是在 Linux 中的,專門設計來控制機器人與自動化裝置的軟體架構。最初 ROS 由史丹佛大學的研究團隊開發,延續了接近三十年`Wikipedia上的資料顯示 ROS 1.0 從2010年才推出,這部分有待商榷),廣受歡迎。至今國外大部分使用此架構的開發者主要都集中在歐美國家的學術機構與產業界。幸運的是,台灣也逐漸引入 ROS 的使用,主要應用範圍仍侷限於少數公司內部開發以及少數學術機構,但如今機器人產業發展方興未艾,也許之後也能被大部分學術機構接受。發展多年後,針對各種功能,都可以在網路上找到充分的資料以及原始碼,很多功能都已經被實作,所以可以直接像積木塊一樣,拿到後,拼接起來完成自己的專案。 ROS 為 「Robotic Operation System」(機器人作業系統)的簡寫。顧名思義,這個架構主宰著機器的控制、辨識、資料收集等各方面的框架。ROS 之所以廣受歡迎的原因,就我個人的見解,是因為它很優雅的解決了多執行序( Multi-thread) 的艱難任務。並且,一件很複雜的任務,可以在這個架構下拆解成許多子任務,每一個子任務能用一個執行檔負責,到最後把所有執行檔,或稱節點(Node)串起來,就完成了一個專案。在這個框架下開發,確實跟傳統的開發專案方法不太一樣,一定有其學習曲線,尤其又沒有太多珠紋資料可供參考,確實對台灣自動化開發者而言,還是有點門檻。但是不用灰心喪志,其實了解其脈絡後,就會覺得整個架構並不困難。

2. ROS 的精神

ROS 建構在 Linux 之上,由 Workspace 以及 Master Node (讓我們稱之為「主節點」吧!)維繫在一起。所有的功能都被包在「包裹」(Package)裡,包裹裡面則存放著多個執行檔,稱之為節點(Node)。在一個大型專案中,通常會有一群的包裹,這個群集被稱之為「包裹堆」(Stack),這樣就有系統的將所有節點分門別類,依照各自的功能存放,也方便 ROS 中的編譯。 一個很重要的觀念就是,每個任務都應該被拆成許多子任務,因此每個節點的功能都應該盡量專精。舉例來說,如果今天要機器人伸手去拿擺在桌上的水果,那麼從相機取出資料是一個節點、處理影像資訊以辨識水果屬於令一個節點,座標轉換是一個節點,那麼操總手臂應該就屬於其他三四個節點的範疇。節點與節點間會互傳資料,這些資料被稱之為「訊息」(Message),訊息會投遞到一些「主題」(Topics)中。換句話說,可以把主題想像成筒子,不同的節點會把各種相關的訊息投遞到特定「主題」的容器中,讓其他需要的節點自由取用。在這邊,可以將節點想像成網路世界中的部落客和訪客,丟出訊息的節點被稱之為「發佈者」(Publisher),而接收訊息的節點,就叫作「訂閱者」(Subscriber)囉!真簡單! 在這樣的架構下,每個感測器都有其驅動程式,所以開發的時候,不必管相幾怎麼操作,只要專心在處理收到的訊息,再丟出去就可以。這衍生了幾項意義,第一就是 ROS 以主題和節點連結的網路架構,優雅的解決了多工的問題,第二,把控制偵測器這樣的次要程式碼跟主要的程式碼脫離開來,開發者能更簡單的專心於演算法的開發上,且更能做好 Unitary test,增加專案開發的便捷性。

3. ROS 中的架構

ROS 有許多版本,更新的頻率目前是每半年推出新的一版,就我所知,由早期還在 rosbuild 系列版本的 diamondback, electric, fuerte,到 catkin workspace 之後的過渡階段版本 Groovy,和之後的 Hydro, Indigo 和截稿前的最新版本 Jade。根據 Willow Garrage 的說法,之所以把工作空間架構從 rosbuild 改成 catkin,是因為要讓所有的包裹能在各種運算平台中都可以順利執行。所以,不可諱言,不同版本下寫的程式碼,可能會碰到只有在特定幾個版本中執行,因為該程式所需要的相依程式庫可能只會在特定幾個版本的 ROS 函式庫中有提供,但是在其他版本中缺少,造成編譯或執行錯誤。 那這邊可以整理出幾個重要的架構層級。


ROS的結構可以看做是節點與主題所組成的網路架構。

3.1 Workspace 工作空間

如果沒有工作空間,那就不能使用 ROS,就假設這是個虛擬平台,連結著所有的節點。如果你習慣在 Visual Studio 上開發的話,就相當於一個 Project,然後其他的專案檔就建置於其上,邏輯上,工作空間就像一個 Project 檔一樣。先建立了 Workspace 後,才能建立包裹,建立了包裹後,才能建立所有的節點。

3.2 Stack  包裹群

實際並不會有任何指令來控制包裹堆。包裹群只是一個概念。

3.3 Package  包裹

包裹中可以存放所需的節點。通常一個包裹代表一個特定的任務,節點則是任務的拆解子任務。譬如說,立體點雲圖之人體針刺這個包裹中,就會有多個處理點雲圖及辨識人體演算法的節點。

3.4 Node節點

節點,就是執行檔。通常會包含輸入與輸出資料。編譯完後,就可以直接當一塊積木,鑲嵌在其他積木上。

3.5 Launch file

你可能會問,節點這麼多,又把這些節點整合在不同包裹裡,那如果我要完整的功能,就代表一次必須開啟多個執行檔,那怎麼辦?ROS 中通常在包裹中都會有一個 Launch 資料夾,裡面存放不同的 launch 文件,只要執行一個 launch 文件,便會一次啟動所有需要的節點。Launch 文件甚至可以設定各執行檔的引數與參數,角色有點像 bash 文件,整合所有指令,相當方便!

3.6 Service 服務

在一個任務完成後,我們(或任何節點)會需要輸出,方便檢測結果,但是有時候我們並不需要其他節點拼命丟資料。這就好像我們開車,並不需要一直踩著油門讓車移動,而是踩一下油門,馬達才會轉動般,增加實用上的安全性與實際應用性。同樣的,有些時候,有些節點要被設計成,跟他請求一次,才讓節點輸出一次資料。

4. 安裝 ROS Workspace

講太多雜七雜八的理論,讓我來實作吧! 這邊需要聲明一下,這篇教學主要給碰到以下問題的人會比較有幫助,不過基本的步驟也適用於初學狀況。

  • 先前已經安裝了一個工作空間
  • 對於如何在多個工作空間切換,或者多個 ROS 版本間切換
  • 如果今天拿到的包裹是較早版本的 rosbuild 下撰寫的,但是我現在使用 Groovy 或者之後的版本的 ROS,那怎麼辦?需要開一個新的工作空間嗎?很頭痛欸!

4.1 設定環境

首先,可以這樣安裝工作空間:

$ mkdir -p your_ws/src $ cd your_ws/src $ catkin_init_workspace

如果你有兩個或以上的工作空間,或者不同版本的 ROS,那麼你的每個工作空間只允許一個版本使用,否則 ROS 無法找得到編寫好的程式。

$ source /opt/ros/%distro%/setup.bash

這個指令指定了該版本 ROS 的內建程式庫。其中 %distro% 的部份就以你現在使用的 ROS 版本代替。例如我正在使用的 ROS 版本是 Hydro,那麼上面的指令就是

$ source /opt/ros/hydro/setup.bash

然後再輸入

$ source ~/your_ws/devel/setup.bash

上面這行,指定所需要使用的工作空間。為了要確認兩者系統路徑正確,可以用

$ echo $ROS_PACKAGE_PATH 指令確認路徑。終端機可能會回覆類似以下訊息 /home/youruser/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks

注意:如果你只是需要切換不同版本的 工作空間,只要輸入第二行 source 的指令即可。 為了不要每次使用 ROS 都要重複打同樣的 source 指令,可以直接在 bashrc 系統 bash 文件中這樣打: $ vim ~/.bashrc 鍵入大寫 G,跳到最後一行,接著打

source /opt/ros/hydro/setup.bash

source ~/your_ws/devel/setup.bash

或者直接在終端機中鍵入

$ echo ‘source /opt/ros/%distro%/setup.bash’ >> ~/.bashrc $ echo ‘source ~/your_ws/devel/setup.bash’ >> ~/.bashrc

注意:個人經驗,每個工作空間在設定初期就已經跟某個 ROS 版本綁定,所以建議直接在不同版本環境下創見個別的工作空間,然後需要時在照上述的source 方式切換! 在 vimrc中,要切換路徑時,可以註解掉需要的 source 路徑,然後解除註解需要的路徑。

5. 更加深度的學習

如果你覺得看完了後來不知所云或者意猶未盡的話,別擔心,這是正常現象。如果你還想要更多參考資料,而且也不怕看英文的話,可以直接上 ROS 官方教學文件,建議耐心花一個禮拜邊看邊實機操作,這樣才可以把這些知識逐漸內化,讓之後的開發工作更加順暢。

其實寫完這篇文章後,我也發現自己尚有許多不足之處,關於 Actionlib 以及 service 的解說,也可以參考賴柏任的這篇文章,有更詳盡的解說,可以跟本篇對照。

寫在前面

大家好!由於近日研究機器人的關係,開始使用 ROS,但是大部份的資料都是英文的,國內少數幾位先驅,包括我的同學賴柏任(可以點我!去拜訪他的部落格),開始撰寫關於這個框架的教學部落格,因此,我也想開始創建自己的自學天地,當作筆記本,在與其他人合作時,也可以幫忙大家快速上手。

換句話說,這網站的存在宗旨是除存關於ROS以及機器人導航等相關學習筆記,但讚未來也有可能加入其他區塊的知識。但我並不打算將 ROS 的官方教學網頁直接應翻中,所以,還請各位看官們配合著各官方教學看。在這個網頁僅提供我自己對這些大架構的了解,也希望能幫助大家了解其中的意函。祝學習愉快!