在g2o中,如果一个顶点受到多条边的约束,那么在进行优化时,这些边的影响会综合体现在目标函数(通常是残差平方和)及其雅可比矩阵上。具体优化步骤如下:
-
定义误差函数:每条边都有自己的误差函数,它描述了实际观测值与根据顶点状态预测出的观测值之间的差异。
-
线性化误差:在每次迭代过程中,每条边需要计算其误差相对于顶点状态变量的变化率,即求雅克比矩阵。这通常由
linearizeOplus()
函数实现。 -
构建系统方程:将所有连接到顶点的边对应的雅克比矩阵和相应的残差(误差向量)拼接起来,形成一个整体的线性系统。
对于每个顶点,它可能被多条边约束。每条边都会计算出一个误差向量和对应的雅可比矩阵(Jacobian matrix)。误差向量表示当前顶点状态下的预测值与实际观测值之间的差异;雅克比矩阵则描述了误差向量随着顶点状态变化的变化率。
假设我们有一个顶点
v
,有m
条边e1, e2, ..., em
与其相连。每条边都有其对应的误差向量r1, r2, ..., rm
和雅可比矩阵J1, J2, ..., Jm
,其中每个雅可比矩阵都是n x d
维的,n
是误差向量的维度,d
是顶点状态向量的维度。那么,在构建系统方程时,首先会将所有连接到顶点
v
的误差向量拼接起来形成一个全局的残差向量r
,即:VectorXd r = VectorXd::Zero(sum_of_residual_dimensions); r.segment(start_index_e1, dimension_of_r1) = r1; r.segment(start_index_e2, dimension_of_r2) = r2; ... r.segment(start_index_em, dimension_of_rm) = rm;
接下来,对相应的雅克比矩阵进行拼接,形成一个大的雅克比矩阵
H
(也称为Hessian矩阵的近似),结构如下:MatrixXd H = MatrixXd::Zero(sum_of_residual_dimensions, d); H.block(start_row_J1, 0, dimension_of_r1, d) = J1; H.block(start_row_J2, 0, dimension_of_r2, d) = J2; ... H.block(start_row_Jm, 0, dimension_of_rm, d) = Jm;
最终,通过求解线性系统H * delta_x = -r
来得到顶点v
的新状态更新量delta_x
,然后将这个更新量加到原始顶点状态上以获得新的估计值。这个过程会在每一轮迭代中重复进行,直到满足停止条件为止。 -
选择优化算法:使用适当的非线性优化算法,如高斯-牛顿法、Levenberg-Marquardt等。这些算法基于全局目标函数最小化的思想,通过求解线性系统来更新顶点的状态估计。
-
更新顶点:求解得到的更新向量被应用于顶点当前的状态估计上,每个顶点的新状态是原状态加上该更新向量的结果。
-
迭代过程:重复以上步骤直至满足终止条件,例如残差下降到足够小、达到最大迭代次数或者近似Hessian矩阵变得奇异等。
总结来说,在g2o框架下,顶点最终的更新是通过累积考虑所有相关边的信息,并结合高效的非线性优化方法,从而找到使整个图的能量(即目标函数)最小化的顶点状态估计值。