关于 高翔“一起做RGBD-SLAM” 因 g2o版本更新出错的问题

主要参考了这篇博文:

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

在第六讲中,运行g2o的时候,报错信息如下:

/home/robot/rgbd_slam/src/slam.cpp: In function ‘int main(int, char**)’:
/home/robot/rgbd_slam/src/slam.cpp:75:70: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(SlamLinearSolver*&)’
     SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver );
                                                                      ^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
                 from /home/robot/rgbd_slam/src/slam.cpp:22:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<6, 3>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >]
 BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver
 ^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note:   no known conversion for argument 1 from ‘SlamLinearSolver* {aka g2o::LinearSolverEigen<Eigen::Matrix<double, 6, 6, 0> >*}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> > > >’
/home/robot/rgbd_slam/src/slam.cpp:76:104: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(SlamBlockSolver*&)’
 ithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver );
                                                                              ^
In file included from /home/robot/rgbd_slam/src/slam.cpp:29:0:
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: candidate: g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::Solver>)
       explicit OptimizationAlgorithmLevenberg(std::unique_ptr<Solver> solver);
                ^

根据报错位置,找到slam.cpp程序中发现是g2o的初始化求解器有问题,在根据报错信息下面提示的位置:

In file included from /usr/local/include/g2o/core/block_solver.h:199:0,

找到这个文件并定位到199行,发现是一个#include "block_solver.hpp"的头文件,进入这个头文件中,可以发现求解器的构造函数是这样写的

//我用的g2o版本中  求解器的构造函数
BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)
    :   BlockSolverBase(),
        _linearSolver(std::move(linearSolver))
{
  // workspace
  _xSize=0;
  _numPoses=0;
  _numLandmarks=0;
  _sizePoses=0;
  _sizeLandmarks=0;
  _doSchur=true;
}

而根据高翔书中程序中发现,他用的g2o版本中,求解器的构造函数跟我的这个g2o版本中的是不一样的

//高翔所用g2o版本
BlockSolver<Traits>::BlockSolver(LinearSolverType* linearSolver) :
  BlockSolverBase(),
  _linearSolver(linearSolver)

所以就可以发现问题所在,BlockSolver构造时需要的是std::unique_ptr类型的linearSolver参数。因此修改slam.cpp中的程序如下:

    //SlamLinearSolver* linearSolver = new SlamLinearSolver();
    std::unique_ptr<SlamLinearSolver> linearSolver ( new SlamLinearSolver());
    linearSolver->setBlockOrdering( false );
    //SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver );
    std::unique_ptr<SlamBlockSolver> blockSolver ( new SlamBlockSolver ( std::move(linearSolver)));
    g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( std::move(blockSolver) );

再次编译就OK啦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值