g2o最终会把优化问题变换成一个Ax=b的线性方程组求解问题。
求解线性方程组有很多方法,也有很多实现库。g2o提供了几个选择:
- Dense:LinearSolverDense
- Eigen:LinearSolverEigen
- CSparse:LinearSolverCSparse
- Cholmod:LinearSolverCholmod
- PCG:LinearSolverPCG
具体指定用哪一个是在初始化优化器的时候确定的。
g2o::SparseOptimizer optimizer;
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(g2o::make_unique<g2o::BlockSolverX>(g2o::make_unique<g2o::LinearSolverEigen<g2o::BlockSolverX::PoseMatrixType>>()));
optimizer.setAlgorithm(solver);
这四种方法中,除Dense外都是稀疏求解,因为SLAM的优化问题一般都具有稀疏性,所以一般不用Dense方法。另外因为CSparse和Cholmod是特殊的三方库(有版权问题,而且很多平台支持不太好),所以正常情况下就用LinearSolverEigen就行了。
作者在LinearSolverEigen的头文件里面也说了,效果应该和CSparse相似