记录一次 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) );
运行成功!