以下是在本地部署運行?ORB-SLAM3?的詳細步驟,基于官方?README.md
?和最佳實踐整理,適用于?Ubuntu 16.04/18.04/20.04/22.04?系統:
一、系統要求與依賴項安裝
1.?基礎系統要求
- 操作系統:Ubuntu 16.04/18.04/20.04/22.04(64 位)
- 硬件:推薦 i7 及以上處理器(確保實時性能),支持 OpenGL 的顯卡(用于 Pangolin 可視化)
2.?安裝依賴項
# 安裝基礎工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential cmake git libgl1-mesa-glx# 安裝Eigen3(線性代數庫)
sudo apt install libeigen3-dev# 安裝Python(用于軌跡評估,需numpy)
sudo apt install python3-numpy libpython3-dev# 安裝OpenCV(3.2+,推薦4.x,22.04默認4.6.0+)
sudo apt install libopencv-dev python3-opencv# 安裝Pangolin(可視化庫)
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
cd .. && rm -rf Pangolin # 清理臨時文件
?3.?可選:安裝 ROS(如需運行 ROS 節點)
Ubuntu 18.04 (Melodic):
sudo apt install ros-melodic-desktop-full
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
Ubuntu 22.04 (Humble):
sudo apt install ros-humble-desktop
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
這里因為考慮到很多安裝SLAM3的朋友在本地都沒有安裝ROS2,所以這里更新一篇ROS2的安裝教學。
報錯解決:
這里我在運行:cmake .. -DCMAKE_BUILD_TYPE=Release的時候出現問題:
ZERO:/media/chengq/soft/Dev_soft/Slam3/Pangolin/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- libpng Found and Enabled
-- libjpeg Found and Enabled
-- libtiff Found and Enabled
-- libopenexr Found and Enabled
-- Found Eigen: '/usr/include/eigen3'
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_egl_LIBRARYOPENGL_INCLUDE_DIR OpenGL EGL)
Call Stack (most recent call first):/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)/usr/share/cmake-3.22/Modules/FindOpenGL.cmake:443 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)components/pango_opengl/CMakeLists.txt:49 (find_package)CMakeLists.txt:124 (include)-- Configuring incomplete, errors occurred!
See also "/media/chengq/soft/Dev_soft/Slam3/Pangolin/build/CMakeFiles/CMakeOutput.log".
chengq@chengq-ZERO:/media/chengq/soft/Dev_soft/Slam3/Pangolin/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
-- libpng Found and Enabled
-- libjpeg Found and Enabled
-- libtiff Found and Enabled
-- libopenexr Found and Enabled
-- Found Eigen: '/usr/include/eigen3'
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_egl_LIBRARYOPENGL_INCLUDE_DIR OpenGL EGL)
Call Stack (most recent call first):/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)/usr/share/cmake-3.22/Modules/FindOpenGL.cmake:443 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)components/pango_opengl/CMakeLists.txt:49 (find_package)CMakeLists.txt:124 (include)-- Configuring incomplete, errors occurred!
See also "/media/chengq/soft/Dev_soft/Slam3/Pangolin/build/CMakeFiles/CMakeOutput.log".
這個問題是由于缺少?OpenGL 開發庫?導致的編譯錯誤。以下是針對 Ubuntu 22.04 的解決步驟:
一、安裝 OpenGL 開發庫
sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev libegl1-mesa-dev
libgl1-mesa-dev
:提供 OpenGL 核心開發庫(必裝)。libglu1-mesa-dev
:提供 OpenGL 實用庫(GLU)。libegl1-mesa-dev
:提供 EGL(Embedded Systems Graphics Library)開發庫(Pangolin 可能依賴)。
二、安裝 epoxy 開發庫
sudo apt install -y libepoxy-dev
libepoxy-dev
?包含 epoxy 的頭文件和庫文件,是 Pangolin 可視化模塊的依賴項。
三、重新編譯 Pangolin
# 清理之前的構建文件(可選)
cd .. && rm -rf build
mkdir build && cd build# 重新執行 CMake 配置
cmake .. -DCMAKE_BUILD_TYPE=Release
四、繼續編譯并安裝
make -j$(nproc) # 使用多核編譯(加快速度)
sudo make install # 安裝到系統路徑
二、克隆項目與構建
1.?克隆代碼倉庫
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
cd ORB_SLAM3
2.?編譯項目
chmod +x build.sh
./build.sh # 自動編譯第三方庫(DBoW2、g2o、Sophus)和ORB-SLAM3
- 編譯完成后,生成動態庫?
libORB_SLAM3.so
?和可執行文件(位于?Examples
?目錄)。
3.?編譯 ROS 節點(可選)
chmod +x build_ros.sh
./build_ros.sh # 生成ROS節點,需已安裝ROS
報錯解決:
在執行 ./build.sh ?# 自動編譯第三方庫(DBoW2、g2o、Sophus)和ORB-SLAM3?
編譯的時候又出現錯誤: 執行到30% 左右無法編譯。
報錯:
/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/LoopClosing.cc: In member function ‘void ORB_SLAM3::LoopClosing::SearchAndFuse(const std::vector<ORB_SLAM3::KeyFrame*>&, std::vector<ORB_SLAM3::MapPoint*>&)’:/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/LoopClosing.cc:2161:9: warning: unused variable ‘total_replaces’ [-Wunused-variable]2161 |? ? ?int total_replaces = 0;|? ? ? ? ?^~~~~~~~~~~~~~/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc: In member function ‘void ORB_SLAM3::Tracking::Track()’:/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc:2167:96: warning: comparison of integer expressions of different signedness: ‘long unsigned int’ and ‘int’ [-Wsign-compare]2167 |? ? ? ? ?if((mCurrentFrame.mnId<(mnLastRelocFrameId+mnFramesToResetIMU)) && (mCurrentFrame.mnId > mnFramesToResetIMU) &&|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc: In member function ‘void ORB_SLAM3::Tracking::SearchLocalPoints()’:/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc:3413:13: warning: unused variable ‘matches’ [-Wunused-variable]3413 |? ? ? ? ?int matches = matcher.SearchByProjection(mCurrentFrame, mvpLocalMapPoints, th, mpLocalMapper->mbFarPoints, mpLocalMapper->mThFarPoints);|? ? ? ? ? ? ?^~~~~~~/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc: In member function ‘void ORB_SLAM3::Tracking::UpdateFrameIMU(float, const ORB_SLAM3::IMU::Bias&, ORB_SLAM3::KeyFrame*)’:/media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3/src/Tracking.cc:3983:18: warning: unused variable ‘index’ [-Wunused-variable]3983 |? ? ?unsigned int index = mnFirstFrameId;|? ? ? ? ? ? ? ? ? ^~~~~make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:76:CMakeFiles/ORB_SLAM3.dir/src/System.cc.o] 錯誤 1make[2]: *** 正在等待未完成的任務....make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:104:CMakeFiles/ORB_SLAM3.dir/src/LocalMapping.cc.o] 錯誤 1make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:118:CMakeFiles/ORB_SLAM3.dir/src/LoopClosing.cc.o] 錯誤 1make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:90:CMakeFiles/ORB_SLAM3.dir/src/Tracking.cc.o] 錯誤 1make[1]: *** [CMakeFiles/Makefile2:148:CMakeFiles/ORB_SLAM3.dir/all] 錯誤 2make: *** [Makefile:91:all] 錯誤 2
解決:
原因分析:
ORB-SLAM3 是一個相對較早的項目,主要基于 C++11 標準編寫。在較新的 Ubuntu 版本(如 20.04 或 22.04)中,默認的 GCC/G++ 編譯器版本比較高(通常是 GCC 9+ 或 GCC 11+),這些新版本的編譯器默認使用的是 C++14 或 C++17 標準,并且對 C++語法和標準庫的使用要求更嚴格。這常常會導致一些在 C++11 下沒問題,但在 C++14/17 下會報錯(或被視為錯誤)的代碼。這是 ORB-SLAM3 在新系統上編譯時非常常見的問題。
解決方案:
最常見的解決辦法是告訴 CMake 在編譯 ORB-SLAM3 時使用 C++11 標準進行編譯。
-
修改
CMakeLists.txt
文件:- 進入 ORB_SLAM3 的根目錄:
cd /media/chengq/soft/Dev_soft/Slam3/ORB_SLAM3
(根據你的實際路徑) - 打開根目錄下的
CMakeLists.txt
文件進行編輯(可以使用gedit
,nano
,vim
等編輯器): Bashgedit CMakeLists.txt # 或者 nano CMakeLists.txt
- 在文件的開頭部分,通常在
cmake_minimum_required(...)
后面,添加或找到并修改以下行: CMake
如果已經有set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD ...)
的行,確保它被設置為11
。如果這兩行不存在,就直接添加到文件開頭合適的位置(比如在project(...)
之前或之后)。
- 進入 ORB_SLAM3 的根目錄:
-
清理之前的構建文件:
- 由于 CMake 會緩存配置,在修改
CMakeLists.txt
后,需要清理之前失敗的構建嘗試生成的文件。進入build
目錄并刪除所有內容: Bashcd build rm -rf * cd .. # 回到ORB_SLAM3根目錄
- 或者直接刪除并重新創建
build
目錄: Bashrm -rf build mkdir build
- 重要提示: ORB-SLAM3 的
./build.sh
腳本理論上應該處理 CMake 的配置和構建,但手動清理build
目錄能確保 CMake 從頭開始配置,讀取你修改后的CMakeLists.txt
。
- 由于 CMake 會緩存配置,在修改
-
重新運行編譯腳本:
- 回到 ORB_SLAM3 的根目錄,再次執行編譯腳本: Bash
./build.sh
- 回到 ORB_SLAM3 的根目錄,再次執行編譯腳本: Bash
三、準備數據集與配置文件
1.?下載示例數據集
-
TUM RGB-D 數據集(用于 RGB-D 相機示例):
從?TUM RGB-D 數據集?下載序列(如?fr1/xyz
),解壓后記錄路徑(如?~/datasets/tum/fr1/xyz
)。 -
EuRoC 數據集(用于立體 / 慣性示例):
從?EuRoC 數據集?下載 ASL 格式序列,解壓后修改?euroc_examples.sh
?中的數據集路徑。
2.?配置文件說明
- 詞匯表:已包含在?
Vocabulary/ORBvoc.txt
(無需額外下載)。 - 相機參數文件:
- RGB-D 示例:
Examples/RGB-D/TUM1.yaml
(根據數據集修改分辨率、畸變參數)。 - 立體 / 慣性示例:
Examples/Stereo-Inertial/EuRoC.yaml
(包含 IMU 參數和相機內參)。
- RGB-D 示例:
四、運行示例程序
1.?運行 RGB-D 相機示例(以 TUM fr1/xyz 為例)
bash
# 格式:./Examples/RGB-D/rgbd_tum 詞匯表路徑 配置文件路徑 圖像路徑 關聯文件路徑
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ~/datasets/tum/fr1/xyz ~/datasets/tum/fr1/xyz/associations.txt
- 輸出:Pangolin 窗口顯示實時地圖,終端輸出軌跡信息,結果保存在?
CameraTrajectory.txt
。
2.?運行立體慣性示例(EuRoC 數據集)
bash
# 格式:./Examples/Stereo-Inertial/stereo_inertial_euroc 詞匯表路徑 配置文件路徑 數據集路徑
./Examples/Stereo-Inertial/stereo_inertial_euroc Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/EuRoC.yaml ~/datasets/euroc/V1_02_medium
3.?運行 ROS 節點(以單目為例)
bash
# 1. 設置ROS包路徑(需先編輯~/.bashrc,添加以下行并source)
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/path/to/ORB_SLAM3/Examples/ROS# 2. 運行節點(格式:rosrun ORB_SLAM3 Mono 詞匯表路徑 配置文件路徑)
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
五、常見問題與解決方案
1.?編譯錯誤:第三方庫未找到
- 原因:
Thirdparty
?目錄下的庫(如 g2o)編譯失敗。 - 解決:手動編譯第三方庫:
bash
cd Thirdparty/g2o mkdir build && cd build cmake .. -DG2O_USE_CSPARSE=ON make -j$(nproc) cd ../../../
2.?OpenCV 版本沖突(如 4.x 兼容性問題)
- 報錯:
undefined reference to cv::imread
。 - 解決:修改代碼中 OpenCV 函數(如?
cv::IMREAD_COLOR
?替換為?cv::ImreadModes::IMREAD_COLOR
),或確保 CMake 正確鏈接系統 OpenCV 路徑。
3.?Pangolin 窗口無法顯示
- 原因:OpenGL 依賴缺失或版本不兼容。
- 解決:安裝 OpenGL 開發庫:
bash
sudo apt install libglew-dev libglfw3-dev
4.?ROS 話題映射錯誤
- 原因:話題名稱不匹配(如?
/camera/image_raw
?應為?/image_raw
)。 - 解決:修改 ROS 節點訂閱的話題名稱,或使用
rosbag play
重映射話題:bash
rosbag play --remap /cam0/image_raw:=/image_raw dataset.bag
六、項目結構與擴展
- 核心代碼:
src/
?和?include/
?包含 SLAM 系統核心邏輯(跟蹤、建圖、回環檢測)。 - 示例程序:
Examples/
?目錄按傳感器類型分類(RGB-D、立體、慣性等),可參考示例編寫自定義相機接口。 - 配置文件:
Examples/
?下的.yaml
文件定義相機內參、IMU 參數等,需根據實際傳感器校準結果修改(參考Calibration_Tutorial.pdf
)。
七、驗證安裝成功
- 運行示例后,Pangolin 窗口應顯示 3D 地圖和相機軌跡。
- 終端輸出關鍵幀信息、跟蹤狀態(
OK
/LOST
)及統計數據。 - 生成的軌跡文件(如
CameraTrajectory.txt
)可通過工具(如 Evince)查看或與真值對比。
按照以上步驟操作,即可在本地成功部署運行 ORB-SLAM3。如需自定義傳感器(如魚眼相機、自定義 IMU),需根據Calibration_Tutorial.pdf
校準參數并修改配置文件,編譯對應的示例程序。