vins中紧耦合优化模型(状态量状态方程观测方程)

问题:vins中误差方程包括哪些?
vins中整体误差方程包含视觉重投影误差、IMU测量误差和先验误差。
优化的factor有
imu_factor.h,projection_factor.h,marginalization_factor.h
问题:vin中优化的状态量是什么?

1.imu测量误差

在imu_factor.h中

class IMUFactor : public ceres::SizedCostFunction<15, 7, 9, 7, 9>

15, 7, 9, 7, 9分别代表15维残差,前一帧7维位姿,前一帧9维(线速度3维,加速度计的线加速度偏移为3维,陀螺仪的角加速度偏移为3维),当前帧7维位姿,当前帧9维(线速度3维,加速度计的线加速度偏移为3维,陀螺仪的角加速度偏移为3维)

1.1残差

残差为15维:残差分别为位移为3,旋转为3维,线速度为3维,加速度计的线加速度偏移为3维,陀螺仪的角加速度偏移为3维
残差赋值代码如下

residuals.block<3, 1>(O_P, 0) = Qi.inverse() * (0.5 * G * sum_dt * sum_dt + Pj - Pi - Vi * sum_dt) - corrected_delta_p;
residuals.block<3, 1>(O_R, 0) = 2 * (corrected_delta_q.inverse() * (Qi.inverse() * Qj)).vec();
residuals.block<3, 1>(O_V, 0) = Qi.inverse() * (G * sum_dt + Vj - Vi) - corrected_delta_v;
residuals.block<3, 1>(O_BA, 0) = Baj - Bai;
residuals.block<3, 1>(O_BG, 0) = Bgj - Bgi;

1.2状态量

优化的第一个状态量位姿为7维,平移3维,旋转的四元数为4维
优化的第二个状态量为9维度,线速度为3维,加速度计的线加速度偏移为3维,陀螺仪的角加速度偏移为3维
优化赋值代码如下

Eigen::Vector3d Pi(parameters[0][0], parameters[0][1], parameters[0][2]);
Eigen::Quaterniond Qi(parameters[0][6], parameters[0][3], parameters[0][4], parameters[0][5]);
Eigen::Vector3d Vi(parameters[1][0], parameters[1][1], parameters[1][2]);
Eigen::Vector3d Bai(parameters[1][3], parameters[1][4], parameters[1][5]);
Eigen::Vector3d Bgi(parameters[1][6], parameters[1][7], parameters[1][8]);

2.重投影误差

在projection_factor.h中

class ProjectionFactor : public ceres::SizedCostFunction<2, 7, 7, 7, 1>

2, 7, 7, 7, 1分别代表2维重投影残差,前一帧7维位姿,当前帧7维位姿,7维imu和camera坐标系的外参,最后1维为特征点的逆深度(inv_dep_i,具体还未弄清楚)

2.1残差

残差为2维:为重投影像素误差
(与传统的针孔相机模型定义的重投影误差不同,论文中使用的是单位半球体的相机观测残差,是一个宽视野鱼眼或者全方位相机。)

1.2状态量

优化的状态量为:
前一帧7维位姿,当前帧7维位姿,7维imu和camera坐标系的外参,最后1维为特征点的逆深度(inv_dep_i,具体还未弄清楚)

3.先验误差

在marginalization_factor.h中

class MarginalizationFactor : public ceres::CostFunction

优化的状态量是变化的,根据不同的状态来选择优化不同的状态量。
VINS-MONO中,为了处理一些悬停的case, 引入了一个two-way marginalization, 简单来说就是:
-如果倒数第二帧是关键帧, 则将最旧的pose移出sliding window, 也就是MARGIN_OLD,

  • 如果倒数第二帧不是关键帧, 则将倒数第二帧pose移出sliding window, 也就是MARGIN_NEW.
    选取关键帧的策略是视差足够大。
    如在MARGIN_OLD状态时优化的可以为7维或7维
 for (int i = 0; i < static_cast<int>(last_marginalization_parameter_blocks.size()); i++)
 {
      if (last_marginalization_parameter_blocks[i] == para_Pose[0] ||
          last_marginalization_parameter_blocks[i] == para_SpeedBias[0])
          drop_set.push_back(i);
  }
// construct new marginlization_factor
MarginalizationFactor *marginalization_factor = new MarginalizationFactor(last_marginalization_info);
ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(marginalization_factor, NULL, last_marginalization_parameter_blocks,drop_set);

MARGIN_OLD状态时优化也可以为7维加9维

ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(imu_factor, NULL,
                                                                           vector<double *>{para_Pose[0], para_SpeedBias[0], para_Pose[1], para_SpeedBias[1]},
                                                                           vector<int>{0, 1});

参考文献:
https://blog.csdn.net/wangshuailpp/article/details/78461171
https://blog.csdn.net/q597967420/article/details/76099443

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值