欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 23:48:28
...

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

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