ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-10 19:58:37  阅读:740  来源: 互联网

标签:ceres 迭代 fmt 相机 SLAM 报错 g2o 讲后 第九


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,迭代,fmt,相机,SLAM,报错,g2o,讲后,第九
来源: https://blog.csdn.net/qq_42731705/article/details/120690423

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有