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

在《视觉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) );

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

    原文作者:大二哈
    原文地址: https://www.jianshu.com/p/da2f4ad9e918
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞