《一起学习rgbdSLAM》中g2o部分报错的问题

《一起学习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>

编译之后完美通过:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014709760/article/details/85321587
g2o