VOOM 筆記

cold_moon發表於2024-05-27
原始題目 VOOM: Robust Visual Object Odometry and Mapping using Hierarchical Landmarks
中文名稱 使用分層landmarks 的 Robust 視覺目標里程計和建圖
發表時間 2024 年 2 月 21 日
平臺 ICRA 2024
來源 北京理工大學
文章連結 https://arxiv.org/abs/2402.13609
開原始碼 https://github.com/yutongwangBIT/VOOM

VOOM 是一個實時視覺同步定位與地圖構建(SLAM)庫,它使用高階物體和低階點作為分層 landmarks,以粗到細的方式進行處理。它計算攝像頭的軌跡和稀疏的三維重建。

摘要

近年來,物件導向的同步定位與地圖構建(SLAM)因其在保持計算效率的同時提供高階語義資訊的能力而受到越來越多的關注。

一些研究人員試圖透過將 the modeled object residuals 整合到 bundle adjustment 中來提高定位精度。然而,很少有表現出比基於特徵的視覺 SLAM 系統更好的結果,因為通用的粗糙物件模型(如長方體或橢球體)不如特徵點準確。

在本文中,我們提出了一種視覺物件里程計和建圖框架 VOOM(Visual Object Odometry and Mapping ),該框架使用高階物件和低階點作為分層 landmarks,從粗到細的方式,而不是直接使用 object residuals 進行 bundle adjustment。

  • 首先,介紹了一種改進的 觀測模型( observation model)和一種新的雙二次函式 資料關聯方法( data association method),用於表示物理物件。它有助於建立緊密反映現實的 3D 地圖。
  • 接下來,我們使用 物件資訊 來增強 特徵點的資料關聯,從而更新地圖。
  • 在視覺物件里程計後端,使用更新的地圖來進一步最佳化相機姿勢和物件。
  • 同時,在我們的 視覺物件建圖過程中,利用物件和基於點的可視性圖執行 local bundle adjustment。
  • 實驗表明,VOOM 在定位方面優於物件導向的 SLAM 和特徵點 SLAM 系統,如 ORB-SLAM2。

1. 引言

準確的定位和建圖在各種應用中至關重要,包括自主導航、機器人操作和擴增實境。
相機具有成本效益且易於整合,同時提供豐富的幾何形狀和語義資訊,使其適用於真實場景。因此,視覺里程計 或 同步定位和對映(SLAM)引起了研究人員的日益關注。

然而,傳統視覺里程計或SLAM框架 map points as landmarks 缺乏 高階資訊,導致魯棒性和適用性有限[1]–[3],這導致人們對 物件級里程計和建圖演算法[4]–[6]的興趣日益濃厚,尤其是在一些使用長方體或雙二次體作為 landmarks 的輕量級方法[7],[8]。

目前的演算法主要集中在構建更準確的物體 landmarks [9]、[10],以及利用物體資訊[11]–[13]提高定位精度。儘管這些方法將物件殘差納入 bundle adjustment 中,但它們依賴於 基於特徵的技術(如ORB-SLAM2)[2])對相機姿勢的準確初始猜測。它們的定位結果與基於特徵的方法相似,有時甚至更差。這表明當前基於物件的方法尚未充分利用有價值的物件資訊來提高定位精度。如何進一步利用物件資訊來改善視覺SLAM結果仍然具有挑戰性。

在本文中,我們提出了一種名為 VOOM 的新穎的視覺物件里程計和建圖框架,它同時應用 低階特徵點和高階物件 到 里程計和對映的整個過程,如圖1所示。

image

圖 1:頂部: Groundtruth map.。中間:ORB SLAM2 with loop closure disabled。底部:VOOM。彩色橢球體表示 3D 物件,藍色圓錐體表示攝像機姿勢,綠線表示關鍵幀之間的可視性關係。ORB-SLAM2 生成的地圖具有冗餘的點雲和模糊的邊界,而我們的 VOOM 構建了更輕量級但語義增強的地圖,從而實現更準確的相機姿態估計。

  • 在里程計中,我們將 基於 Wasserstein 距離[14]的雙二次曲線殘差模型基於歸一化 Wasserstein 距離的物件資料關聯方法 相結合,構建了精確的物件級地圖。透過利用物件級資訊,當前幀的關鍵點與先前的地圖點更好地匹配,從而增強了幀的姿態估計。
  • 在視覺物件對映方面,我們 基於關鍵幀和物件之間的觀察關係,建立了一個基於物件的可視性圖。更新與圖中當前鄰域對應的地圖點,從而更新基於點的可視性圖和區域性地圖。
  • 透過 bundle adjustment,最佳化了區域性關鍵幀的姿態和地圖點的位置。

在實驗中,我們已經證明,在大多數序列中,僅使用里程計和建圖元件的所提出的 VOOM 甚至優於具有 loop closure 的 ORB-SLAM2。據我們所知,這是第一篇實現並證明使用雙二次曲面和特徵點的物件導向 SLAM 系統的論文,可以比最先進的基於特徵的視覺 SLAM 系統實現更好的定位精度。

總而言之,我們的主要貢獻有三點:

  • 開發一種新穎的視覺物件里程計和對映框架,使用特徵點和雙二次曲線作為landmarks;
  • 設計有效的物件最佳化演算法、物件關聯和基於物件的地圖點關聯,以構建具有分層landmarks的地圖;
  • 廣泛的實驗驗證證明了所提出的方法與最先進的方法相比的優越性。

實踐

測試環境: ubuntu 20.04

安裝

1. Pangolin 0.6

參考: https://blog.csdn.net/weixin_43592742/article/details/134415646

2. Eigen3 3.3.7

https://gitlab.com/libeigen/eigen/-/tree/3.3.7?ref_type=tags

#安裝
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install

安裝後,標頭檔案安裝在/usr/local/include/eigen3/

注意!!!
不要採用下面這個指令安裝eigen3,

sudo apt-get install libeigen3-dev

如果採用這個指令安裝,預設是安裝到了/usr/include/eigen3,ORB-SLAM3檢測不到,導致編譯會報錯。利用原始碼安裝,安裝好的路徑是 /usr/local/include/eigen3/>

3. dlib

https://blog.csdn.net/weixin_64612422/article/details/133913442

git clone https://github.com/davisking/dlib.git
cd dlib
mkdir buid
cd build
cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1
cmake --build .
cd ..
sudo python3 setup.py install

最後檢驗 dlib 是否成功安裝 pip list 檢視是否有dlib即可

dlib                     19.24.99   

4. 安裝 Protocol Buffers

https://www.cnblogs.com/odesey/p/17619240.html

5. 編譯

git clone https://github.com/yutongwangBIT/VOOM.git VOOM
cd VOOM/
sh build.sh

錯誤1: opencv 版本問題

我安裝的 opencv 是 4.9, 因此需要修改 cmake 檔案:

find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
   message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
else()
   if(NOT "${OpenCV_VERSION_MAJOR}" STREQUAL "4")
	  message(WARNING "OpenCV 4 is required for dnn module. Object detector will not be available.")
   else()
	  message("OpenCV 4 found. Make sure OpenCV is built with dnn module and CUDA.")
	  add_definitions(-DUSE_DNN)
   endif()
endif()

#find_package(OpenCV 3.0 QUIET)
#if(NOT OpenCV_FOUND)
#   find_package(OpenCV 2.4.3 QUIET)
#   if(NOT OpenCV_FOUND)
#      message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
#   endif()
#endif()

錯誤2:

# Dlib 
find_package(dlib REQUIRED)

Could not find a package configuration file provided by "DLib" with any of
the following names:

 DLibConfig.cmake
 dlib-config.cmake

解決:

sudo make install
sudo ldconfig

錯誤:

VOOM/Examples/rgbd_tum_with_ellipse.cc:137:73: error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope
137 | imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);

imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);

改為:

imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],cv::IMREAD_UNCHANGED);

執行

cd bin/
./rgbd_tum_with_ellipse ../Vocabulary/ORBvoc.txt ../Cameras/TUM2.yaml PATH_TO_DATASET ../Data/fr2_desk/fr2_desk.txt ../Data/fr2_desk/detections_yolov8x_seg_tum_rgbd_fr2_desk_with_ellipse.json points fr2_desk

報錯:

Failed to load image: PATH_TO_DATASET/rgb/1311868164.363181.png
X Error of failed request: GLXBadFBConfig
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 21 (X_GLXGetFBConfigs)
Serial number of failed request: 41
Current serial number in output stream: 41
Segmentation fault (core dumped)

解決:

這是因為沒有下載資料集:

連結:https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download

https://cvg.cit.tum.de/rgbd/dataset/freiburg2/rgbd_dataset_freiburg2_desk.tgz