参考文献https://blog.youkuaiyun.com/pangzilu520/article/details/81087577
复现高博一起动手做RGB-d第六部分时,g2o部分代码
// 选择优化方法
typedef g2o::BlockSolver_6_3 SlamBlockSolver;
typedef g2o::LinearSolverCSparse<SlamBlockSolver::PoseMatrixType> SlamLinearSolver;
// 初始化求解器
SlamLinearSolver* linearSolver = new SlamLinearSolver();
linearSolver->setBlockOrdering( false );
//选择一个Blocksolver,6*3的参数
SlamBlockSolver* blockSolver = new SlamBlockSolver(linearSolver);
//选择一个迭代策略,LM下降
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver );
由于版本更新,构建bolck_solver的函数原型如下
g2o::BlockSolver< Traits >::BlockSolver ( SparseOptimizer * optimizer,
LinearSolverType * linearSolver
)
因此源代码中构建调解器的方法不可行,参考了第一行的文献,把这部分源代码改为
// 构造g2o中的图
// 先构造求解器
g2o::SparseOptimizer optimizer;
// 使用Cholmod中的线性方程求解器
//g2o::BlockSolver_6_3::LinearSolverType* linearSolver = new g2o::LinearSolverCholmod<g2o::BlockSolver_6_3::PoseMatrixType> ();
std::unique_ptr<g2o::BlockSolver_6_3::LinearSolverType> linearSolver = g2o::make_unique<g2o::LinearSolverCSparse<g2o::BlockSolver_6_3::PoseMatrixType>>();
// 6*3 的参数
std::unique_ptr <g2o::BlockSolver_6_3> block_solver ( new g2o::BlockSolver_6_3( std::move(linearSolver)) );
// L-M 下降
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( std::move(block_solver) );
就可以了,虽然还是没搞清楚,不过还是要pass,求生欲还是要有的