g2o擬合曲線

2021-08-07 08:01:01 字數 2948 閱讀 1757

cmakelists:

cmake_minimum_required(version 3.7)

project(g2o_curve_fitting_robin)

set(cmake_cxx_standard 11)

#新增g2o的cmake_modual_path

find_package(g2o required)

include_directories($)

find_package(opencv required)

include_directories($)

add_executable(g2o_curve_fitting_robin main.cpp)

target_link_libraries(g2o_curve_fitting_robin $ g2o_core g2o_stuff)

程式:#include #include #include #include //首先引入引入核心控制項中的基礎頂點和邊

#include //include進核心構件中基礎頂點頭檔案。引進後可以自己派生定義頂點.vertex:頂點

#include //include進核心構件中的基礎一元邊標頭檔案,自定邊時直接繼承類重寫就是了

//然後引入核心控制項中的求解器

#include //include進核心構件中的塊求解器標頭檔案

//引入各種優化演算法的標頭檔案,這裡有好多可以引進,用啥引用啥就是了

#include //include進核心構件中的gn優化演算法標頭檔案

#include //include進核心構件中的lm優化演算法標頭檔案

#include //include進核心構件中的dl優化演算法標頭檔案

//引入求解器的求解方法,注意這裡不是core檔案中的,而是solvers中的稠密中的線性稠密求解器

#include using namespace std;

//自定義頂點型別,模板引數:優化變數維度3維,資料型別是eigen::vector3d

//這裡的優化變數是乙個[a, b, c]構成的陣列,所以維度是3,型別就是eigen中的向量vector3d,也就是陣列

//curve曲線,curve fitting曲線擬合

class curvefittingvertex: public g2o::basevertex<3, eigen::vector3d>

virtual void oplusimpl(const double* update)//impl:介面實現.具體意思?

//存檔和讀盤,這裡留空

virtual bool read (istream& in) {}

virtual bool write (ostream& out) const {}

};//定義邊,邊為觀測值,這裡為函式誤差,是一維的double型別,鏈結的頂點型別是上方定義好的curvefittingvertex

class curvefittingedge: public g2o::baseunaryedge<1, double, curvefittingvertex>

//子類構造時先呼叫基類的建構函式

//計算曲線模型誤差,也就是觀測值,也就是邊

void computeerror()

virtual bool read (istream& in) {}

virtual bool write(ostream& out) const {}

double _x;//定義乙個_x,用於資料讀入計算誤差

};int main()

; // abc引數的估計值

vectorx_data, y_data; // 資料

cout<<"generating data: "《塊求解器特徵<3, 1>

//定義具有3, 1特徵的塊求解器型別為block型別。每個誤差項優化變數維度為3,誤差值維度為1

typedef g2o::blocksolver> block;

block::linearsolvertype* linearsolver = new g2o::linearsolverdense();//線性方程求解器

block* solver_ptr = new block(linearsolver);

// 梯度下降方法,從gn, lm, dogleg 中選

g2o::optimizationalgorithmlevenberg* solver = new g2o::optimizationalgorithmlevenberg( solver_ptr );

// g2o::optimizationalgorithmgaussnewton* solver = new g2o::optimizationalgorithmgaussnewton( solver_ptr );

// g2o::optimizationalgorithmdogleg* solver = new g2o::optimizationalgorithmdogleg( solver_ptr );

g2o::sparseoptimizer optimizer;//稀疏優化,圖模型,稀疏求解器

optimizer.setalgorithm(solver);// 設定求解器

optimizer.setverbose(true);// 開啟除錯輸出

//往圖中增加頂點,這裡就乙個頂點,所以不用迴圈

curvefittingvertex* v = new curvefittingvertex();

v->setestimate(eigen::vector3d(0, 0, 0));

v->setid(0);

optimizer.addvertex(v);

//往途中增加邊

for (int i = 0; i < n; ++i)

//執行優化

cout<<"start optimization"cout<<"estimated model: "<

g2o學習 g2o整體框架

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

g2o學習筆記

綜上所述,在g2o中選擇優化方法一共需要三個步驟 選擇乙個線性方程求解器,從pcg csparse choldmod三個選一 選擇乙個blocksolver 選擇乙個迭代器,從gn lm doglog中選 其中read和write函式可以不進行覆寫,僅僅宣告一下就可以了,settooriginimp...

g2o使用記錄

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