《一起學習rgbdSLAM》中g2o部分報錯的問題
阿新 • • 發佈:2018-12-28
《一起學習rgbdSLAM》中g2o部分報錯的問題
在高博的《一起學習rgbdSLAM》第六講中使用到了g2o工具。但是由於版本問題,按照高博的寫法來編寫程式碼在編譯過程中會報錯。所以需要對該部分程式碼稍作修改。
我使用的系統是ubuntu16.04。
教程中的原始碼
// 選擇優化方法 typedef g2o::BlockSolver_6_3 SlamBlockSolver; typedef g2o::LinearSolverEigen< SlamBlockSolver::PoseMatrixType > SlamLinearSolver; // 初始化求解器 SlamLinearSolver* linearSolver = new SlamLinearSolver(); linearSolver->setBlockOrdering( false ); SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver ); g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver ); g2o::SparseOptimizer globalOptimizer; // 最後用的就是這個東東 globalOptimizer.setAlgorithm( solver );
編譯結果
/home/andy_zhang/my_workspace/Slam/my_slam/RGB_D_SLAM/src/slamend.cpp:82: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/andy_zhang/my_workspace/Slam/my_slam/RGB_D_SLAM/src/slamend.cpp:18: /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/andy_zhang/my_workspace/Slam/my_slam/RGB_D_SLAM/src/slamend.cpp:83:104: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(SlamBlockSolver*&)’ ithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver ); ....
參考其他博主的建議進行了修改但是仍然沒有成功。
https://blog.csdn.net/robinhjwy/article/details/78084210
https://blog.csdn.net/pangzilu520/article/details/81087577
https://blog.csdn.net/robinhjwy/article/details/78084210
束手無策之時突然想起可以參考g2o文件中的示例程式進行修改,沒想到還真成功了!
根據~/g2o-master/g2o/examples/simple_optimize/檔案下的示例程式將程式碼修改為一下形式:
auto linearSolver = g2o::make_unique<LinearSolverCSparse<BlockSolverX::PoseMatrixType>>(); linearSolver->setBlockOrdering(false); auto blockSolver = g2o::make_unique<BlockSolverX>(std::move(linearSolver)); g2o::OptimizationAlgorithmLevenberg* algorithm = new g2o::OptimizationAlgorithmLevenberg(std::move(blockSolver)); g2o::SparseOptimizer globalOptimizer; globalOptimizer.setAlgorithm( algorithm );
不要忘記新增相應的標頭檔案:
#include <g2o/types/slam3d/types_slam3d.h>
#include <g2o/core/sparse_optimizer.h>
#include <g2o/core/block_solver.h>
#include <g2o/core/factory.h>
#include <g2o/core/optimization_algorithm_factory.h>
#include <g2o/core/optimization_algorithm_gauss_newton.h>
#include <g2o/core/robust_kernel.h>
#include <g2o/core/robust_kernel_factory.h>
#include <g2o/core/optimization_algorithm_levenberg.h>
#include <g2o/solvers/eigen/linear_solver_eigen.h>
#include <g2o/solvers/csparse/linear_solver_csparse.h>
編譯之後完美通過: