非线性最小二乘问题

以高斯牛顿法为例:

目标
使总残差最小 ,一般为多个代价函数平方之和 :½ ∑ || e(x)||²

e (x):代价函数=误差项=残差
x为待优化参数

求解增量过程
1、关于待优化参数x对e一阶泰勒展开
2、带入½∑ ||e(x)||
3、对增量△x求导
4、得到增量方程
∑(JT *J)△x=∑(-JTe ) ,近似写成H△x=b
5、求解增量

关键
具体求解增量过程在使用库求解时并无体现,可直接找 雅克比矩阵J、误差项e

实践:

使用Ceres时
1、定义误差项的计算模型
2、构建问题,使用for循环将所有的误差项添加进去(指定带优化参数、带入已知数据)
3、雅克比矩阵自动求
4、自动求得优化结果

使用g2o时
1、定义待优化参数(顶点)
2、定义误差项(边)
3、定义边中包含定义雅克比矩阵
4、添加待优化参数(顶点)
5、使用for循环添加所有的误差项(边)
6、得到优化结果

到底什么是非线性最小二乘问题

其实就是让多个残差项平方和最小

例子:

曲线拟合(找abc):
残差 = 观测值(y) - 预测值 exp(ax²+bx+c)
找到最优的abc让每个点(xi,yi)的残差平方之和最小,从而得出拟合的曲线

前端估计两帧图像间相机的位姿变化T:
残差 = 观测值(ui) - 预测值 (1/s KTPi)
找到最优的相机位姿变化T让每个3d2d点对(ui、Pi)的残差平方之和最小(重投影误差之和最小)

后端优化所有相机姿态和路标点:
让所有的观测数据(zii )和 由路标点和相机姿态计算出来的像素坐标h(Ti,pi)的差的平方和最小,
从而找到所有的相机姿态Ti和路标pi的最优值

非线性最小二乘问题
eii= zii - h(Ti,pi)
调整T1让e11最小但e12可能变大,调整p2让e12最小但e22可能变大,让∑eii的平方和最小,即可找到每个Ti,pi的最优值(能得到观测数据zii的最合理值)

前端和后端应该区别对待

前端通过很多组3d2d点估计出一帧相机的位姿变化,

后端把大量路标pi和相机位姿Ti放进去,通过像素坐标(2d点)以及Ti,pi之间的关系,批量优化T,p