《視覺SLAM十四講》第六講g2o實踐代碼報錯解決方法


問題:

首先貼出報錯部分代碼:

typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block; 
Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>(); 
Block* solver_ptr = new Block( linearSolver );     
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );
g2o::SparseOptimizer optimizer;   
optimizer.setAlgorithm( solver );   
optimizer.setVerbose( true ); 

按照書上的例程編寫代碼,編譯時報錯(部分截圖)如下:

/home/wxy/slambook/useg2o/main.cpp:77:49: error: no matching 

function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::LinearSolverType*&)’
 Block* solver_ptr = new Block( linearSolver );      
                                             ^
/home/wxy/slambook/useg2o/main.cpp:77:49: note: candidate is:
In file included from     /usr/local/include/g2o/core/block_solver.h:199:0,
             from /home/wxy/slambook/useg2o/main.cpp:4:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<3, 1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 3, 3> >]
 BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

好像是編譯器無法找到某個函數,或者某個調用出錯。我第一個想到的是無法找到g2o有關函數那應該是g2o庫沒有裝好(這個庫我make的時候等了大概兩個小時,也不知道為啥會卡這么久)於是將庫重裝了一下,再次編譯還是報錯,仔細讀報錯信息下面有寫到:

BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

會不會是我調用方法不對?網上搜索std::unique_ptr是干嘛用的(c++知識忘得差不多了....),搜到:http://blog.csdn.net/pi9nc/article/details/12227887
原來是智能指針。

unique_ptr“唯一”擁有其所指對象,同一時刻只能有一個unique_ptr指向給定對象(通過禁止拷貝語義、只有移動語義來實現)。

原代碼中用到的好像是普通的指針,難道是因為指針類型不匹配?然后我在網上收到了一篇博客:http://blog.csdn.net/robinhjwy/article/details/78084210
驚了,原來有人跟我一樣遇到過這種問題,而且早就解決了。。。。修改過后的代碼如下:

typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block;
std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>() );
std::unique_ptr<Block> solver_ptr (new Block( std::move(linearSolver) ));
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( std::move(solver_ptr) );
g2o::SparseOptimizer optimizer;   
optimizer.setAlgorithm( solver );   
optimizer.setVerbose( true ); 

將初始化中用等號賦值的地方改成用std::unique_ptr賦值,將linearSolver和solver_ptr用移動語言也就是std::move來實現。改完后編譯運行成功,意猶未盡的我又去查了一下關於g2o的初始化問題,因為報錯的地方就是這里,然后看到了這篇博客:
https://www.cnblogs.com/serser/p/7815588.html

修改代碼如下:

typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block;
Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>();
Block* solver_ptr = new Block( std::unique_ptr<Block::LinearSolverType>(linearSolver) );
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<Block>(solver_ptr) );
g2o::SparseOptimizer optimizer;   
optimizer.setAlgorithm( solver );   
optimizer.setVerbose( true ); 

前面還是用普通指針來賦值,之后再轉換成unique_ptr.
運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM