LSD SLAM的SE3Tracking執行緒筆記

2021-08-21 22:39:29 字數 3001 閱讀 9277

就se3tracker.cpp中trackframe

// **********== track frame **********==

//將初始估計記錄下來(記錄了參考幀到當前幀的剛度變換),然後定義乙個6自由度矩陣的誤差判別計算物件ls,定義cell數量以及最終的殘差

sophus::se3f referencetoframe = frametoreference_initialestimate.inverse().cast();

lgs6 ls;

int numcalcresidualcalls[pyramid_levels]; //cell數量 5層 金字塔

int numcalcwarpupdatecalls[pyramid_levels];

float last_residual = 0; //最終殘差

for(int lvl=se3tracking_max_level-1;lvl >= se3tracking_min_level;lvl--) //金字塔的迭代從level-4到level-1

//是否使用了簡單的仿射變換,

// 那麼把通過calcresidualandbuffers函式更新的affineestimation_a_lastit以及affineestimation_b_lastit,賦值給仿射變換係數

if(useaffinelightningestimation)

//呼叫calcweightsandresidual用方差歸一化殘差,並記錄呼叫次數

///這裡直接使用calcresidualandbuffers的結果.

float lasterr = calloptimized(calcweightsandresidual,(referencetoframe));

numcalcresidualcalls[lvl]++;

float lm_lambda = settings.lambdainitial[lvl]; //λ  lm優化的 調整量 與高斯牛頓的區別之處 (a+λi)x=b

for(int iteration=0; iteration < settings.maxitsperlvl[lvl]; iteration++)

// 新變換下的誤差

float error = calloptimized(calcweightsandresidual,(new_referencetoframe));

numcalcresidualcalls[lvl]++;

// accept inc?

if(error < lasterr) //誤差變小

// 列印除錯資訊

if(enableprintdebuginfo && printtrackingiterationinfo)

// converged?

if(error / lasterr > settings.convergenceeps[lvl])

iteration = settings.maxitsperlvl[lvl];

}last_residual = lasterr = error;

if(lm_lambda <= 0.2)

lm_lambda = 0;

else

lm_lambda *= settings.lambdasuccessfac;

break;

}else // 誤差反而沒有減少

if(!(inc.dot(inc) > settings.stepsizemin[lvl]))

iteration = settings.maxitsperlvl[lvl];

break;

}// 調整 lm 引數

if(lm_lambda == 0)

lm_lambda = 0.2;

else

lm_lambda *= std::pow(settings.lamb****ilfac, inctry);}}

} }

著重理清

calcresidualandbuffers
calcweightsandresidual
calculatewarpupdate
在track中怎樣實現的.

首先出現的

calloptimized(calcresidualandbuffers, (reference->posdata[lvl], reference->colorandvardata[lvl], se3tracking_min_level == lvl ? reference->pointposinxygrid[lvl] : 0, reference->numdata[lvl], frame, referencetoframe, lvl, (plottracking && lvl == se3tracking_min_level)));
呼叫了calcresidualandbuffers函式,

float se3tracker::calcresidualandbuffers(

int* idxbuf, //匹配點好壞標誌圖 指標

int refnum, // 參考幀 3d點數量

frame* frame, //當前幀 指標

const sophus::se3f& referencetoframe, //參考幀 變換到 當前幀下得 歐式變換矩陣 引用

int level, //金字塔層級

bool plotresidual //匹配誤差圖標誌

)

該函式主要做了如下幾件事:

參考:ewenwanw大佬部落格 lsb_slam tracking執行緒 se3tracking 歐式變換矩陣跟蹤參考幀 加權高斯牛頓優化演算法wlm 最小二乘優化 歸一化方差的光度誤差函式 偏導數雅克比矩陣j 線性方程組ldlt求解

kokerf的部落格 lsd-slam筆記之se3tracking

lancelot_vim的部落格 lsd-slam原始碼解讀第四篇:tracking

2018 10 23 T3 新的家園

暫無鏈結 過去已成為過去,而未來終將是過去。所有事物在出現的那一刻都注定成為歷史 題目背景 公元8102 8102 8102 年,火星的生態環境遭到嚴重破壞,終於也難逃人類的掠奪,變成了一顆死星。所有人,都乘坐飛船逃往了無盡的深空,除了你。默默地,你步行在荒蕪的街道上,凝視著這片空無一人的大地 這個...

YCH的模擬賽 T3

暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...

CSP day2T3 樹的重心

考場上看到標題樹的重心!什麼,完了,忘記怎麼求樹的重心了。好了,回歸正題。這道題出題人給的部分分很有講究的。此題非正解給了很高的分,足足有75分。接下來我們講一下正解 因為對於一棵二叉樹的根,若它本身不為重心,則重心一定在其重兒子的子樹上。因為該樹深度較小,我們可以重兒子倍增的方法,先dfs一遍,更...