這是我們 SLAM 組同事高洪臣寫的文章,感謝分享??????~
代碼主框架在 FrameHandlerMono::processFrame()。
FrameHandlerMono::processFrame()
代碼主要在 SparseImgAlign。
SparseImgAlign
使用稀疏直接法計算兩幀之間的初始相機位姿T_cur_from_ref:根據last_frame_的特徵點 和last_frame_與new_frame_的相對位姿,建立損失函數(兩幀之間稀疏的 4x4 的 patch 的光度誤差)SparseImgAlign::computeResiduals,使用 G-N 優化演算法獲得兩幀之間的位姿變換,沒有特徵匹配過程,效率較高。
T_cur_from_ref
last_frame_
new_frame_
SparseImgAlign::computeResiduals
其中,
klt_max_level
klt_min_level
precomputeReferencePatches
最後,cur_frame_->T_f_w_ = T_cur_from_ref * ref_frame_->T_f_w_;
cur_frame_->T_f_w_ = T_cur_from_ref * ref_frame_->T_f_w_;
代碼入口在 Reprojector::reprojectMap。
Reprojector::reprojectMap
通過上一步的幀間匹配能夠得到當前幀相機的位姿,但是這種 frame to frame 估計位姿的方式不可避免的會帶來累計誤差從而導致漂移。
稀疏圖像對齊之後使用 特徵對齊,即通過地圖向當前幀投影,並使用 逆向組合光流 以稀疏圖像對齊的結果為初始值,完成基於 patch 的特徵匹配,得到更精確的特徵位置。
基於光度不變性假設,特徵塊在以前參考幀中的亮度應該和 new frame 中的亮度差不多,所以重新構造一個殘差,對特徵預測位置進行優化(代碼主要在Matcher::findMatchDirect):
Matcher::findMatchDirect
getCloseViewObs
該過程通過 inverse compositional Lucas-Kanade algorithm 求解,得到優化後更加準確的特徵點預測位置。
代碼主要在pose_optimizer::optimizeGaussNewton和FrameHandlerBase::optimizeStructure
pose_optimizer::optimizeGaussNewton
FrameHandlerBase::optimizeStructure
代碼主要在 FrameHandlerMono::relocalizeFrame。
FrameHandlerMono::relocalizeFrame
重定位效果一般,有待改進。
更多學習筆記:
PS:點贊??和分享??是對我們的最大鼓勵呀~??????