G2O使用要點總結

2021-08-22 08:44:24 字數 991 閱讀 1284

頂點的定義:

繼承basevertex《定點byte數,頂點結構體》類

實現settoriginimpl()函式,裡面給_estimate成員函式賦初值

_estimate的型別就是模板裡指定的頂點結構體

實現:oplusimpl(const double * update_)。update_是指向跟新值得指標,使用前需要轉換成真實的結構型別。不一定是頂點型別。比如update_可以是李代數,但頂點型別是李群。

可以使用esitimate()函式得到頂點的值,型別同上面的頂點結構體。

邊的定義:

繼承basebinaryedge《觀察值byte數,觀察值結構體,第乙個頂點的型別,第二個頂點的型別》(兩個頂點的邊)

或繼承baseunaryedge《觀察值byte數,觀察值結構體,頂點的型別》(乙個頂點的邊)

實現函式computeerror(),函式裡面需要計算_error的值,其他頂點和測量值的成員變數參考其他例子。

實現linearizeoplus(),單頂點的計算_jacobianoplusxi矩陣,雙頂點的還要計算_jacobianoplusxj矩陣

se3quat

使用map函式來變換乙個3d點

sparseoptimizer

這個應該是總的流程和資料管理器

setalgorithm設定具體計算更新值得演算法

addvertex加入頂點

addedge()

addparameter()可以傳入一些超參

initializeoptimization()給頂點填入初始值

optimize()啟動優化流程

呼叫所有邊的linearizeoplus()函式,得到每個邊的雅克比矩陣,然後把矩陣連線成乙個大矩陣

呼叫所有邊的computeerror(),得到誤差矩陣

基於雅克比和誤差,使用優化器計算更新值

把呼叫頂點的oplusimpl函式,更新頂點的_estimate變數

回到第一步

g2o學習 g2o整體框架

進來對g2o優化庫進行了學習,雖然才模仿著寫了兩個例程,但是對於整個g2o的理解和使用方面還是多了不少的感觸,特此寫下部落格,對這些天的學習進行記錄。說到整體的結構,不得不用一張比較概括的圖來說明 這張圖最好跟著畫一下,這樣能更好的理解和掌握,例如我第一次看的時候根本沒有注意說箭頭的型別等等的細節。...

g2o使用記錄

幾元邊就有幾個jacobian 例如g2o定義的二元邊就有 jacobianoplusxi和 jacobianoplusxj 原始碼中baseedge定義如下 d決定了誤差的維度 template int d,typename e class baseedge public optimizableg...

使用g2o求解BA

用節點表示相機和路標,用邊表示他們之間的觀測,使用自定義的點和邊 include include include include include include include iostream include common.h include sophus se3.hpp using namesp...