【ORB-SLAM2】 探索之旅 : 第 1 天

ORB-SLAM2 探索之旅 : 第一天

建立專案

專案結構中各個目錄和檔案的說明,這樣的架構有助於模組化開發與測試 :

  • Thirdparty :
    存放專案所使用的第三方庫或外部依賴項。這裡的資源通常不會修改,只是直接引入使用。
  • bin :
    存放編譯後生成的可執行檔案。完成編譯後,這裡會出現可以直接執行的程式,方便測試與發佈。
  • build :
    用來存放編譯過程中產生的中間文件與最終的 build 產物(例如 Makefile 等)。這通常是用來做「out-of-source build」,保持原始碼目錄乾淨。
  • cmakeModules :
    存放自訂的 CMake 模組或工具腳本,用來輔助 CMake 找到依賴或設定編譯選項。當預設的 CMake 模組不符合需求時,這邊的腳本就會發揮作用。
  • include/myORB-SLAM2 :
    存放專案的頭檔(header files)。這些檔案定義了專案內的類別、函式和接口,方便其他模組引用。
  • lib :
    存放編譯後生成的函式庫(Library files)。如果你將部分功能封裝成動態或靜態函式庫,這裡就是放置這些檔案的地方,供其他程式或測試使用。
  • src :
    存放主要的原始碼檔案。這些檔案包含了 ORB-SLAM2 的主要實作邏輯、演算法和應用程式流程。
  • src/CMakeLists.txt :
    這個檔案主要負責設定 ORB-SLAM2 的核心程式碼,讓 CMake 知道如何編譯 src 目錄內的原始碼,以及鏈結外部函式庫(如 OpenCV、Eigen、Pangolin 等)。
  • test :
    存放測試程式或單元測試代碼。這裡可以包含其他自動化測試案例,用來確保各模組的功能正確。
  • test/CMakeLists.txt :
    這個檔案專門負責設定「測試程式的編譯與執行」,讓測試程式可以使用準備好的函式庫。
  • CMakeLists.txt :
    專案的主要 CMake 配置檔,定義了編譯流程、依賴、目標檔案等設定。這個檔案負責整個專案的建置流程,是編譯前必須正確設定的關鍵文件。
專案結構示意圖

準備好第三方套件

當成功安裝 ORB-SLAM2 後,你會在其資料夾內找到 Thirdparty 子目錄,其中包含 ORB-SLAM2 運行所需的第三方套件。你可以將這些套件複製到自己專案的 Thirdparty 資料夾,以確保相依性一致。

如何安裝 ORB-SLAM2 ?

  • DBoW2 :
    影像檢索與回環偵測的字典樹(Vocabulary Tree)庫,用於基於影像特徵的比對與分類。ORB-SLAM2 使用 DBoW2 來檢測回環(Loop Closure)。
  • g2o :
    g2o 是一個用於圖優化(Graph Optimization) 的 C++ 庫,ORB-SLAM2 用它來執行位姿圖(Pose Graph)優化,讓 SLAM 系統更準確。
ORB-SLAM2 運行所需的第三方套件

Eigen 庫加入到專案中

同樣地,如果成功安裝 ORB-SLAM2,那代表電腦已經安裝好 Eigen 函式庫。

Eigen3 是一個高效的 C++ 數值計算庫,專門用於 線性代數 運算,例如 矩陣運算、向量計算、線性方程求解、特徵值分解 等。

FindEigen3.cmake 檔案是一個 CMake 模組,用來尋找 Eigen3 庫並將其加入我們的 CMake 專案。它的作用是讓 CMake 知道 Eigen3 的安裝位置,並提供相關的編譯設定。

請在專案中的 cmakeModules 資料夾新增 FindEigen3.cmake 檔案,同樣可以從 ORB-SLAM2 的資料夾中複製一份 ( /ORB-SLAM2/cmake_modules/FindEigen3.cmake ),以確保相依性一致。

編寫專案根目錄的 CMakeLists.txt

請注意,若尚未安裝 ORB-SLAM2,在設定以下 CMakeLists.txt 檔案時可能會遇到錯誤。為確保相依性一致,請先完成安裝,並可參考【ORB-SLAM2 安裝教學】進行設定。

  1. find_package :
    • 目的 : 尋找外部庫(例如 OpenCV、Eigen3、Threads),並設定一些變數。
    • 舉例 : find_package(OpenCV 3.0 REQUIRED) 找到 OpenCV 後會設定變數如 ${OpenCV_LIBS}(用於鏈結庫)和 ${OpenCV_INCLUDE_DIRS}(包含頭文件的路徑)。

  2. include_directories :
    • 目的 : 告訴編譯器在編譯時從哪些目錄尋找頭文件。
    • 作用 : 雖然 find_package 會設定變數,但不一定會自動把這些目錄加到編譯器的搜索路徑中,因此我們需要用 include_directories 明確加入這些路徑,保證可以找到所需的頭文件。

  3. set(THIRD_PARTY_LIBS ...) :
    • 目的 : 定義一個變數,列出在編譯或鏈結時需要連結的第三方庫。
    • 作用 : 這裡把從 find_package 得到的庫(例如 ${OpenCV_LIBS}、${CMAKE_THREAD_LIBS_INIT})與專案中自訂的庫(例如 DBoW2、g2o 的庫檔案)組合在一起,方便後續在 target_link_libraries 中統一使用。

CMakeLists.txt 完整設定
cmake_minimum_required(VERSION 3.16) # 指定 CMake 最低版本 3.16
project(myORB-SLAM2) # 定義專案名稱

set(CMAKE_BUILD_TYPE "Release") # 建構類型 Release。編譯時會進行優化以提高性能。
set(CMAKE_CXX_FLAGS "-std=c++17 -O3") # C++ 17 標準、O3 最高級別編譯器優化

# 自訂的 CMake 模組位置
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmakeModules)

find_package(OpenCV 3.0 REQUIRED) # 加載 OpenCV 函式庫
find_package(Threads REQUIRED) # 加載 pthread 函式庫
find_package(Eigen3 3.1.0 REQUIRED) # 加載 Eigen3 函式庫

include_directories(${OpenCV_INCLUDE_DIRS}) # 加載 OpenCV 頭文件目錄
include_directories(${EIGEN3_INCLUDE_DIR}) # 加載 Eigen3 頭文件目錄

set( # 編譯器連結第三方函式庫
    THIRD_PARTY_LIBS ${OpenCV_LIBS} ${CMAKE_THREAD_LIBS_INIT}
    ${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
    ${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
)

# 生成的可執行文件檔將放置在 bin 資料夾
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# 生成的庫文件將放置在 lib 資料夾
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 設定本專案之頭文件目錄位置
include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR})

# 設定 CMake 處理該些目錄下的 CMakeLists.txt 文件
add_subdirectory(src)
add_subdirectory(test)

CMake 配置專案日誌

如果 CMake 成功配置 myORB-SLAM2 專案,輸出日誌的最後應該會顯示以下內容:

...
[cmake] -- Configuring done
[cmake] -- Generating done
...

結語

在今天的探索旅程中,搭建了 myORB-SLAM2 專案的基礎架構。從目錄劃分到 CMake 配置,這不僅確保了第三方依賴的正確引用,也為後續的功能開發和優化奠定了堅實的基礎。

1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *