首页 > 其他分享 >【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述

【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述

时间:2023-01-30 14:58:21浏览次数:40  
标签:知识点 Mono toRotationMatrix 少话 Identity result delta dt block

前言

Vins-Mono预积分相关的公式和代码可以在各个博客中找到。本文将充当一个帮助大家快速理解预积分、中值积分相关概述的角色,带大家理解代码,应对面试。

下面会分成三步,来帮助大家充分理解这个过程。步骤是按照顺序来写的。

中值积分和预积分

imu每进来一帧都会进行一步中值积分和预积分。

void push_back(double dt, const Eigen::Vector3d &acc, const Eigen::Vector3d &gyr)
{
    dt_buf.push_back(dt);
    acc_buf.push_back(acc);
    gyr_buf.push_back(gyr);
    propagate(dt, acc, gyr);
}

每进来一帧imu都会push_back一下,push_back内部调用了积分函数propagate
积分函数propagate中调用了midPointIntegration中值积分函数

midPointIntegration(_dt, acc_0, gyr_0, _acc_1, _gyr_1, delta_p, delta_q, delta_v,
                    linearized_ba, linearized_bg,
                    result_delta_p, result_delta_q, result_delta_v,
                    result_linearized_ba, result_linearized_bg, 1);

另外还有一个repropagate函数,作用:一个是初始化之后调用,重新积分。另一个是如果零偏更新幅度较大,则调用重新进行积分。这里不做过多讨论。

也就是传入了delta_t可以计算a、w的中值积分,将a、w的中值和之前的进行合并,就是预积分。

协方差和雅可比

在midPointIntegration函数中会对jacobian和convariance进行更新。

F.block<3, 3>(0, 0) = Matrix3d::Identity();
F.block<3, 3>(0, 3) = -0.25 * delta_q.toRotationMatrix() * R_a_0_x * _dt * _dt + 
                     -0.25 * result_delta_q.toRotationMatrix() * R_a_1_x * (Matrix3d::Identity() - R_w_x * _dt) * _dt * _dt;
F.block<3, 3>(0, 6) = MatrixXd::Identity(3,3) * _dt;
F.block<3, 3>(0, 9) = -0.25 * (delta_q.toRotationMatrix() + result_delta_q.toRotationMatrix()) * _dt * _dt;
F.block<3, 3>(0, 12) = -0.25 * result_delta_q.toRotationMatrix() * R_a_1_x * _dt * _dt * -_dt;
F.block<3, 3>(3, 3) = Matrix3d::Identity() - R_w_x * _dt;
F.block<3, 3>(3, 12) = -1.0 * MatrixXd::Identity(3,3) * _dt;
F.block<3, 3>(6, 3) = -0.5 * delta_q.toRotationMatrix() * R_a_0_x * _dt + 
                     -0.5 * result_delta_q.toRotationMatrix() * R_a_1_x * (Matrix3d::Identity() - R_w_x * _dt) * _dt;
F.block<3, 3>(6, 6) = Matrix3d::Identity();
F.block<3, 3>(6, 9) = -0.5 * (delta_q.toRotationMatrix() + result_delta_q.toRotationMatrix()) * _dt;
F.block<3, 3>(6, 12) = -0.5 * result_delta_q.toRotationMatrix() * R_a_1_x * _dt * -_dt;
F.block<3, 3>(9, 9) = Matrix3d::Identity();
F.block<3, 3>(12, 12) = Matrix3d::Identity();
//cout<<"A"<<endl<<A<<endl;

MatrixXd V = MatrixXd::Zero(15,18);
V.block<3, 3>(0, 0) =  0.25 * delta_q.toRotationMatrix() * _dt * _dt;
V.block<3, 3>(0, 3) =  0.25 * -result_delta_q.toRotationMatrix() * R_a_1_x  * _dt * _dt * 0.5 * _dt;
V.block<3, 3>(0, 6) =  0.25 * result_delta_q.toRotationMatrix() * _dt * _dt;
V.block<3, 3>(0, 9) =  V.block<3, 3>(0, 3);
V.block<3, 3>(3, 3) =  0.5 * MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(3, 9) =  0.5 * MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(6, 0) =  0.5 * delta_q.toRotationMatrix() * _dt;
V.block<3, 3>(6, 3) =  0.5 * -result_delta_q.toRotationMatrix() * R_a_1_x  * _dt * 0.5 * _dt;
V.block<3, 3>(6, 6) =  0.5 * result_delta_q.toRotationMatrix() * _dt;
V.block<3, 3>(6, 9) =  V.block<3, 3>(6, 3);
V.block<3, 3>(9, 12) = MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(12, 15) = MatrixXd::Identity(3,3) * _dt;

//step_jacobian = F;
//step_V = V;
jacobian = F * jacobian;
covariance = F * covariance * F.transpose() + V * noise * V.transpose();

其中convariance的作用:
在这里插入图片描述
在这里插入图片描述

Jacobin的作用是在求残差之前使用这个jacobin对预积分值进行更新,更新后再求残差。

IMU残差

公式和细节代码在其他博客中都有介绍,这里只简要说明。

vins-mono中使用的是ceres::SizedCostFunction这个功能(是用ceres求残差的其中一种方法,不了解的话可以搜一搜):

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

自己的IMUFactor类继承ceres::SizedCostFunction这个类并重写其中的函数。
其中一个很重要的函数:Evaluate要被重写。
Evaluate中调用了:

residual = pre_integration->evaluate(Pi, Qi, Vi, Bai, Bgi,
                            Pj, Qj, Vj, Baj, Bgj);

对残差进行求解。

标签:知识点,Mono,toRotationMatrix,少话,Identity,result,delta,dt,block
From: https://www.cnblogs.com/linglingdog/p/17075899.html

相关文章

  • 大一C语言知识点
     形参,实参:   形参就是比如voiddfs(intx,intfa) x和fa就是形参实参就是:intmain(){ inta,b;a和b就是实参,全局变量也是}形参:调用函数时,形参会被......
  • mooc——django课 知识点总结
    1.为了支持http协议,云端需要部署web服务器2.如果一个目录中包含了__init__.py文件,那么这个目录就是一个第三方包(第三方库)3.  4.  5.MTV开发模式  6.rende......
  • 转 前端开发常用css知识点 认识字就能学。
    前端开发:CSS相关的核心知识点置顶三掌柜666已于2022-10-1101:20:38修改220收藏2文章标签:csshtml前端版权前言在前端开发过程中,有三驾马车组成:JS、CSS、HTML,JS负......
  • 数据库相关知识点提要
    关键词:DESC   LIMIT 上面的limit只有一个参数值,将表中的前三条数据查询出来     上面的SQL语句,limit有两个参数,第一个参数表示从第几行数据开始查......
  • 前端知识点学习第十八天(【js】/【js】)
    setTimeout、Promise和async/await的执行顺序JS的事件循环......
  • PLC笔记 知识点汇总 day1
          blog:师万物 本文是学习内容的简单回顾,希望对大家能有所帮助。 电路直流蓄电池交流单相(两线、三相)、两相、三相(三线、四线、五线)发电机:......
  • 低压电工笔记 知识点汇总 day1
          blog:师万物 本文是学习内容的简单回顾,希望对大家能有所帮助。 直流交流串联电路、并联电路直流电路交流电路单相交流电路单相交流电路:单......
  • 电子元件笔记 知识点汇总 day1
          blog:师万物 本文是学习内容的简单回顾,希望对大家能有所帮助。 电路串联分压、并联分流电阻、电容、电感电感:通直流、阻交流电容:通交流,阻......
  • 软件测试入门知识点
    Prerequisite全部内容转载自:AirtestProjectDocs因为写的实在是太好了!!!简单聊聊测试①首先根据测试方法来划分,可以分为:黑盒测试:最基础的功能测试,不关心内部的代码实......
  • ORB-SLAM2: an Open-Source SLAM system for Monocular,Stereo and RGB-D Camera
    摘要本文提出ORB-SLAM2一个完整的SLAM系统,用于单目,双目以及RGB-D相机,包括地图重用,回环检测以及重定位能力。本系统工作在实时的标准CPU,在更宽泛的环境中,来自于手持的室内场......