SVO 把像素的深度誤差模型看做概率分布,使用 高斯——均勻混合分布的逆深度(深度值服從高斯分布,局外點的概率服從 Beta 分布),稱為 深度濾波器 Depth Filter,每個特徵點作為 種子 Seed(深度未收斂的像素點)有一個單獨的深度濾波器。
代碼主要在 DepthFilter::initializeSeeds。
DepthFilter::initializeSeeds
mu = 1.0/depth_mean
sigma2 = z_range*z_range/36
z_range = 1.0/depth_min
深度濾波 DepthFilter::updateSeeds 主要過程:
DepthFilter::updateSeeds
Matcher::findEpipolarMatchDirect
DepthFilter::computeTau
DepthFilter::updateSeed
mu
sigma2
warp::getWarpMatrixAffine
feature_alignment::align2D
depthFromTriangulation
REMODE 對由於特徵定位不準導致的三角化深度誤差進行了分析
假設 焦距為 ,像素擾動為px_noise = 1.0,角度變化量px_error_angle為 則
px_noise = 1.0
px_error_angle
得
則
已知 為 T_ref_cur.translation(),根據正弦定理
T_ref_cur.translation()
所以,深度不確定度tau為
tau
逆深度不確定度 tau_inverse 為:
tau_inverse
double tau_inverse = 0.5 * (1.0/max(0.0000001, z-tau) - 1.0/(z+tau));
即逆深度標準差為
代碼主要在 void DepthFilter::updateSeed(const float x, const float tau2, Seed* seed)。
void DepthFilter::updateSeed(const float x, const float tau2, Seed* seed)
SVO 的融合是不斷利用最新時刻深度的觀測值,來融合上一時刻深度最優值,直至深度收斂。
通過上面兩步得到逆深度測量值 1./z 和 逆深度不確定度 ,則 逆深度 服從高斯分布
SVO 採用 Vogiatzis的論文 Video-based, real-time multi-view stereo 提到的概率模型,使用 高斯–均勻混合分布的深度濾波器,根據 和 更新以下四個參數:
seed->mu
seed->sigma2
seed->a
seed->b
更新過程(Vogiatzis的Supplementary matterial)如下:
其中,論文公式 19 有誤(代碼正確),應為
最終,得到收斂的逆深度的最佳估計值 seed->mu。
如果種子點的方差seed->sigma2,小於深度範圍 /200 的時候,就認為收斂了,它就不再是種子點,而是TYPE_CANDIDATE點。
TYPE_CANDIDATE
TYPE_CANDIDATE點被成功觀察到 1 次,就變成TYPE_UNKNOWN點;TYPE_UNKNOWN被成功觀察到 10 次,就變成TYPE_GOOD點;如果多次應該觀察而沒有被觀察到,就變成TYPE_DELETED點。
TYPE_UNKNOWN
TYPE_GOOD
TYPE_DELETED
DepthFilter
參考文獻:
PS:歡迎留言評論分享你的觀點,共同學習(入坑) SLAM ??????