【视觉SLAM十四讲】g2o 实践代码报错解决方法

记录一次 g2o 实践代码报错,仅以第六讲为例,后面所有 g2o 初始化问题都可以按照这种方式解决。

运行环境

  • Windows 10
  • VMware Workstation Pro
  • Ubuntu 16.04 LTS

问题

首先贴出报错部分代码:

/home/wtl/桌面/SLAM/slambook-master/ch8/directMethod/direct_semidense.cpp: In function ‘bool poseEstimationDirect(const std::vector<Measurement>&, cv::Mat*, Eigen::Matrix3f&, Eigen::Isometry3d&):
/home/wtl/桌面/SLAM/slambook-master/ch8/directMethod/direct_semidense.cpp:266:62: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::LinearSolverType*&)’
     DirectBlock* solver_ptr = new DirectBlock ( linearSolver );
                                                              ^

分析

出错部分源代码

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 );//迭代算法
 
g2o::SparseOptimizer optimizer;   //图模型
optimizer.setAlgorithm( solver );   //设置求解器
optimizer.setVerbose( true ); // 打开调试输出

g2o 初始化时 Block 出错,以及迭代算法部分出错:

Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );//迭代器算法

调用函数出了问题。

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

解决方案

报错中建议的写法为:

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

把 linearSolver 和 solver_ptr 都改成了 std::unique_ptr<> 类型:

Block* solver_ptr = new Block( unique_ptr<Block::LinearSolverType>(linearSolver) );
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(unique_ptr<Block>(solver_ptr) );

运行成功!

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/107677481