美文网首页
《视觉SLAM十四讲》第九讲前段实践中g2o实践代码报错解决方法

《视觉SLAM十四讲》第九讲前段实践中g2o实践代码报错解决方法

作者: 大二哈 | 来源:发表于2018-05-10 17:28 被阅读0次

    在《视觉SLAM十四讲》中针对于g2o初始化部分代码是无法执行的,在高博的Git上的代码也是无法编译的,会报错:

    error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’
    

    定位报错的代码段如下:

    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 );
    

    可以看出是两个指针的初始化不符合函数要求。
    其中提示应该的构造函数的调用方式为

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

    可以看出问题在于传递的参数指针不同,书中和git给出的都是普通的指针,而g2o库中要求的为std::unique_ptr指针。
    具体来说,unique指针是一种智能指针,其特点如下

    unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。
    

    于是修改代码实现,用unique指针来进行构造:

    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) );
    

    此时可以正常编译运行了。

    相关文章

      网友评论

          本文标题:《视觉SLAM十四讲》第九讲前段实践中g2o实践代码报错解决方法

          本文链接:https://www.haomeiwen.com/subject/srltdftx.html