Skip to main content

ORB-SLAM3 vs VINS-Fusion — 代碼層工程哲學對比

類型:comparison(跨 zone)— 不走 14 項 dissection 門檻,核心是「打開 IDE 改代碼時手感差別」 覆蓋:兩條 production stack 在 main entry / 主 pipeline / 前端 / 狀態 / 優化器 / IMU / 初始化 / 回環 8 個維度的代碼級對照 互補對象:
Status: v1 — 代碼路徑與類名引自上游 repo(GitHub URL 在文末),實測 commit / API 行為標 UNVERIFIED。 TL;DR. 兩者不是「同一類 SLAM 實現的不同版本」,而是工程哲學差很多:
  • ORB-SLAM3 是 map-centric SLAM library — 核心圍繞 Frame / KeyFrame / MapPoint / Map / Atlas,Tracking、LocalMapping、LoopClosing 彼此耦合,目標是完整建圖、重定位、多地圖、回環與全局一致性。
  • VINS-Fusion 是 estimator-centric ROS stack — 核心是固定滑窗 VIO/VO 狀態估計器 Estimator,loop / global fusion 是相對獨立的 ROS node/package。
選哪個取決於你要改什麼:SLAM 地圖 / 多地圖 / 重定位 → ORB-SLAM3;VIO 狀態估計 / IMU / multi-sensor fusion / GPS → VINS-Fusion。

1. 工程入口:庫 vs ROS estimator stack

ORB-SLAM3 的 System.cc 初始化時會直接建立 Tracking、LocalMapping、LoopClosing,並把後兩者放到獨立 thread;後面還會把三者互相設 pointer,形成緊密耦合 pipeline。 VINS-Fusion 主 node 是 ROS subscriber + buffer + sync thread:main() 讀配置、建立 Estimator、訂閱 IMU / image / feature / restart 等 topic,然後啟動 sync_process thread 並 ros::spin()。

2. 主 pipeline 對比

ORB-SLAM3 主線

Tracking.h 裡有清晰 tracking 狀態機:NO_IMAGES_YET / NOT_INITIALIZED / OK / RECENTLY_LOST / LOST;同一個類裡還有 Track()、MonocularInitialization()、TrackReferenceKeyFrame()、TrackWithMotionModel()、PredictStateIMU()、Relocalization() 等。

VINS-Fusion 主線

Estimator 接口非常 estimator-style:inputIMU()、inputFeature()、inputImage()、processIMU()、processImage()、processMeasurements()、changeSensorType()。

3. 前端特徵:ORB 描述子匹配 vs KLT 光流追蹤

ORB-SLAM3 依賴 ORB 特徵、DBoW2 詞袋、g2o;DBoW2 和 g2o 是 modified versions 含在 Thirdparty/ 中。 VINS-Fusion 的 FeatureTracker::trackImage() 走 cv::calcOpticalFlowPyrLK 做 temporal tracking;不足的點再用 cv::goodFeaturesToTrack 補新點,可做 reverse check 和 fundamental matrix RANSAC reject。 改前端時的落點:
ORB-SLAM3 前端更像「特徵—描述子—地圖點」系統;VINS-Fusion 前端更像「連續幀 feature track 管理器」。

4. 狀態量:儲存地圖 vs 儲存滑窗狀態

ORB-SLAM3 的狀態中心

Atlas 代碼裡有多個 Map、當前 map、bad maps、map points、keyframes、camera、KeyFrameDatabase、ORBVocabulary 等成員;它不是只估計最近幾幀,而是在維護一個可持久化、可切換、可 merge 的 map graph:

VINS-Fusion 的狀態中心

Estimator 是固定滑窗形式,核心成員包括:
parameters.h 固定 WINDOW_SIZE = 10,定義 pose / speed-bias / feature 等 parameter block 尺寸。 本質差異:

5. 優化器:g2o map BA vs Ceres sliding-window factor graph

ORB-SLAM3 的 Optimizer.h include 多種 g2o 類型,提供 BundleAdjustment()、GlobalBundleAdjustment()、FullInertialBA()、LocalBundleAdjustment()、PoseOptimization()、PoseInertialOptimizationLastKeyFrame()、OptimizeEssentialGraph()、OptimizeSim3()、LocalInertialBA()、MergeInertialBA()、InertialOptimization() 等靜態方法。 VINS-Fusion 用 Ceres Solver;Estimator include Ceres 和 projection / IMU / marginalization / pose local parameterization 等 factor 相關頭文件,狀態通過 vector2double() 填進 Ceres parameter blocks,再 double2vector() 寫回。 改優化殘差時的落點:

6. IMU 處理:融在 SLAM pipeline vs VIO 主體

ORB-SLAM3 的 System::TrackMonocular() 可接收 vector<IMU::Point>,把 IMU 數據 push 給 tracker 再進 GrabImageMonocular();建構 Tracking / LocalMapping / LoopClosing 時會根據 sensor type 判斷 inertial flag。 VINS-Fusion 則典型:imu_callback() 調 estimator.inputIMU();processIMU() 做 preintegration / propagation,更新 Rs / Ps / Vs,處理 bias 和 gravity。

7. 初始化:SLAM 狀態機 vs VIO alignment

ORB-SLAM3 用 Tracking 狀態機(NOT_INITIALIZED / OK / RECENTLY_LOST / LOST),所有初始化、重定位、IMU prediction 都在 Tracking 主流程內。 VINS-Fusion 用 SolverFlag INITIAL / NON_LINEAR 和 MarginalizationFlag MARGIN_OLD / MARGIN_SECOND_NEW;初始化含 initialStructure()、visualInitialAlign()、PnP、Global SFM、Visual-IMU alignment,之後才進非線性滑窗優化。

8. 回環:內建核心線程 vs 外掛式 loop_fusion

ORB-SLAM3 的 LoopClosing 是 System 初始化時直接建立並啟動的 thread;持有 Atlas、KeyFrameDatabase、ORBVocabulary、LocalMapping 等引用,提供 DetectCommonRegionsFromBoW()、DetectAndReffineSim3FromLastKF()、CorrectLoop()、MergeLocal()、RunGlobalBundleAdjustment()。 VINS-Fusion 的 loop 是另一個 node:vins_node 之外可再啟 loop_fusion_node;PoseGraph 載入 BRIEF vocabulary、查 DBoW database、detectLoop()、addKeyFrame(),根據是否用 IMU 啟動 4DoF 或 6DoF pose graph optimization。 實際代碼差異:

9. 改代碼時的實際手感

9.1 你要改前端

9.2 你要加新 residual / factor

VINS-Fusion 對「加 factor」更直觀(整個 estimator 本來就是 Ceres factor graph 風格);ORB-SLAM3 對「加 SLAM 地圖約束」更自然(已有完整 map graph / keyframe graph / loop graph)。

9.3 你要做 multi-session / map reuse / relocalization

偏 ORB-SLAM3。Atlas、Map、KeyFrameDatabase、LoopClosing、BoW relocalization 都是核心架構的一部分。 VINS-Fusion 也能 loop/path correction,但主 estimator 不是為「長期可重用地圖」設計,比較像穩定提供 local VIO/VO odometry,loop/global fusion 做後端修正。

9.4 你要做 GPS / multi-sensor fusion

偏 VINS-Fusion。工程命名 + README 都是 multi-sensor state estimator,repo 有 global_fusion、loop_fusion、vins_estimator 等 package 分工。 ORB-SLAM3 也可擴展,但會進入 map/keyframe/BA/loop 耦合,修改成本較高。

10. 一句話總結

ORB-SLAM3 的代碼是「完整 SLAM 系統」 — Tracking 產生 KeyFrame,LocalMapping 維護 MapPoint,LoopClosing 修正 Atlas,全局一致性是核心。
VINS-Fusion 的代碼是「固定滑窗 VIO/VO estimator」 — FeatureTracker 給 tracks,Estimator 做 IMU preintegration + Ceres optimization + marginalization,loop/global fusion 是相對獨立的後處理模塊。

Cross-references


Sources

代碼路徑與類名引自上游 repo 公開 master:
← Back to crossing · → ORB-SLAM3 dissection · → VINS-Fusion dissection