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