VINS-Mono工程笔记(十):基于滑动窗口的紧耦合非线性优化(2)

1.边缘化理论

边缘化是指将滑窗中旧的状态删除掉,但却保留下旧的状态所带来的约束关系的一个过程,相当于将约束信息转换为优化变量的先验信息。
我们都知道优化问题主要就是求解下式,

所以参与边缘化迭代过程的残差方程为,

           

至此,我们就得到了雅可比Jα和残差eα。

2.代码分析

先看estimator.cpp文件中optimization()函数中的如下代码,

if (marginalization_flag == MARGIN_OLD)
{
            
    ......
}
else
{
            
    ......
}

以上代码分为边缘化最老帧和次新帧两种情况,当边缘化最老帧时

//定义存储边缘化相关信息的指针变量marginalization_info
MarginalizationInfo *marginalization_info = new MarginalizationInfo();
//参数的传递,逆深度的获取,从vectotr到double的转变
vector2double();
//如果上一次边缘化的相关信息指针last_marginalization_info不为空
if (last_marginalization_info)
{
            
    vector<int> drop_set;
    for (int i = 0; i < static_cast<int>(last_marginalization_parameter_blocks.size()); i++)
    {
            
         //在last_marginalization_parameter_blocks中标记para_Pose[0]和
         //para_SpeedBias[0]为边缘化参数
        if (last_marginalization_parameter_blocks[i] == para_Pose[0] ||
            last_marginalization_parameter_blocks[i] == para_SpeedBias[0])
            drop_set.push_back(i);
    }
    // 用上一次的边缘化相关信息定义marginalization_factor
    MarginalizationFactor *marginalization_factor = new MarginalizationFactor(last_marginalization_info);
    //用上一次的边缘化相关信息构造residual_block_info
    ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(marginalization_factor, NULL,
                                                                   last_marginalization_parameter_blocks,
                                                                   drop_set);
    //添加上一次的边缘化相关信息残差块信息
    marginalization_info->addResidualBlockInfo(residual_block_info);
}

这里主要是为以后得到H矩阵做一些前期铺垫工作,比如标记哪些参数块要保留,哪些要边缘化,给一些记录边缘化相关信息的变量赋值,如下所示的变量

marginalization_info

factors: 
是一个容器,vector<ResidualBlockInfo *>

parameter_block_size
parameter_block_size[参数块地址] =参数块的尺寸

parameter_block_idx
parameter_block_idx[参数块地址] = 海森矩阵中位置
按容器中存储顺序来说,前m个位置要边缘化掉,后n个保留下来。

接着往下阅读代码

if (pre_integrations[1]->sum_dt < 10.0)
{
            
    IMUFactor* imu_factor = new IMUFactor(pr