SLAM的Bundle Adjustment上,隨着時間的推移,路標特徵點(landmark)和相機的位姿pose愈來愈多,BA的計算量隨着變量的增長而增長,即便BA的H矩陣是稀疏的,也吃不消。所以,咱們要限制優化變量的多少,不能只一味的增長待優化的變量到BA裏,而應該去掉一些變量。那麼如何丟變量就成了一個很重要的問題!好比有frame1,frame2,frame3 以及這些frame上的特徵點pt1…ptn。新來了一個frame4,爲了避免再增長BA時的變量,出如今腦海裏的直接作法是把frame1以及相關特徵點pt直接丟棄,只優化frame2,frame3,frame4及相應特徵點。然而,這種作法好嗎?ide
Gabe Sibley [2]在他們的論文中就明確的說明了這個問題。直接丟掉變量,就致使損失了信息,frame1可能能更多的約束相鄰的frame,直接丟掉的方式就破壞了這些約束。在SLAM中,通常機率模型都是建模成高斯分佈,如相機的位姿都是一個高斯分佈,軌跡和特徵點造成了一個多元高斯分佈p(x1,x2,x3,pt1…),而後圖優化或者BA就從一個機率問題變成一個最小二乘問題。所以,從這個多元高斯分佈中去掉一個變量的正確作法是把他從這個多元高斯分佈中marginalize out.優化
這marginalize out具體該如何操做呢?Sliding widow Filter [2]中只是簡單的一句應用Schur complement(舍爾補). 咱們知道SLAM中的圖優化和BA都是最小二乘問題,以下圖所示(ref.[1])
.net
構建出來的Hx=b是利用了marg變量的信息,也就是說咱們沒有人爲的丟棄約束,因此不會丟失信息,可是計算結果的時候,咱們只去更新了咱們但願保留的那些變量的值。在slam的過程當中,BA不斷地加入新的待優化的變量,並marg舊的變量,從而使得計算量維持在必定水平。blog
marginalize的本意是:只更新部分變量,而不是全部變量。圖片
一句話總結以下:要把一部分變量從多元高斯分佈從分離出來,須要把協方差矩陣也給分開,然而協方差矩陣你們都知道,衆多變量之間息息相關,不能簡單地說協方差矩陣的哪一塊就是誰的,須要用到schur complement (舍爾補)來分割。get
邊緣化(marginalization)的過程就是將滑窗內的某些較舊或者不知足要求的視覺幀剔除的過程,因此邊緣化也被描述爲將聯合機率分佈分解爲邊緣機率分佈和條件機率分佈的過程(說白了,就是利用shur補減小優化參數的過程)。博客
利用Sliding Window作優化的過程當中,邊緣化的目的主要有兩個:it
直接進行邊緣化而不加入先驗條件的後果:io
這兩種邊緣化的措施主要仍是針對懸停和恆速運動等退化運動。class
按理說是不該該把滑窗當作一小節來說的,邊緣化、舒爾補都屬於滑窗的範圍,但前面已經總結了。
並且正如賀一加師兄在其博客中提到的,滑窗的三大法寶"Marginalization","Schur complement","First estimate jacobin",這些在前面也提到了。