视觉SLAM十四讲——第九讲后端1

1.运行报错

1.1.工程编译报错

视觉SLAM十四讲ch9代码关于fmt的报错
这个博客中和我遇到的错误一模一样,主要两个错误:
1.struct HessianTupleType<std::index_sequence<Ints...>> { error: 'index_sequence' is not a member of 'std'
这个博客中也说了主要是最新版的g2o使用的是C++14的编译标准,而高博原来的程序中写的是C++11编译,所以需要把CMakeLists.txt文件中改为C++14编译。但是修改之后还报错:
2.undefined reference to 'fmt::v8::datail::basic_data<void>::left_padding_shifts'
这个是因为g2o库更新,需要使用fmt库,因此需要安装fmt库。所以在CmakeList.txt中添加如下内容:

find_package(fmt REQUIRED)
set(FMT_LIBRARIES fmt::fmt)
target_link_libraries(bundle_adjustment_g2o ${G2O_LIBS} ${FMT_LIBRARIES} bal_common))

1.2.ceres到达迭代次数优化不收敛

ceres的默认迭代次数是50次,使用这个默认的迭代次数运行最后不收敛,原因是达到迭代次数。此时把迭代次数修改提高一下:

   ceres::Solver::Options options;
   options.max_num_iterations = 100;

比如这里提高为100次,再次运行优化就收敛了,并且从结果看这个时候迭代了61次,实际上只比50多了十多次。

2.ceres进行BA优化

参考博客:

非线性优化-ceres-solver- Bundle Adjustment

2.1.SnavelyReprojection.h

首先这个文件的命名中Sanvely是一个人的名字,这个数据集使用的是Noah Snavely’s Bundler assumes,即Noah Snavely假设的相机模型,其中相机坐标系具有负的Z轴,也就是高博书中说的相机投影平面在光心之后,所以按照书中的投影模型最后得到的Z轴数值还要×-1。

上面的博客中写的解释:

给定一组测量的图像特征位置和对应关系,束调整的目标是找到最小化重投影误差的 3D 点位置和相机参数。这个优化问题通常被表述为非线性最小二乘问题,其中误差是观察到的特征位置与相机图像平面上相应3D点的投影之间差异的平方L2L2范数。 Ceres 为解决束调整问题提供了广泛的支持。

像往常一样,第一步是定义一个计算重投影误差/残差的模板化函子。函子的结构类似ExponentialResidual(即指数残差),因为每个图像观察都有一个该对象的实例。

BAL 问题中的每个残差取决于一个三维点和一个九参数相机。定义相机的九个参数是:三个用于作为 Rodriques轴角矢量的旋转,三个用于平移,一个用于焦距,两个用于径向畸变。该相机型号的详细信息可以在 Bundler 主页和 BAL 主页上找到。

3.g2o进行BA优化

上一篇:ceres solver 使用


下一篇:16.Ceres官方教程-Modeling Non-linear Least Squares (4) 损失函数