
Table of Contents
建立專案
專案結構中各個目錄和檔案的說明,這樣的架構有助於模組化開發與測試 :
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 資料夾,以確保相依性一致。
DBoW2:
影像檢索與回環偵測的字典樹(Vocabulary Tree)庫,用於基於影像特徵的比對與分類。ORB-SLAM2 使用 DBoW2 來檢測回環(Loop Closure)。
g2o:
g2o 是一個用於圖優化(Graph Optimization) 的 C++ 庫,ORB-SLAM2 用它來執行位姿圖(Pose Graph)優化,讓 SLAM 系統更準確。

將 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 安裝教學】進行設定。
find_package:- 目的 : 尋找外部庫(例如 OpenCV、Eigen3、Threads),並設定一些變數。
 - 舉例 : find_package(OpenCV 3.0 REQUIRED) 找到 OpenCV 後會設定變數如 ${OpenCV_LIBS}(用於鏈結庫)和 ${OpenCV_INCLUDE_DIRS}(包含頭文件的路徑)。
 
include_directories:- 目的 : 告訴編譯器在編譯時從哪些目錄尋找頭文件。
 - 作用 : 雖然 find_package 會設定變數,但不一定會自動把這些目錄加到編譯器的搜索路徑中,因此我們需要用 include_directories 明確加入這些路徑,保證可以找到所需的頭文件。
 
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 配置,這不僅確保了第三方依賴的正確引用,也為後續的功能開發和優化奠定了堅實的基礎。



[…] 先說明一下,ORB-SLAM2 中特徵點通常出現在影像中的尖銳邊緣或顯著的角落處,如圖 2 所示。 […]