前言:这里先说报错内容,后面解决警告问题,最后说一下编译命令问题。
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.警告是由于代码中的虚函数 read
和 write
没有返回值,但是它们被声明为返回 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成功编译运行(记得将图片和深度图添加进去)