welcom ! Handel home

2025年3月21日 星期五

ORB-SLAM3 實作介紹

已經透過 mp4_to_slam_dataset.py 拆解影片,產生了:

  • slam_frames/:存放每張影格
  • rgb.txt:影格與時間戳的對應表

下一步就是把這些資料丟給 ORB-SLAM3 使用啦!


🎯 ORB-SLAM3 使用你自己的資料步驟


🧱 Step 0:檔案整理結構

建議整理為:

my_dataset/ ├── slam_frames/ │ ├── frame_000000.png │ ├── frame_000001.png │ └── ... ├── rgb.txt ├── camera.yaml ← 相機參數設定檔

🛠️ Step 1:準備相機設定檔 camera.yaml

ORB-SLAM3 需要一份 .yaml 檔來描述相機內參(focal length、中心點、畸變等),格式如下:

yaml
%YAML:1.0 # 相機內參(請根據你影片來源的真實相機校正資料填寫) Camera.fx: 525.0 Camera.fy: 525.0 Camera.cx: 319.5 Camera.cy: 239.5 Camera.k1: 0.0 Camera.k2: 0.0 Camera.p1: 0.0 Camera.p2: 0.0 Camera.width: 640 Camera.height: 480 Camera.fps: 30.0 Camera.bf: 0.0 # 單鏡頭請設為 0 Camera.RGB: 1 ThDepth: 40.0 DepthMapFactor: 1.0

🔧 如果你不知道真實內參,可以先試用上述預設值(較寬容),未來可使用 kalibropencv calibration 工具取得精確值。


▶️ Step 2:執行 ORB-SLAM3

🔹 環境先決:

  • 已安裝 ORB-SLAM3 並 build.sh 成功
  • 進入 ORB-SLAM3 的根目錄

🔹 指令格式(Monocular):

bash
./Examples/Monocular/mono_tum \ Vocabulary/ORBvoc.txt \ path/to/camera.yaml \ path/to/my_dataset/rgb.txt \ path/to/my_dataset/slam_frames/

📌 替換以上路徑為你的實際檔案路徑!


🖼️ 執行時會看到:

  • 即時建構的地圖(3D 點雲)
  • 相機軌跡(白色路徑線)
  • 視窗顯示當前影像與 ORB 特徵點

💾 [進階] 匯出軌跡與地圖

匯出相機軌跡:

Ctrl+C 結束後,會在終端輸出軌跡資訊
或修改 ORB-SLAM3 原始碼,將 pose 儲存成 .txt

cpp
SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");

匯出地圖點雲:

ORB-SLAM3 本身沒有直接匯出 .ply 功能,但你可以:

  1. 匯出軌跡
  2. 使用第三方工具(如 evo、Open3D)合成點雲

🧪 Troubleshooting 小提醒

問題解法
Camera calibration error確認 .yaml 內參是否符合影像解析度
No frames processed確認 rgb.txt 的時間戳與圖片檔名對應無誤
顯示畫面不動確認 fps 設定與 rgb.txt 間距一致

🧰 範例資料參考

如果你需要測試,EuRoC、TUM RGB-D 都是官方支援資料集,可先驗證環境。


✅ 總結你要做的是:

bash
./Examples/Monocular/mono_tum \ Vocabulary/ORBvoc.txt \ camera.yaml \ rgb.txt \ slam_frames/

然後觀察視窗、確認 ORB 特徵點與軌跡是否建構成功 ✅


如果你需要:

  • .txt 軌跡成 ROS 的 /odom 話題
  • 後續與 nav2 導航整合
  • 或我幫你包成 ROS 節點、Docker 套件

也可以隨時說一聲,我可以幫你串接下一步!是否要我幫你整合成一個 ROS2 launch 套件?

=========================================

使用 Docker 執行 ORB-SLAM3 是非常方便又乾淨的方式,不用煩惱系統相依與 OpenCV/GTSAM 編譯問題,下面我會給你:

  • 一個可直接用的 Dockerfile
  • 執行步驟
  • 資料掛載與執行範例

🐳 為什麼用 Docker 跑 ORB-SLAM3?

✅ 好處:

  • 避免 host 環境衝突(OpenCV、CMake、GTSAM)
  • 方便在不同機器/Jetson/伺服器間部署
  • 容易整合 ROS、Python、SLAM 工具鏈

📂 資料結構建議

你先把資料放在一個資料夾,例如:

bash
orb_slam3_ws/ ├── Dockerfile ├── ORB_SLAM3/ ← clone 下來的 ORB_SLAM3 專案 ├── my_dataset/ ← slam_frames + rgb.txt + camera.yaml └── run_orbslam3.sh ← 執行腳本(可選)

🧰 Dockerfile(含完整建構步驟)

dockerfile
FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive # 安裝基本工具 RUN apt update && apt install -y \ build-essential cmake git pkg-config wget curl \ libeigen3-dev libboost-all-dev libtbb-dev libyaml-cpp-dev \ libopencv-dev libpangolin-dev libglew-dev \ libpython3-dev python3 python3-pip # 安裝 GTSAM WORKDIR /opt RUN git clone https://github.com/borglab/gtsam.git && \ cd gtsam && mkdir build && cd build && \ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local && \ make -j$(nproc) && make install # 安裝 ORB-SLAM3 WORKDIR /root RUN git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git WORKDIR /root/ORB_SLAM3 RUN chmod +x build.sh && ./build.sh # 預設進入 ORB_SLAM3 資料夾 WORKDIR /root/ORB_SLAM3

🏗️ 建置 Docker 映像

bash
cd orb_slam3_ws docker build -t orbslam3 .

▶️ 執行容器(並掛載資料)

假設你有資料夾 my_dataset/ 包含:

  • slam_frames/
  • rgb.txt
  • camera.yaml

執行容器並將資料掛進去:

bash
docker run -it --rm \ --net=host \ --env DISPLAY=$DISPLAY \ --volume=$HOME/.Xauthority:/root/.Xauthority:rw \ --volume=$(pwd)/ORB_SLAM3:/root/ORB_SLAM3 \ --volume=$(pwd)/my_dataset:/root/my_dataset \ orbslam3

(⚠️ 若用 WSL 或 headless server,GUI 請使用 VNC / headless 模式)


▶️ 容器內執行 ORB-SLAM3

bash
cd /root/ORB_SLAM3 ./Examples/Monocular/mono_tum \ Vocabulary/ORBvoc.txt \ /root/my_dataset/camera.yaml \ /root/my_dataset/rgb.txt \ /root/my_dataset/slam_frames

✅ 完成效果

你會看到:

  • GUI 顯示當前畫面與 ORB 特徵點
  • SLAM 視窗畫出相機軌跡與地圖點雲

📁 進階建議

類型建議
使用 ROS可用 ROS Docker base 加上 ros-bridge
與 Jetson 搭配使用 nvcr.io/nvidia/l4t-base 作為 base
匯出點雲修改 System.cc 內部,寫入 SaveKeyFrameTrajectoryTUM

🧪 小補充

如你影片有 IMU,也可以接 mono_inertial_euroc 執行,架構幾乎一樣,只需多一份 IMU 資料與參數。


需要我幫你:

  • 加上 rosbag 支援?
  • 整合 IMU + ROS 節點轉換器?
  • 用 GUI or no-GUI 模式部署?

也可以直接提供你的影片與參數,我幫你打包一份現成 Docker 執行模板 ✅ 要嗎?






沒有留言: