經過這幾天漫長的系統設置後,終於要邁入 ROS 相關的主題了。筆者今天會向各位介紹catkin workspace 以及 ROS Package。Package 是整個 ROS 專案中最基礎的元素之一,像是如果想做一個鋼鐵人,一定會有負責動力的推進器程式包、負責火力的武器程式包、負責定位的 GPS 程式包等,目的在於將功能相同的執行檔、描述檔放在一起方便管理。因此未來想要執行任何專案時,其實就是根據需求組合不同功能的 Package,最後便能完成屬於自己的鋼鐵人。筆者希望大家在學習完之後,在未來能靈活運用,建置屬於自己的 Package。ROS Package 甚至能在不同的專案中使用,像是把鋼鐵人的機槍裝在不同台的鋼鐵人中,是不是很有趣呢?
在進行 ROS 開發之前,我們必須先建立一個屬於自己的工作區(Workspace,"ws")。簡而言之,工作區就好比 Windows Visual Studio 上的一個 Project,在這個工作區當中我們可以建立許多 Package 來完成 ROS 開發。目前 ROS 採用 catkin 編譯系統,目的在於對結構進行整合及標準化。
mkdir -p catkin_ws/src/
cd catkin_ws/
catkin_make
source ~/catkin_ws/devel/setup.bash
上述的 mkdir -p
與昨天所介紹的 mkdir
相仿,若用 mkdir
直接建立 catkin_ws/src/,系統會顯示沒有此一檔案或目錄,因為 src/ 的上層 catkin_ws/ 尚未被建立,但若是使用 mkdir -p
進行建立的話,系統便會依序將 catkin_ws/src/ 建立。
至於第四行 source ~/catkin_ws/devel/setup.bash
的用意在於,每次使用 catkin_make
編譯檔案後,都必須更新系統的環境變數,以免系統無法找到編譯後新產生的檔案。
建立好工作區後,我們可以使用 tree
指令來看工作區的結構,首先必須先安裝 tree
sudo apt-get install tree
接著,為了快速地呈現工作區的架構,我們執行 tree -L 2
後便只會列出 catkin_ws/ 底下前兩層的檔案結構,若只用 tree
則會完整顯示出 catkin_ws/ 下所有的檔案,在此就不再示範。
cd catkin_ws/
tree -L 2
可以看到主要的分支有 build
, devel
, src
,以下稍微介紹各資料夾:
1. build - catkin 的緩存信息和中間文件。
2. devel - 存放標頭檔、環境變數的地方。
3. src - 存放各種 Package 的地方。
在介紹 Package 之前,必須先介紹 ROS 底下的文件系統(Filesystem,又稱檔案系統),一般來說,ROS Filesystem 大致包含以下三個概念:
1. Package:
ROS 專案當中的基本組織,又稱為模組,其中可包含任意格式的文件,用來存放函式庫、執行
檔等等。
2. Manifests:
此為對 Package 的描述檔(Package.xml),用來定義 Package 的基本資料(如 Package
名稱、版本、作者、相依模組等等)
3. Stacks:
Stacks 是 Package 的組合,通常是將許多彼此連動的 Package 整合在一起方便呼叫使
用,例如 ROS Navigation stacks。
在一個完整的 ROS 專案當中,最常使用的便是 Package,依照不同的工作項目(例如機器人的手臂、輪子、定位系統等等)劃分出數個 Package,一般來說,ROS Package 都含有一個通用的結構:
1. include -用來放 C++ 的標頭檔用的。
2. msg -存放訊息(message)類型檔案的資料夾。
3. src -用來放置執行檔(.cpp, .py等)的資料夾。
4. srv -存放服務(services)類型檔案的資料夾。
5. scripts -存放可執行腳本的資料夾。
6. models -存放 3D 模型(.dae, .stl等)的資料夾。
7. urdf -存放模型描述檔(.urdf, .xacro)的資料夾。
8. launch -存放 launch 文件。
9. CMakeList.txt -用於建構 Package 的文件,任何符合 CMake 格式的 Package 皆
含有此檔案。
10. package.xml -這便是剛剛所提到的 Manifests,用來定義 Package 的基本資料。
有些 Package 可能沒有那麼多的資料夾,原因在於剛剛所提到 Package 是專案分工的項目,依照需求的不同,很可能某些 Package 不需要特定的資料夾(如 models、urdf)。
今天向各位介紹了如何設定建立工作區,以及 Package 的基本架構,由於解釋的東西較多,因此整體的篇幅稍微拉長了一點。至於明天則會介紹如何建置屬於自己的 Package 給大家,其實步驟也並不會過於難,請大家敬請期待。