g2o和Eigen冲突解决方法以及《SLAM十四讲》g2o实验报错

在写下这篇文章时,我已经安装好了SLAM需要的举并跑通了ORB-SLAM2。但是这样带来的坏处是,我在做书上的实验时,总有库的版本出现问题,或者其他奇奇怪怪的问题,很是麻烦,所以还是建议大家先跟着书上的实验一步步做下去,最后再跑大型框架。

1.g2o和Eigen版本冲突

在书中的第六章,安装g2o时,在编译中就碰到了版本冲突问题,在编译中疯狂报错,我贴上一部分错误代码,实际上错误代码都是比较重复性的内容,很容易就看出来是和Eigen相关的错误。

/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

各种诸如此类的问题从头跳到尾。由于我在跑ORB-SLAM2时已经安装了最新的Eigen3.3.10,之前安装Ceres时已经报错和Eigen3.3冲突了,所以我又安装了Eigen3.2。

①最好清除掉Eigen3.3版本,以免以后又出现奇奇怪怪的错误。

sudo updatedb  
locate eigen3

这两行语句定位了Eigen3的位置,进入对应文件夹手动删除即可。会显示很多很多文件,不要怕,其实仔细看他们都在一个文件夹里,删掉那个文件夹就可以了。

②然后登录eigen的官网http://eigen.tuxfamily.org/index.php?title=Main_Page,下载eigen3.2。

下载解压后,进入解压后的文件夹,使用如下命令编译安装:

mkdir build
cd build
cmake ..
make
sudo make install

这样就可以了,再次编译安装g2o,编译完成!奶思!

2.《SLAM十四讲g2o实验报错》

高高兴兴安装好g2o后,跑书上的实验竟然又报错了:

/home/christina/slambook/useg2o/main.cpp:77:49: error: no matching 

function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::LinearSolverType*&)’
 Block* solver_ptr = new Block( linearSolver );      
                                             ^
/home/christina/slambook/useg2o/main.cpp:77:49: note: candidate is:
In file included from     /usr/local/include/g2o/core/block_solver.h:199:0,
             from /home/wxy/slambook/useg2o/main.cpp:4:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<3, 1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 3, 3> >]
 BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

这是智能指针出现了问题,原代码中用到的是普通的指针,将初始化中用等号赋值的地方改成用std::unique_ptr赋值,将linearSolver和solver_ptr用移动语言也就是std::move来实现。具体请参照这个博客https://www.cnblogs.com/xueyuanaichiyu/p/7921382.html
修改如下代码:

// 构建图优化,先设定g2o
    typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block;  // 每个误差项优化变量维度为3,误差值维度为1
    std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>());
    // Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>(); // 线性方程求解器
    std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));
    //Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器
    // 梯度下降方法,从GN, LM, DogLeg 中选
    g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));
    // g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );
    // g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr );
    // g2o::OptimizationAlgorithmDogleg* solver = new g2o::OptimizationAlgorithmDogleg( solver_ptr );
    g2o::SparseOptimizer optimizer;     // 图模型
    optimizer.setAlgorithm( solver );   // 设置求解器
    optimizer.setVerbose( true );       // 打开调试输出

OK,再次编译运行,成功,nice!

最后,还想吐槽一下,我之前装什么都是装最新版本,不听前辈的劝告。现在学习SLAM碰到了好多版本问题,各种磕磕碰碰,以后还是老老实实用稳定的旧版本吧,新版本坑太多啦,对于小白比较难解决。不过好处就是新版本很多函数性能可定是优化的,而且自己动手解决这些困难,对学习也是很有帮助的。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值