welcom ! Handel home

2025年3月31日 星期一

ollama api upload image file python demo

 import requests

import json

import base64



# 讀取本地圖片並轉 base64

with open("demo.jpg", "rb") as image_file:

    base64_image = base64.b64encode(image_file.read()).decode('utf-8')


url = "http://192.168.5.53:11434/v1/chat/completions"

headers = {'Content-Type': 'application/json'}

data = {

    "model": "gemma3:4b",

"messages": [

        {

            "role": "user",

            "content": [

                {"type": "text", "text": "請幫我描述這張圖:"},

                {

                    "type": "image_url",

                    "image_url": {

                        "url": f"data:image/jpeg;base64,{base64_image}"

                    }

                }

            ]

        }

    ],

    "max_tokens": 1000

}


try:

    response = requests.post(url, headers=headers, data=json.dumps(data))

    response.raise_for_status()  # Raise HTTPError for bad responses (4xx or 5xx)

    print(response.json())  # Print the JSON response

except requests.exceptions.RequestException as e:

    print(f"Error: {e}")

except json.JSONDecodeError as e:

    print(f"Error decoding JSON: {e}")

    print(f"Raw response text: {response.text}")


ollama gemma3:4b API call

call_api.py

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

import requests

import json


url = "http://192.168.5.53:11434/v1/chat/completions"

headers = {'Content-Type': 'application/json'}

data = {

    "model": "gemma3:4b",

    "messages": [

        {

            "role": "user",

            "content": "Explain how AI works"

        }

    ]

}


try:

    response = requests.post(url, headers=headers, data=json.dumps(data))

    response.raise_for_status()  # Raise HTTPError for bad responses (4xx or 5xx)

    print(response.json())  # Print the JSON response

except requests.exceptions.RequestException as e:

    print(f"Error: {e}")

except json.JSONDecodeError as e:

    print(f"Error decoding JSON: {e}")

    print(f"Raw response text: {response.text}")


#  LLM 回復JSON  資料結構
========================

這段 JSON 是從一個聊天完成(chat completion)API 回傳的資料,其中包含一個 AI 模型(如 gemma3:4b)所生成的回答。以下是這個 JSON 架構與各個 key 的中文說明:


JSON 結構說明:

json
{ "id": "chatcmpl-687", "object": "chat.completion", "created": 1743484387, "model": "gemma3:4b", "system_fingerprint": "fp_ollama", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "..." // AI 回覆的內容 }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 13, "completion_tokens": 1143, "total_tokens": 1156 } }

各 key 值的中文說明:

Key 名稱類型中文說明
id字串本次對話的唯一識別碼。
object字串回傳的物件類型,這裡固定是 "chat.completion",代表是聊天補全結果。
created整數(timestamp)UNIX 時間戳,代表這次請求產生的時間。
model字串使用的 AI 模型名稱,例如 "gemma3:4b"
system_fingerprint字串系統模型的指紋,用來追蹤模型的版本或變動。
choices陣列包含一或多個 AI 的回覆,每個回覆是一個選項(通常只有一個)。

choices 陣列中的物件:

Key 名稱類型中文說明
index整數回覆的索引(如果有多個回覆時用來區分)。
message物件回覆的訊息本體,內含角色與內容。
role字串發話者的角色,如 assistant(AI 回覆)、user(使用者輸入)。
content字串AI 實際輸出的文字內容。
finish_reason字串表示完成回應的原因,常見如 "stop"(正常結束)、"length"(長度限制結束)。

usage 區塊:

Key 名稱類型中文說明
prompt_tokens整數使用者輸入使用的 token 數量。
completion_tokens整數AI 回覆使用的 token 數量。
total_tokens整數總共使用的 token 數量(= prompt_tokens + completion_tokens)。

(LLM 串接 API 或 顯示回覆),通常會從 choices[0].message.content 取出 AI 的回答。

Ubuntu 24.04 Docker and GPU drive by ollama +webui for LLM

 #=== ubuntu 24.04 安裝 Docker from ===

$sudo apt-get update

$sudo apt-get install ca-certificates curl gnupg

# Add Docker's official GPG key:

$sudo apt-get update

$sudo apt-get install ca-certificates curl

$sudo install -m 0755 -d /etc/apt/keyrings

$sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

$sudo chmod a+r /etc/apt/keyrings/docker.asc


# Add the repository to Apt sources:

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$sudo apt-get update

$sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#=== test docker is working ===

$sudo docker run hello-world


#==== ubuntu 24.04 install nvidia container-toolkit ======

$curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \

  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \

    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \

 sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list


$sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

$sudo apt-get update

$sudo apt-get install -y nvidia-container-toolkit

$sudo systemctl restart docker


#== working Direct build ===
$cd work_prj
$mkdir ollama-data
$mkdir webuidata

#=== docker startup ollama ====
$sudo docker run -d --name ollama \
  --gpus all \
  --restart always \
  -p 11434:11434 \
  -v ./ollama-data:/root/.ollama \
  -e NVIDIA_VISIBLE_DEVICES=all \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
  ollama/ollama

#=== docker startup webui for llm ===
$sudo docker run -d \
  --name open-webui \
  --restart always \
  -p 3100:8080 \
  -v ./webuidata:/app/backend/data \
  -e OLLAMA_API_BASE_URL=http://localhost:11434 \
  ghcr.io/open-webui/open-webui:main




















2025年3月24日 星期一

完整的 ORB-SLAM3 Docker 啟動與使用範例

 當然可以,這裡提供你一套 完整的 ORB-SLAM3 Docker 啟動與使用範例,適合你在乾淨環境中測試自有資料(像你之前處理的影片轉影格 + rgb.txt)。


🧱 假設你的資料結構如下:

bash
orbslam3_ws/ ├── Dockerfile ├── ORB_SLAM3/ ← GitHub clone 下來的 ORB_SLAM3 原始碼 ├── Vocabulary/ORBvoc.txt ← 詞彙檔 ├── my_dataset/ │ ├── slam_frames/ ← 拆出來的影格圖像 │ ├── rgb.txt ← 時間戳與圖像對應 │ └── camera.yaml ← 相機內參設定檔

Docker 會以當前目錄 orbslam3_ws/ 作為 build context,所以你必須確保:

orbslam3_ws/ ├── Dockerfile ├── ORB_SLAM3/ ← ✅ 這個資料夾必須存在!

🧩 修正步驟如下:

1️⃣ 複製 ORB-SLAM3 原始碼到該資料夾

bash
cd orbslam3_ws git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

這樣會產生:

orbslam3_ws/ORB_SLAM3

2️⃣ 確認 DockerfileORB_SLAM3 是同層


🧰 Dockerfile(支援 ORB-SLAM3 + GTSAM)

dockerfile
FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive # 基本工具與依賴 RUN apt update && apt install -y \ build-essential cmake git wget curl pkg-config \ libeigen3-dev libboost-all-dev libtbb-dev libyaml-cpp-dev \ libopencv-dev libpangolin-dev libglew-dev \ libpython3-dev python3 python3-pip # 安裝 GTSAM(用於 IMU 模式) 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 COPY ORB_SLAM3 /root/ORB_SLAM3 # 編譯 ORB-SLAM3 WORKDIR /root/ORB_SLAM3 RUN chmod +x build.sh && ./build.sh # 預設工作目錄 WORKDIR /root/ORB_SLAM3

🏗️ 建立 Docker 映像

bash
cd orbslam3_ws docker build -t orbslam3 .

▶️ 啟動 Docker 容器並掛載資料

bash
xhost +local:root # 允許 GUI 顯示 docker run -it --rm \ --net=host \ --env DISPLAY=$DISPLAY \ --volume=$HOME/.Xauthority:/root/.Xauthority:rw \ --volume=$(pwd)/ORB_SLAM3:/root/ORB_SLAM3 \ --volume=$(pwd)/Vocabulary:/root/Vocabulary \ --volume=$(pwd)/my_dataset:/root/my_dataset \ orbslam3

🚀 Docker 容器內啟動 ORB-SLAM3(Monocular)

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

🎥 建議影格大小與 fps 與 camera.yaml 中一致(640x480、30Hz 等)


📄 camera.yaml 範例

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 Camera.RGB: 1

🧪 執行結果

你會看到:

  • OpenCV 視窗顯示影像與特徵點

  • Pangolin 視窗顯示相機軌跡與建圖結果

結束後按 Ctrl+C,可在 terminal 中看到 summary 與儲存軌跡(可改程式匯出)


📁 Optional:將 pose 輸出為檔案

你可以編輯 Examples/Monocular/mono_tum.cc

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

然後重新 make,即可輸出 .txt 軌跡供你做後續分析或轉成 /odom


✅ 總結:快速跑 ORB-SLAM3 流程

bash
# 主機建映像 docker build -t orbslam3 . # 啟動容器 docker run -it --rm ... orbslam3 # 容器內執行 ./Examples/Monocular/mono_tum ORBvoc.txt camera.yaml rgb.txt slam_frames

如果你要跑 stereo / RGB-D / Mono+IMU 模式,我也可以幫你整理範例指令,或者加入 rosbag 播放、ROS Bridge 支援。

你是否要我幫你整合 docker + rosbag + ORB-SLAM3 自動啟動腳本?還是打包你的影片流程成一鍵跑 slam 的容器?我可以幫你完成 ✅


=== use Docker image cchicc/orb_slam3_ubuntu20.04 =========================

你提到的 Docker 映像:

cchicc/orb_slam3_ubuntu20.04
包含 ORB-SLAM3 + Ubuntu 20.04 + ROS Noetic

這是一個非常適合直接使用的容器環境,用來部署 ORB-SLAM3 到 ROS Noetic 專案中。


✅ 如何使用這個 Docker 映像

1️⃣ 拉取映像:

bash
docker pull cchicc/orb_slam3_ubuntu20.04

2️⃣ 執行容器(含 GUI 顯示與掛載)

bash
xhost +local:root docker run -it --rm \ --net=host \ --env DISPLAY=$DISPLAY \ --volume=$HOME/.Xauthority:/root/.Xauthority:rw \ --volume=$(pwd)/my_dataset:/root/my_dataset \ cchicc/orb_slam3_ubuntu20.04

這樣你就可以把你原本的影像資料(如 slam_frames + rgb.txt)掛入 /root/my_dataset 使用。


3️⃣ 容器內使用範例

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

📁 相機設定 camera.yaml 範例

如果你沒有內參,可先用這個:

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 Camera.RGB: 1

🎯 適合用於:

  • ✅ 開箱即用 ORB-SLAM3 測試影片

  • ✅ 配合 rosbag 播放 /camera/image_raw

  • ✅ 快速接上 ROS Noetic 專案做導航、地圖、視覺處理


如果你希望我幫你整合:

  • 把影片轉成 rgb.txt + slam_frames

  • 建立一鍵執行的 docker+bash 啟動腳本

  • 撰寫 ROS Launch 自動播放 rosbag 並串 ORB-SLAM3

我可以幫你出完整的 run_slam.sh + launch 結構 ✅
是否要我幫你做一份範本?只要提供影片或 rosbag 名稱即可。



2025年3月21日 星期五

ORB-SLAM3 支援 ROS1 整合

 ORB-SLAM3 支援 ROS1 整合,而且比 ROS2 更成熟穩定(開發者原本就是基於 ROS1 開發 wrapper 的),很多研究和專案也是以 ROS1 為基礎。


🎯 你將達成的目標:

✅ 使用 ROS1(如 Noetic)整合 ORB-SLAM3,讓它:

  • 訂閱 /camera/image_raw/imu/data(視狀況)
  • 自動建圖 + 發布 /odom, /tf, /orbslam3/pose
  • 可搭配 rosbag 回放或實時相機串流
  • 可與導航、控制、地圖伺服器等 ROS 節點整合

🛠️ Step-by-step:ROS1 + ORB-SLAM3 整合流程


🧱 1. 環境建議

項目建議
作業系統Ubuntu 20.04
ROS 版本ROS Noetic
OpenCV4.x(libopencv-dev
相依套件Pangolin、GTSAM、Eigen3

🧰 2. 建立 ROS1 工作區

bash
mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make
bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc

📦 3. 下載 ORB-SLAM3 ROS1 Wrapper

bash
cd ~/catkin_ws/src git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

這個 repo 已經內含 ROS1 的 Examples/ROS 範例


⚙️ 4. 編譯 ORB-SLAM3 with ROS

bash
cd ~/catkin_ws catkin_make -j$(nproc)

💡 若出現錯誤:

  • 檢查你有沒有安裝 libopencv-dev, libpangolin-dev, libyaml-cpp-dev
  • 若用 CUDA 編譯報錯,可先試純 CPU 模式

📁 5. 建立相機設定檔與詞彙檔

你需要:

  • camera.yaml(內含 fx, fy, cx, cy...)
  • ORBvoc.txt(詞彙檔,可從 GitHub releases 下載)

放在 /home/yourname/ORB_SLAM3/config/ 路徑下


▶️ 6. 執行 ORB-SLAM3 ROS 節點

範例:單目相機

bash
rosrun ORB_SLAM3 Mono \ /home/you/ORB_SLAM3/Vocabulary/ORBvoc.txt \ /home/you/ORB_SLAM3/Examples/ROS/Monocular/YourCam.yaml \ true # ← 表示使用圖像時間戳同步

📡 7. rosbag 播放影像資料

bash
rosbag play your_video_data.bag

記得要包含 /camera/image_raw 話題。


📤 8. ORB-SLAM3 ROS 輸出資訊

話題說明
/orbslam3/pose相機 pose(geometry_msgs/PoseStamped)
/tf世界 → 相機轉換(可用於地圖)
/map(無)ORB-SLAM3 不會主動發布地圖話題,但你可改寫程式導出

🚀 延伸功能與整合建議

功能說明
加上 IMU 支援使用 Mono_Inertial 模式,訂閱 /imu/data
整合導航可將 /orbslam3/pose/odommove_base
地圖儲存可用 Open3D、evo、PCL 將點雲或軌跡儲存成 .ply/.pcd

🧪 測試範例 rosbag

可先測試官方資料集:

  • TUM RGBD
  • EuRoC MAV(含 IMU)

✅ 小結:你現在可以...

bash
# 播放 rosbag rosbag play yourdata.bag # 執行 ORB-SLAM3 節點 rosrun ORB_SLAM3 Mono ORBvoc.txt camera.yaml true

📌 再透過 rviz 查看 pose、軌跡
📌 再與導航或控制整合


❓想進一步?

我可以幫你:

  • 寫完整 ROS Launch 檔 → roslaunch orbslam3_run.launch
  • 整合 ROS bag 播放 + slam + tf + odom
  • 改寫 node 將 pose 導出為 /odom
  • 產生 .ply 地圖儲存器

要不要我幫你包一份 ROS1 launch 包?

還是把你的影片轉 ROS Bag?



ORB-SLAM3 整合成 ROS2

要將 ORB-SLAM3 整合成ROS2:

可直接用 ROS bag 播放資料 → 啟動 ROS2 Launch 檔 → 執行 ORB-SLAM3 SLAM 任務

這樣就可以輕鬆地串接整套視覺 SLAM 流程,並可未來與導航(Nav2)、控制、IMU、地圖伺服器等組件整合。


🎯 目標功能

你輸入:

bash
ros2 launch orbslam3_ros2 orbslam3_mono.launch.py

🔁 系統會自動:

  1. 播放指定 rosbag(含 /camera/image_raw
  2. 啟動 ORB-SLAM3 ROS2 節點
  3. 建圖、定位、發布 /odom/tf 等資訊
  4. 可選擇將地圖軌跡存檔

✅ 如何整合?完整教學如下:


🧱 1. 建立 ROS2 工作空間

bash
mkdir -p ~/ros2_orbslam3_ws/src cd ~/ros2_orbslam3_ws

🧰 2. 安裝 ROS2 相依套件

bash
sudo apt update sudo apt install -y \ ros-humble-image-transport \ ros-humble-cv-bridge \ ros-humble-ament-cmake \ ros-humble-rclcpp \ ros-humble-sensor-msgs \ ros-humble-std-msgs \ ros-humble-tf2 \ ros-humble-geometry-msgs

(建議用 ROS 2 Humble + Ubuntu 22.04)


📦 3. 將 ORB-SLAM3 ROS2 Wrapper 加入專案

bash
cd ~/ros2_orbslam3_ws/src git clone https://github.com/ToniRV/ORB_SLAM3-ROS2.git orbslam3_ros2

📁 這個 wrapper 包含:

  • ROS2 節點
  • 支援 monocular / stereo / RGB-D / inertial
  • 可用 rosbag 播放

🛠️ 4. 編譯專案

bash
cd ~/ros2_orbslam3_ws source /opt/ros/humble/setup.bash colcon build --symlink-install

🔁 每次開新 Terminal 記得:

bash
source ~/ros2_orbslam3_ws/install/setup.bash

📁 5. 資料準備(ROS Bag + 相機參數)

  • ROS Bag 中必須有話題 /camera/image_raw
  • 建立你的相機內參 .yaml 檔(camera.yaml
  • 建立 config/ 放參數

🧩 6. 建立 launch 檔(Monocular)

建立 launch/orbslam3_mono.launch.py

python
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='orbslam3_ros2', executable='mono', name='orbslam3_mono', parameters=[ {'voc_file': '/absolute/path/ORBvoc.txt'}, {'camera_config_file': '/absolute/path/config/camera.yaml'} ], remappings=[ ('/camera/image_raw', '/camera/image_raw') ] ) ])

✅ 記得換成你的實際路徑!


▶️ 7. 播放 ROS bag + 啟動 Launch

分開執行(建議)

bash
# 第1個 terminal:播放資料 ros2 bag play your_dataset.bag # 第2個 terminal:啟動 ORB-SLAM3 ros2 launch orbslam3_ros2 orbslam3_mono.launch.py

🎯 ORB-SLAM3 輸出資訊(自動在 ROS 中)

話題說明
/tf相機位姿
/odom機器人 odometry(可接入導航)
/map(選配)建立地圖點雲或格點圖
/orbslam3/image特徵提取後畫面(除錯用)

☁️ [進階] 自訂 rosbag 播放節點(Python)

你也可以寫一個 launch 中內建 rosbag play(透過 launch + subprocess),但推薦還是分開執行更彈性。


✅ 你已完成:

bash
ros2 launch orbslam3_ros2 orbslam3_mono.launch.py

📌 ORB-SLAM3 會訂閱 /camera/image_raw,自動處理影像與建圖定位。


🚀 加值應用你可以做:

功能說明
將 ORB-SLAM3 輸出導入 nav2 導航堆疊/odom + /tf 接入
加上 IMU 話題使用 mono_inertial 節點
使用 rtabmap 作為替代方案如果要語義地圖或 loop closure 更強
加入地圖儲存器存成 .pgm + .yaml 用於 AMCL / Nav2

若你需要我幫你打包成:

  • 📦 一鍵 Docker + ROS2 環境(含 rosbag + slam 啟動)
  • 🧪 測試範例(含你提供的影片轉 ROS Bag 範例)
  • 🗺️ 建圖後地圖輸出工具

只要把你目前的影片與 IMU/Bag 結構告訴我,我可以幫你一鍵整合 ✅
要不要我幫你建一份可直接跑的專案目錄?

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 執行模板 ✅ 要嗎?






2025年3月20日 星期四

EuRoC 是做視覺 SLAM 和視覺慣性導航(VIO)最常用的標準資料集之一

 EuRoC 是做視覺 SLAM 和視覺慣性導航(VIO)最常用的標準資料集之一。

以下是你完整需要知道的資訊:


📦 EuRoC MAV Dataset 簡介

全名:European Robotics Challenge Micro Aerial Vehicle Dataset
用途:用於測試和訓練 視覺 SLAMVisual-Inertial Odometry(VIO)3D 重建 等演算法
發表單位:ETH Zurich (Zurich University of Technology) MAV Drones Team


🎯 特點一覽

特性說明
🛩️ 機器平台Micro Aerial Vehicle(MAV)四軸飛行器
🎥 視覺感測器雙目相機(stereo monochrome),同步拍攝
📐 IMU 感測器高頻率 IMU(200Hz)
🗺️ Ground Truth精密 Vicon 光學定位系統 + Leica 雷射追蹤儀
⏱️ 時間同步所有資料皆以 timestamp 同步對齊
🌍 真實場景工廠內部、房間、走廊等結構化與半結構化環境

📁 資料結構與內容

每組資料集是一個 ROS bag 或資料夾結構(無 ROS 版本也可用),包括:

kotlin
MH_01_easy/ ├── cam0/ │ ├── data/ ← 左鏡頭影像(.png) │ └── data.csv ← timestamp + 對應檔名 ├── cam1/ │ ├── data/ ← 右鏡頭影像(.png) │ └── data.csv ├── imu0/ │ └── data.csv ← timestamp + acc + gyro ├── groundtruth/ ← 精確軌跡(有的才有) ├── calib/ ← 相機與 IMU 校正檔

🔍 相機與 IMU 詳細規格

感測器描述
Stereo Camera解像度 752×480,頻率 20Hz,灰階
IMU頻率 200Hz,六軸(加速度 + 陀螺儀)

📚 常用子資料集(共 11 套)

分類名稱難度
室內房間 (Machine Hall, MH)MH_01_easy ~ MH_05_difficult中~高
室內走廊 (Vicon Room, V1)V1_01_easy ~ V1_03_difficult
複雜室內 (V2)V2_01_easy ~ V2_03_difficult很高

建議從 MH_01_easy 開始練習。


🔧 使用方式

方法 A:ROS bag

直接播放 rosbag:

bash
rosbag play MH_01_easy.bag

可連接至 ORB-SLAM3, VINS-Fusion, OKVIS, ROVIO 等系統。

方法 B:自訂處理

從影像與 IMU CSV 檔載入:

  • 讀取 cam0/data.csv + cam0/data/ 圖片
  • 讀取 imu0/data.csv
  • 做時間同步與輸入模型訓練

🚀 支援的演算法與框架

框架 / 演算法支援方式
ORB-SLAM3內建 EuRoC 模式
VINS-Fusion完整支援
OKVIS官方開發演算法
ROVIOSLAM + VIO
Maplab視覺地圖建構與標記

📥 下載位置

官方網站:

常見壓縮格式:

  • .zip 檔案 (非 ROS 版本)
  • .bag(ROS bag 檔)

✅ 適合你怎麼用?

你正在建構:

  • 🔧 雙輪型 ROS 機器人
  • 🎥 使用真實影片與 IMU
  • 🤖 建構視覺導航模型

你可以參考 EuRoC 的資料格式:

  • 影格(含時間戳)
  • IMU(同步對齊) 然後模擬類似資料輸入到你的導航或 SLAM 系統。

要我幫忙的方向建議:

  • 幫你產生 EuRoC-style 的資料格式 from 影片 + IMU(前面腳本已可做到)
  • 幫你接入 ORB-SLAM3 跑你自己的資料
  • 把你影片/IMU 轉為 ROS bag(便於 ROS2 nav2 stack 使用)

需要我直接幫你整理成完整專案模板嗎?