最近開始學習下orb_slam2原始碼,邊閱讀邊記錄下自己的理解,首先來乙個大致初始化流程圖,閱讀從mono_euroc.cc開始。
第一幀剛來
,未構造初始化器
,則構造 (
如果是單目初始器
mpinitializer為空,
即第一次進行初始化
,並且特徵點數
>100
,得到用於初始化的第一幀:)
2.第二幀(當前幀),如果當前(第二幀)幀特徵點太少,刪除之前構造的初始器,將
mpinitializer
置空,返回需要重新初始化(如果當前幀特徵點數大於
100,則得到用於單目初始化的第二幀:) 3.
否則,第二幀特徵點數大於
100,就開始找匹配,在
minitialframe
與mcurrentframe
中找匹配的特徵點對 4.
檢查如果初始化的兩幀之間的匹配點太少,小於
100,則重新初始化 5.
初始化開始in
itializer::initialize
函式,根據匹配點,通過
h模型或
f模型進行單目初始化,得到兩幀間相對位姿、初始
:mvinip3d
,初始化地圖
5.mpinitializer->initialize (mcurrentframe, mvinimatches, rcw, tcw, mvinip3d, vbtriangulated)
根據當前幀和匹配點對,啟動執行緒平行計算基本矩陣和單應矩陣,計算分數比,根據給出評價函式打分的方式自動選擇求解運動的方法。
reconstructh
函式或reconstructf函式
5.1.
刪除那些無法進行三角化的匹配點;
5.2.
將初始化的第一幀作為世界座標系,因此第一幀變換矩陣為單位矩陣,當前幀的位姿:由世界系到當前幀的變換矩陣;
5.3.tracking::createinitialmapmonocular
函式,將三角化得到的3d點
mvinip3d
包裝成,初始化地圖,將地圖點和關鍵幀加入地圖
map中;
5.3.createinitialmapmonocular();
將三角化得到的3d點
mvinip3d
包裝成,將3d
點包裝成
型別存入
keyframe
和map
中 1).
將初始幀,當前幀建立均為關鍵幀
2).向地圖中新增初始和當前關鍵幀
3).建立地圖點並與關鍵幀關聯。將
3d點包裝成
地圖點 4).
更新關鍵幀間的連線關係(以共視地圖點的數量作為權重)
5).ba
優化,對這兩幀姿態進行全域性優化重投影誤差(lm)
6).需要更新區域性地圖,區域性關鍵幀和區域性地圖點;並且更新
lastframe
,lastkeyframe
,以及當前幀的
referencekf
歡迎交流和學習,如有理解不對的地方請指出。
ORBSLAM2原始碼閱讀(1) 概論
最近一直在沉迷明日方舟好久沒更新部落格了,好在這遊戲理智少,而且想著自己不能再頹廢下去,痛定思痛,決定開始開這個坑。orbslam2應該會是目前能開的最大的坑了吧,我盡量做完 咕咕 如果看到有什麼錯誤的地方或者感覺需要改進的地方請務必和我說,大家一起努力嘛 關於整個orbslam的流程,請參考這個部...
orb slam2原始碼解讀(一) Frame類
orb slam2是slam界中乙個非常優秀且著名的專案,關於該項目的解讀網上資料較少,大都是對演算法的整體構架和演算法思路進行解讀,本系列部落格將會帶你一點一滴地解讀orb slam2的源 在兼顧演算法講解的同時,更著重與 的結構與實現細節。這次就先從frame類講起。公有成員變數 orb特徵點詞...
ORB SLAM2 定位模式
void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...