在《视觉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) );
此时可以正常编译运行了。