問題:
首先貼出報錯部分代碼:
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.
運行結果: