About g2o--安装与使用

1.安装:

sudo apt-get install libqt4-dev qt4-qmake libqglviewer-dev libsuitesparse-dev libcxsparse3.1.2 libcholmod-dev
//注:最后一个依赖项需要table键来填充名称
g2o是一个基于图优化的库,图优化是一种将非线性理论与图论结合起来的理论,在图优化中将顶点表示优化变量,边表示误差项,从而将非线性最小二乘问题转化成构建一直对应的一个图。

安装完依赖项之后,按照CMake的方式对g2o进行编译安装。安装完成后,g2o库的头文件将在"/usr/local/g2o/"目录下,库文件在"/usr/local/lib/"目录下。在CMakeList.txt中添加头文件和库文件路径的命令,如下。

参考:https://www.cnblogs.com/ChrisCoder/p/7222430.html#_label4


2.形如编译时遇到下述问题,在使用g2o时程序语句书写问题:

error: no matching function for call to‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3>>::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3>>::LinearSolverType*&)’

注意:使用下列更改后的语句时注意检查所描述的变量和方法是否和原先想要描述的相同.

问题原因:

//BlockSolver构造时需要的是std::unique_ptr类型的linearSolver参数,把linearSolver和solver_ptr都改成了std::unique_ptr<>类型,并且初始化时不再用等号,
//原代码中存在将unique_ptr作为参数传递给类的构造函数中的用法,然后那篇博客中有个move指令,猜测是不是直接传递不行,要用move才对,在传递linearSolver和solver_ptr时,加上了std::move()

解决方法:

// 初始化g2o,常用套路
//第一步:typedef块求解器的维度
typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3


//第二步:用线性求解器构造块求解器(注意块的命名,和求解方法的命名)

Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器

std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());


//第三步:用矩阵块求解器构造下降策略

 Block* solver_ptr = new Block ( std::unique_ptr<Block::LinearSolverType>(linearSolver) );

或Block* solver_ptr = new DirectBlock ( linearSolver );


std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));  


//第四步:将下降策略设定为optimizer的setAlgorithm()

g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr ); // L-M方法
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));


//第五步:图模型

g2o::SparseOptimizer optimizer;

//第六步:设置求解器
optimizer.setAlgorithm ( solver );

参考:

https://blog.csdn.net/robinhjwy/article/details/78084210

https://blog.csdn.net/robinhjwy/article/details/78092597

3.通过g2o_viewei运行.g2o文件,提示"段错误 (核心已转储)"

#运行
g2o_viewer XXX.g2o

参考:https://blog.csdn.net/n66040927/article/details/79316185

猜你喜欢

转载自blog.csdn.net/qq_40313712/article/details/80756098