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...