2021@SDUSC
2021年11月29日星期一——2021年12月2日星期四
附:12月1日typora更新了,新版本要收费,我回退到旧的0.9.8版本之后,发现旧的版本有个致命的bug,会丢失对代码的注释…本来已经读完了代码的,结果下午打开一看注释全没了。
幸好时间不算长,还能挽救。
一、背景简介:
这篇博客分为三部分,第一部分是对于上次的代码分析的补全,结束initial_sfm中最后一部分的问题。
第二部分是对于数学知识的补充,类似于上上一次对于代码的分析一样,这一次是对于数学部分的原理加深理解。
最后就是对于initial文件夹的小结,借助于这部分的内容结束,开启下一步的计划。
二、代码分析:
说明:
-
ceres 同OpenCV、Eigen一样,也是一款第三方的库函数,他的作用是用来处理非线性优化。
该库由Google开发,在Google的SLAM项目cartographer中被大量使用。
官网中给出了详细说明。
-
full BA 是
在SFM(structure from motion)的计算中BA(Bundle Adjustment)作为最后一步优化具有很重要的作用,在近几年兴起的基于图的SLAM(simultaneous localization and mapping)算法里面使用了图优化替代了原来的滤波器,这里所谓的图优化其实也是指BA。
-
为了学习BA,需要有以下知识储备:
- 射影相机集合模型
- 对极几何
- 凸优化
- 矩阵理论
除了凸优化似乎都稍微学过了…
-
凸优化:这个概念实际上机器学习中经常提到的,不过没有指出来这个名词而已。
总的来说,凸优化是最优化问题中重要的组成部分之一。
凸优化是来解决全局最小值的,他对于问题加以限制,对于目标函数限定为凸函数;对于优化变量的可行域限定为凸集。
这样就能够使得的局部最优解一定是全局最优解。
凸函数的概念好说,凸集的概念我还是第一次见到:
在凸几何中,凸集(convex set)是在凸组合下闭合的仿射空间的子集。更具体地说,在欧氏空间中,凸集是对于集合内的每一对点,连接该对点的直线段上的每个点也在该集合内。例如,立方体是凸集,但是任何中空的或具有凹痕的例如月牙形都不是凸集。 [1]
特别的,凸集,实数R上(或复数C上)的向量空间中,如果集合S中任两点的连线上的点都在S内,则称集合S为凸集。
其中,对于凸函数而言,也有一定的扩展。
对于多元函数,如果它是凸函数,则其Hessian矩阵为半正定矩阵。如果Hessian矩阵是正定的,则函数是严格凸函数。
//full BA
//首先是参数的初始化,调用了ceres中的方法
ceres::Problem problem;
ceres::LocalParameterization* local_parameterization
= new ceres::QuaternionParameterization();
//cout << " begin full BA " << endl;
//向矩阵当中填入对应的数值,包括位置信息、旋转信息
for (int i = 0; i < frame_num; i++)
{
//double array for ceres
c_translation[i][0] = c_Translation[i].x();
c_translation[i][1] = c_Translation[i].y();
c_translation[i][2] = c_Translation[i].z();
c_rotation[i][0] = c_Quat[i].w();
c_rotation[i][1