vins-mono中imu预积分的残差是怎么计算的
时间: 2024-04-07 20:31:21 浏览: 177
在VINS-Mono中,IMU预积分的残差是通过将预积分值与IMU测量值之间的差异计算得到的。具体而言,IMU预积分的残差可以分为两个部分:一是加速度计残差,二是陀螺仪残差。加速度计残差是在加速度计的测量值和预积分值之间计算得到的,陀螺仪残差则是在陀螺仪的测量值和预积分值之间计算得到的。在计算残差时,还要考虑到IMU误差模型,包括噪声和漂移等因素。VINS-Mono中使用了扩展卡尔曼滤波器来估计IMU的误差模型,并将其用于IMU预积分的计算和残差计算中。
相关问题
VINS-mono中的marginlaizaition.cpp的滑窗部分的代码
VINS-Mono中的Marginalization.cpp文件中的滑窗代码如下所示:
```
for (int j = 0; j < _pre_integration_vec.size(); j++) {
if (_pre_integration_vec[j]->sum_dt > _repropagation_threshold) {
if (j == 0) {
continue;
}
delete _pre_integration_vec[j - 1];
_pre_integration_vec.erase(_pre_integration_vec.begin(),
_pre_integration_vec.begin() + j - 1);
j = 0;
}
}
if (_pre_integration_vec.size() > 2) {
// sort imu measurements
sort(_pre_integration_vec.begin(), _pre_integration_vec.end(),
[](const IntegrationBase *p1, const IntegrationBase *p2) {
return p1->sum_dt < p2->sum_dt;
});
// remove the oldest pre-integration
IntegrationBase *pre_integrations = _pre_integration_vec.front();
_pre_integration_vec.pop_front();
delete pre_integrations;
// create new marginalization factor
MarginalizationFactor *marginalization_factor =
new MarginalizationFactor(_pre_integration_vec.front(), i);
_marginalization_factors.push_back(marginalization_factor);
// update Jacobian and residual
for (int j = 0; j < _pre_integration_vec.size(); j++) {
if (j != 0) {
_pre_integration_vec[j]->repropagate(
_pre_integration_vec[j - 1]->delta_q,
_pre_integration_vec[j - 1]->delta_v,
_pre_integration_vec[j - 1]->delta_p);
}
_pre_integration_vec[j]->compute_jacobian();
marginalization_factor->add_information(
_pre_integration_vec[j]->jacobian,
_pre_integration_vec[j]->residual);
}
}
```
其中,变量`_pre_integration_vec`是一个存储IMU预积分量的vector,而`_marginalization_factors`存储的是边缘化因子。该代码实现了Marginalization Factor的滑窗策略,根据预积分时间的累积和来判断是否需要删除旧的预积分量,然后创建新的边缘化因子,并更新其Jacobian矩阵和残差。
阅读全文