站在巨人的肩膀上,下載並使用大師的作品完成自己的拼圖

在「ROS 略談基本安裝步驟」中,我們有談過可以下載不同的包裹模組化的安裝進自己的專案中那要怎麼做呢?以下會詳加解釋:


內容一覽:

1.如何安裝別人的包裹
1.1
Debian 安裝
1.2
從原始碼編譯 (build from source)
2.
使用的方法
3.
下載使用的建議
4.
更新包裹

1. 如何安裝別人的包裹

當我們開始上 Google 搜尋的時候,我們通常會看到
ROS
所提供的包裹,如果你進入該頁面,在標題的下方就會出現 ROS
的不同版本,選擇你所使用版本。往下看,會有 git source
並附有檔案庫連結,有時會註明是哪一個分支。如果進入內文閱覽,可能還能查到要怎麼直接 apt-get install
安裝以及從原始碼編譯。但上述狀況並不是每一個包裹的 ROS Wiki 頁面都有,那要怎麼安裝?

1.1 Debian 安裝

較少包裹會提供 Debian 檔,相當於 Windows
setup 安裝檔。通常只有態度嚴謹的專案會附一個交代清楚的
README
交代怎麼安裝怎麼用。在 Linux中,通常有兩種安裝方式,
(1)
下載到你指定的資料夾內,用 One software Center 將檔案安裝
(2)
使用終端機安裝。打開終端機,輸入:

$ sudo apt-get install ros-[你的ROS 版本]-[包裹名稱]

輸入密碼,按下 y ,一路綠燈,輕鬆可用。但是萬一 ROS
Wiki
上面只提供 git source 連結呢?

1.2 從原始碼編譯 (build from source)

你有兩個選擇,如果這個專案只有一個 master 分支,並且也確定這個包裹可以在你的
ROS
版本執行後,先複製git source 的網址,直接在終端機上打:

$ git clone [git source 網址]

e.g. git clone https://github.com/cra-ros-pkg/robot_localization

有時你可能只想要特定分支的檔案庫那就這樣打:

$ git clone [git source 網址] –branch [分支]

e.g. git clone https://github.com/cra-ros-pkg/robot_localization –branch indigo-devel

這樣就可以下載到你的 ROS workspace/src內。
別急,這個時候再回到上一層,到你的 workspace (workspace 最頂層的路徑),然後 catkin_make 編譯。如果沒出現錯誤的話,輕鬆可用!如果出現錯誤的話,請確認有把所需要的 dependencies 都安裝起來,可以在 終端機上打:

$ rosdep update

註:rosdep 必須在ROS安裝後,先
sudo rosdep init 初始化後,方能使用其他指令。
如果還是不行,打:

$ rosdep install [你的包裹]

然後,如果還是不行,請確認所需包裹套件等等,皆有被安裝起來,大致上就會解決問題。

2. 使用的方法

ok。下載完編譯過後,然後呢?通常 Readme 有寫好的專案都會告訴使用者怎麼用,譬如說跑 demo, 裡面各節點的輸出輸入Topics, 有哪些 rosservices,有哪些參數可以調。但若不巧什麼都沒寫怎麼辦?通常在一份 ROS 專案內,至少會有 src, devel, launch 這幾個資料夾。我的做法是直接進 launch 資料夾,打開其中一個 launch 檔。這份
launch
檔可能會啟動其他 launch files。因此只要逐步觀察,就可以發現有哪些節點或哪些 launch 檔被使用,他們之間的關係又是如何。再來,跳出 launch 資料夾,來到 src
資料夾,我的習慣是看過除了CMakelists.txt, src資料夾和 Makefile 檔後,大致了解整個專案原始碼放哪邊,所需要的標頭當和實作檔放在哪邊,nodelets 所需要的 plugin.xml 等又放在哪邊。接著就可以進入CMakelists 中大致瀏覽一下,看採用了哪些 dependencies和連結了哪些 includes。再往下移動,在 add_executable()  裡面,所謂的節點,是由那幾個 cpp 檔組成,又有幾個節點被編譯連結。 這一步做到後,就可以接續看各節點所對應的程式碼,並了解怎麼實作的。

啊!對!忘了講拿到包裹怎麼樣,當然是實際執行看看囉!了解各 launch 檔的功用後,就是要實際執行,看看有沒有像預期般執行功能。如果有,那就可以自己寫一個 launch 檔,納入某些功能,加入自己的專案中。如果到達這一步,恭喜你!你已經開始會使用這個包裹了!至於有沒有了解底下的原理,那又是另外一回事。

3. 下載使用的建議

從我自己開發中遭遇的慘痛經驗,建議讀者們如果要加入第三方包裹的功能進自己的專案內,請務必確認第三方的包裹是放在ROS工作空間可以獨立進行 git 更新的位置。換句話說,這個包裹建議不要放在讀者自己的包裹內,因為這樣,下載下來的包裹本來在版本更新的角度而言,都是一個獨立可隨時更新的檔案庫。若把一個檔案庫
A
放到一個檔案庫 B 裡面去的話,A 會被視作 B 的一部分,因而無法單純用 git pull
來作更新,沒辦法更新,有時意味著一些臭蟲解不掉,而我們使用者根本不知情到底哪裡出了錯誤。因此,我的做法是直接將第三方包裹直接 git clone ROS 工作區間/src
下,這樣我自己的 launch 檔能直接用

$(find [
第三方包裹])
直接自動化找到所需節點或檔案位置,又可以讓第三方包裹得以保持更新。

一個實際的例子,就我個人觀察和感覺(所以請別亂 quote
),就是 ROS 自己本身的架構,加入了某一版本的 OpenCV PCL,當這兩個第三方
libraries
更新版本,使用者想引用更新的實作功能時,才發現ROS 不支援,原因是ROS
內所使用的 libraries 屬於舊版本,如果使用者自己打算繞過這個問題,直接引用較新版的同款 libraries, 則會碰上系統參數衝突。為了這樣的問題大傷腦筋,真的是既浪費時間又沒效率。因此開發者便決定從 ROS Indigo 過後,取消內建的 OpenCV PCL,改由使用者自己安裝,並自行 include 進自己的程式碼內。當初想要大一統囊括所有需求的美意,便因為第三方版本更新的需求,而必須予以更動。但這樣的架構反而能給予使用者更大的開發彈性與便利性。

4. 更新包裹

其實很簡單。cd 進入自己的 ROS 工作空間/src/[某一個包裹],譬如說

$ cd ~/catkin_ws/src/navigation

這樣在版本控制的角度就進入了一個檔案庫當中。再輸入

$ git pull

這樣會更新本地端的檔案庫。接著回到工作空間最頂端的

$ cd ~/catkin_ws

輸入進行編譯,

$ catkin_make

這樣即完成包裹的更新。

 

 

Advertisements

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s