關於g2o頂點/邊類型所包含函數的含義

用邊表示三維點投影到圖像平面的重投影誤差,就可以設置輸入參數如下:

BaseBinaryEdge<2, Vector2D, VertexSBAPointXYZ, VertexSE3Expmap>

這個是個二元邊。第1個2是說測量值是2維的,也就是圖像像素座標x,y的差值,對應測量值的類型是Vector2D,兩個頂點也就是優化變量分別是三維點 VertexSBAPointXYZ,和李羣位姿VertexSE3Expmap

頂點裏主要複寫了頂點更新函數oplusImpl和頂點重置函數setToOriginImpl,
邊主要有以下幾個重要的成員函數

virtual bool read(std::istream& is);
virtual bool write(std::ostream& os) const;
virtual void computeError();
virtual void linearizeOplus();

下面簡單解釋一下
read,write:分別是讀盤、存盤函數,一般情況下不需要進行讀/寫操作的話,僅僅聲明一下就可以
computeError函數:非常重要,是使用當前頂點的值計算的測量值與真實的測量值之間的誤差
linearizeOplus函數:非常重要,是在當前頂點的值下,該誤差對優化變量的偏導數,也就是我們說的Jacobian

除了上面幾個成員函數,還有幾個重要的成員變量和函數也一併解釋一下:

_measurement:存儲觀測值
_error:存儲computeError() 函數計算的誤差
_vertices[]:存儲頂點信息,比如二元邊的話,_vertices[] 的大小爲2,存儲順序和調用setVertex(int, vertex) 是設定的int 有關(0 或1)
setId(int):來定義邊的編號(決定了在H矩陣中的位置)
setMeasurement(type) 函數來定義觀測值
setVertex(int, vertex) 來定義頂點
setInformation() 來定義協方差矩陣的逆

核函數

圖優化中也有一種核函數。 引入核函數的原因,是因爲SLAM中可能給出錯誤的邊。SLAM中的數據關聯讓科學家頭疼了很長時間。出於變化、噪聲等原因,機器人並不能確定它看到的某個路標,就一定是數據庫中的某個路標。萬一認錯了呢?我把一條原本不應該加到圖中的邊給加進去了,會怎麼樣?

嗯,那優化算法可就慒逼了……它會看到一條誤差很大的邊,然後試圖調整這條邊所連接的節點的估計值,使它們順應這條邊的無理要求。由於這個邊的誤差真的很大,往往會抹平了其他正確邊的影響,使優化算法專注於調整一個錯誤的值。

於是就有了核函數的存在。核函數保證每條邊的誤差不會大的沒邊,掩蓋掉其他的邊。具體的方式是,把原先誤差的二範數度量,替換成一個增長沒有那麼快的函數,同時保證自己的光滑性質(不然沒法求導啊!)。因爲它們使得整個優化結果更爲魯棒,所以又叫它們爲robust kernel(魯棒核函數)。

很多魯棒核函數都是分段函數,在輸入較大時給出線性的增長速率,例如cauchy核,huber核等等。當然具體的我們也不展開細說了。

核函數在許多優化環境中都有應用,博主個人印象較深的時當年有一大堆人在機器學習算法里加各種各樣的核,我們現在用的svm也會帶個核函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章