《视觉SLAM十四讲》ch7运行pose_estimation_3d2d.cpp报错

前言:这里先说报错内容,后面解决警告问题,最后说一下编译命令问题。

1.报错如下

具体来说,它指出了以下几个问题:

a.在VertexPose类的read函数中,没有返回语句。同样,在write函数中也存在相同的问题。

b.在EdgeProjection类的read函数中,没有返回语句。同样,在write函数中也存在相同的问题。

c.在make_unique函数调用中,参数类型不匹配,导致无法找到匹配的构造函数。

原本出错部分代码:

 // 构建图优化,先设定g2o
  typedef g2o::BlockSolver<g2o::BlockSolverTraits<6, 3>> BlockSolverType;  // pose is 6, landmark is 3
  typedef g2o::LinearSolverDense<BlockSolverType::PoseMatrixType> LinearSolverType; // 线性求解器类型
  // 梯度下降方法,可以从GN, LM, DogLeg 中选
  auto solver = new g2o::OptimizationAlgorithmGaussNewton(
    std::make_unique<BlockSolverType>(std::make_unique<LinearSolverType>));
  g2o::SparseOptimizer optimizer;     // 图模型
  optimizer.setAlgorithm(solver);   // 设置求解器
  optimizer.setVerbose(true);       // 打开调试输出

修改之后

// 构建图优化,先设定g2o
typedef g2o::BlockSolver<g2o::BlockSolverTraits<6, 3>> BlockSolverType;  // pose is 6, landmark is 3
typedef g2o::LinearSolverDense<BlockSolverType::PoseMatrixType> LinearSolverType; // 线性求解器类型
// 使用正确的类型构造线性求解器
std::unique_ptr<LinearSolverType> linearSolver(new LinearSolverType);
// 梯度下降方法,可以从GN, LM, DogLeg 中选
auto solver = new g2o::OptimizationAlgorithmGaussNewton(
  std::make_unique<BlockSolverType>(std::move(linearSolver)));
g2o::SparseOptimizer optimizer;     // 图模型
optimizer.setAlgorithm(solver);   // 设置求解器
optimizer.setVerbose(true);       // 打开调试输出

如此就解决了报错问题。

2.警告是由于代码中的虚函数 readwrite 没有返回值,但是它们被声明为返回 bool 类型。所以添加return true;即可,修改如下:

virtual bool read(istream &in) override {
    return true;
  }

  virtual bool write(ostream &out) const override {
    return true;
  }

另外两处报错同理。

3.如此代码就没有问题了,但是编译时默认链接到g2o库文件即-lg2o,会发现找不到,其实我们在下载高博的压缩包时,库文件被按照不同功能分开了并起了不同的名字(个人理解,如有误还请兄弟们指正),所以我们找不到libg2o.so,因此在编译命令中需要把使用到函数所存在的库文件一个一个链接上去,最终成功编译的命令如下:

g++ -o pose_estimation_3d2d pose_estimation_3d2d.cpp -std=c++17 -lg2o_core -lg2o_stuff -lopencv_core -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -L/usr/local/lib

ok成功编译运行(记得将图片和深度图添加进去)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值