本專案旨在教學如何使用 Ceres Solver 進行數值優化,並結合實際案例進行學習。Ceres 是一個功能強大的 C++ 數值優化庫,廣泛應用於計算機視覺、機器人學等領域。本專案包含多個模組,涵蓋自動微分、數值微分、雅可比矩陣計算等主題,幫助使用者深入理解 Ceres 的使用方法。
CMakeLists.txt # 頂層 CMake 配置文件
bin/ # 編譯後的可執行文件
build/ # 編譯過程中的中間文件
src/ # 源碼目錄
ch6/ # 第六章相關代碼
common/ # 公用函數與工具
curve_fitting_autodiff/ # 自動微分曲線擬合
curve_fitting_numdiff/ # 數值微分曲線擬合
pose_graph_autodiff/ # 自動微分位姿圖優化
...
data/ # 測試數據
lib/ # 編譯生成的庫文件
- 操作系統:Linux
- 編譯器:支持 C++11 的編譯器
- CMake:3.1 或更高版本
- Ceres Solver:已安裝
- Eigen:線性代數庫
-
配置環境 確保已安裝 Ceres Solver 和 Eigen。
-
Clone 專案 git clone --recurse-submodules https://github.com/NCKU-He-Rong/ceres_workshop.git git submodule update --remote --merge
-
編譯專案
mkdir build cd build cmake -DCMAKE_BUILD_TYPE=debug .. # cmake -DCMAKE_BUILD_TYPE=release .. make
-
運行示例 編譯完成後,可執行文件將生成於
bin/目錄下。例如:./bin/curve_fitting_autodiff
- curve_fitting_autodiff:使用自動微分進行曲線擬合。
- curve_fitting_numdiff:使用數值微分進行曲線擬合。
- pose_graph_autodiff:基於自動微分的位姿圖優化。
- pose_graph_jacobian:基於雅可比矩陣的位姿圖優化。
在 src/pose_graph_autodiff/include/pose_manifold.hpp 文件中,提到需要定義一個 PlusJacobian,以便建立連鎖律,讓 Ceres 可以推導出終極 Jacobian。
在 src/ch6/main.cpp 文件中,包含以下推導相關的註解:
- 第 61 行:提供了一個推導的參考連結:https://www.cnblogs.com/vivian187/p/16502590.html。
- 第 65 行:說明擾動推導與更新方式一致性的重要性。
- 第 181 行:指出手動推導的 Jacobian 通常用矩陣方式表達更佳。
這些細節對於深入理解 Ceres 的數值優化過程非常重要,建議讀者在學習時參考相關代碼與註解。
src/common/rotation.hpp:提供旋轉相關的工具函數。src/fileio/txtio.hpp:處理文件讀寫的工具。data/:包含測試所需的數據文件。
- 理解 Ceres Solver 的基本概念與使用方法。
- 掌握自動微分與數值微分的實現。
- 學會如何構建與優化位姿圖。
如有任何問題,歡迎聯繫作者或提交 Issue。
本專案由 NCKU-He-Rong 團隊開發,僅供學術研究與教學使用。