ORB SLAM2 從編譯到除錯

2021-09-20 10:36:58 字數 2716 閱讀 9960

已經安裝好opencv2.7版本以上的ubuntu系統(之前寫過類似的文章)

安裝pangolin 作為視覺化和使用者介面

sudo apt-get install libglew-dev  

git clone

(在pangolin目錄下)mkdir build

cd build

cmake ..

make -j4

(以下跟隨slam14講練習的可以跳過)安裝eigen3

git clone 

mkdir build

cd build

cmake ..

sudo make install

sudo cp -r /usr/local/include/eigen3 /usr/include

安裝第三方庫的依賴環境(指dbow2和g2o,orb-slam2裡面包含了這兩個,因此只需要安裝依賴環境就好):

sudo apt-get install libboost-dev

sudo apt-get install libeigen3-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev

git clone
之所以把安裝orb-slam這部分單獨提出來,是因為我在這個地方遇到了一點小問題,正常的安裝其實很簡單,我在台式電腦就是這樣做的:

chmod +x build.sh

sh build.sh

c++: internal compiler error: 已殺死 (program cc1plus)please submit a full …………

這種情況的原因在於記憶體不夠了,我當時選擇的是2gb的記憶體和1g的交換空間,我本來覺得夠了,但是很遺憾,它實際上是不夠的。所以我用sublime或者文字編輯器開啟build.s**件。將命令分開操作,這次g2o這部分順利的過去了,但是又卡在了orb-slam的編譯上。

無奈之下,我擴大了記憶體,當時40g的情況下記憶體最大是3g,還是不行,我有點懵,後來想了一下,擴大一下交換空間行不?

交換空間的擴大詳見文章:

所以我現在是3g記憶體+3g交換;這次……因為交換空間的速度明顯慢於記憶體,所以我一點點看著它從0.6%用了一兩分鐘爬到100%,所以還是不行。

我本來想繼續擴大記憶體或者交換的,但是突然想起了之前我對g2o那裡的做法,乙個處理不了可以把它分開進行處理嗎!當時預設的命令(build.sh裡面)的是 make -j,一開始我以為是只用乙個核心進行處理的意思,後來看了下記憶體和cpu,感覺不太對,四個cpu都在100%。我上網查了一下,並沒有查到,所以我用了 make -j2,這個倒是很明確,用兩個處理器進行操作,兩個一批進行編譯,結果這次居然順利的通過了。

因為非專業,這個原理還真是不太懂,如果大家知道麻煩告訴我一聲。

一般測試orb-salm都是單目和rgb-d比較多一點,雙目的話,因為kitti還是比較難下,太大了。所以優先單目和rgbd吧。

首先是資料集,tum和kitti兩個暫時就夠用了:

tum:這個主要是室內,單目和rgb-d

kitti:這個主要是室外,雙目

然後是分別測試:

單目在orb-slam下新建資料夾data,要測試的資料解壓在這裡就好。

tum資料集分為相機fr1,fr2,fr3,對應tum1-3.yaml;

一般第一次測試用fr1/xyz這個資料集,這個就是x,y,z方向來回動,很簡單,用來檢測一下系統出沒出什麼問題。

其他的資料看名字就知道,比如desk就是在桌子附近來迴轉,room就是在房間裡面掃來掃去。

值得注意的是,執行其他資料集的時候,單目不一定能追蹤成功,在台式電腦上能成功的在虛擬機器上也不一定能成功,這就需要我們進行一些調整,比如調整初始化需求數量啊什麼的,這個關係到對slam系統的理解,就不在多嘴了。

,以room為例,執行命令是:

./examples/monocular/mono_tum  vocabulary/orbvoc.txt examples/monocular/tum1.yaml   data/rgbd_dataset_freiburg1_room
python2 data/associate.py data/rgbd_dataset_freiburg1_room/rgb.txt data/rgbd_dataset_freiburg1_room/depth.txt >data/rgbd_dataset_freiburg1_room/associate.txt
在data/rgbd_dataset_freiburg1_room位置生成associate.txt檔案;

然後執行rgb-slam命令:

./examples/rgb-d/rgbd_tum vocabulary/orbvoc.txt examples/rgb-d/tum1.yaml data/rgbd_dataset_freiburg1_room data/rgbd_dataset_freiburg1_room/associate.txt
不得不說rgb-d比單目效果要好的不少,至少在room這個資料集上表現得不錯,但是在小部分資料集如fr2/pioneer_slam上面跑還是有丟追蹤的情況。

剩下的,關於orb-slam的改進還沒有弄完,等做完再記錄一下吧。

ORB SLAM2 定位模式

void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...

ORBSLAM2之LocalMapping執行緒

一 處理新關鍵幀processnewkeyframe 五 區域性ba 六 刪除冗餘關鍵幀keyframeculling 七 將當前關鍵幀插入閉環檢測佇列 更新當前關鍵幀的共檢視updateconnections a 遍歷當前關鍵幀的mp,更新共檢視 b 更新當前關鍵幀的子關鍵幀與父關鍵幀 i.與當前...

ORB SLAM2詳解(四)跟蹤

這一部分是orb slam系統中最基本的一步,會對每一幀影象進行跟蹤計算。tracking執行緒執行在主線程中,主要思路是在當前幀和 區域性 地圖之間尋找盡可能多的對應關係,來優化當前幀的位姿。每次新採集到一幀影象,就是用下列介面將影象傳入slam系統就行處理。該 位於主程式中 pass the i...