高博十四講ch6中跑g2o程式遇到的問題總結

2021-09-11 22:13:44 字數 4276 閱讀 8114

高博十四講ch6中跑g2o程式遇到的問題總結

error: no matching function for call to 『g2o::blocksolver>::blocksolver(g2o::blocksolver>::linearsolvertype*&). i run the code on a virtual machine with ubuntu-16.04 installed.

then i found a solution in g2o's example. see following code.

typedef g2o::blocksolver> block;

typedef g2o::linearsolverdensemylinearsolver;

// block::linearsolvertype* linearsolver = new g2o::linearsolverdense();

// block* solver_ptr = new block(linearsolver);

g2o::optimizationalgorithmlevenberg* solver = new g2o::optimizationalgorithmlevenberg(

g2o::make_unique(g2o::make_unique())

);

解決辦法

1、新版本改掉了這個資料結構,用2017.6月的老版本就行了,可以刪除原來的,重新編譯高博書裡自帶的三方庫里的g2o。

2、好像是關於智慧型指標的問題(新版的g2o,blocksover的構造器是unique_ptr的,unique_ptr不支援拷貝構造,所以傳參必須通過move)修改main.cpp

修改**

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; 

// 曲線模型的頂點,模板引數:優化變數維度和資料型別

class curvefittin**ertex: public g2o::basevertex<3, eigen::vector3d>

virtual void oplusimpl( const double* update ) // 更新

// 存檔和讀盤:留空

virtual bool read( istream& in ) {}

virtual bool write( ostream& out ) const {}

};// 誤差模型 模板引數:觀測值維度,型別,連線頂點型別

class curvefittingedge: public g2o::baseunaryedge<1,double,curvefittin**ertex>

// 計算曲線模型誤差

void computeerror()

virtual bool read( istream& in ) {}

virtual bool write( ostream& out ) const {}

public:

double _x; // x 值, y 值為 _measurement

};int main( int argc, char** ar** )

; // abc引數的估計值

vectorx_data, y_data; // 資料

cout< block; // 每個誤差項優化變數維度為3,誤差值維度為1

**//-----修改以下注釋到下行**-----------//

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

std::unique_ptrlinearsolver ( new g2o::linearsolverdense());

//-----修改以下注釋到下行**-----------//

//block* solver_ptr = new block( linearsolver ); // 矩陣塊求解器

std::unique_ptrsolver_ptr ( new block ( std::move(linearsolver)));

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

//-----修改以下注釋到下行**-----------//

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

g2o::optimizationalgorithmlevenberg* solver = new g2o::optimizationalgorithmlevenberg ( std::move(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 ); // 開啟除錯輸出

// 往圖中增加頂點

curvefittin**ertex* v = new curvefittin**ertex();

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

v->setid(0);

optimizer.addvertex( v );

// 往圖中增加邊

for ( int i=0; isetid(i);

edge->setvertex( 0, v ); // 設定連線的頂點

edge->setmeasurement( y_data[i] ); // 觀測數值

edge->setinformation( eigen::matrix::identity()*1/(w_sigma*w_sigma) ); // 資訊矩陣:協方差矩陣之逆

optimizer.addedge( edge );

}// 執行優化

cout

cout<

cout<

//-----修改以下注釋到下行**-----------//

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

std::unique_ptrblock::linearsolvertype linearsolver ( new g2o::linearsolverdenseblock::posematrixtype());

//-----修改以下注釋到下行**-----------//

//block solver_ptr = new block( linearsolver ); // 矩陣塊求解器

std::unique_ptr solver_ptr ( new block ( std::move(linearsolver)));

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

//-----修改以下注釋到下行**-----------//

參考 unique_ptr說明:

參考 std::move的使用:

C語言知識串講(CH6)

1.一維陣列的定義和引用,一維陣列的初始化及程式。2.二維陣列的定義和引用,二維陣列的初始化及程式。3.字元陣列的定義 引用及初始化,字串和字串結束標誌,字元陣列的輸入輸出,字元陣列程式設計應用。附 有關陣列的部分程式設計題 1.求3 4矩陣中的最大值 include intmaxvalue int...

SLAM十四講 ch7 demo 複寫

剛剛學習1個多星期的slam,感覺自己的知識基礎 閱讀能力嚴重不足。幸好有高翔的 視覺slam十四講 由此書入門,覺得更容易了一些。之後應該會把全書通讀一遍,而後找時間進行筆記整理和分享,也便於自己以後的複習。我是看過1,2講後直接入手第7講,由於有需求的督促想盡快達到應用級別的了解,後續再補上數學...

視覺SLAM十四講ch13實踐問題記錄

進入ch13目錄中的原始碼中使用cmake與make進行編譯,在此過程中根據提示安裝缺少的依賴項 glog,gtest,g2o等 編譯完成後,執行程式.run kitti stereo 報錯 error while loading shared libraries libg2o core.so ca...