高博十四講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...