關於 高翔“一起做RGBD-SLAM” 因 g2o版本更新出錯的問題
阿新 • • 發佈:2019-01-01
主要參考了這篇博文:
https://blog.csdn.net/robinhjwy/article/details/78084210
在第六講中,執行g2o的時候,報錯資訊如下:
/home/robot/rgbd_slam/src/slam.cpp: In function ‘int main(int, char**)’: /home/robot/rgbd_slam/src/slam.cpp:75:70: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(SlamLinearSolver*&)’ SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver ); ^ In file included from /usr/local/include/g2o/core/block_solver.h:199:0, from /home/robot/rgbd_slam/src/slam.cpp:22: /usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<6, 3>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >] BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver ^ /usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘SlamLinearSolver* {aka g2o::LinearSolverEigen<Eigen::Matrix<double, 6, 6, 0> >*}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> > > >’ /home/robot/rgbd_slam/src/slam.cpp:76:104: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(SlamBlockSolver*&)’ ithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver ); ^ In file included from /home/robot/rgbd_slam/src/slam.cpp:29:0: /usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: candidate: g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::Solver>) explicit OptimizationAlgorithmLevenberg(std::unique_ptr<Solver> solver); ^
根據報錯位置,找到slam.cpp程式中發現是g2o的初始化求解器有問題,在根據報錯資訊下面提示的位置:
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
找到這個檔案並定位到199行,發現是一個#include "block_solver.hpp"的標頭檔案,進入這個標頭檔案中,可以發現求解器的建構函式是這樣寫的
//我用的g2o版本中 求解器的建構函式 BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver) : BlockSolverBase(), _linearSolver(std::move(linearSolver)) { // workspace _xSize=0; _numPoses=0; _numLandmarks=0; _sizePoses=0; _sizeLandmarks=0; _doSchur=true; }
而根據高翔書中程式中發現,他用的g2o版本中,求解器的建構函式跟我的這個g2o版本中的是不一樣的
//高翔所用g2o版本
BlockSolver<Traits>::BlockSolver(LinearSolverType* linearSolver) :
BlockSolverBase(),
_linearSolver(linearSolver)
所以就可以發現問題所在,BlockSolver構造時需要的是std::unique_ptr型別的linearSolver引數。因此修改slam.cpp中的程式如下:
//SlamLinearSolver* linearSolver = new SlamLinearSolver(); std::unique_ptr<SlamLinearSolver> linearSolver ( new SlamLinearSolver()); linearSolver->setBlockOrdering( false ); //SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver ); std::unique_ptr<SlamBlockSolver> blockSolver ( new SlamBlockSolver ( std::move(linearSolver))); g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( std::move(blockSolver) );
再次編譯就OK啦