Kalman滤波器学习

概率图+时间=动态系统

​ 对概率图模型考虑其时间序列,可以得到动态系统。根据动态系统的隐状态的连续性和分布可以把系统大致分为三类:

  1. 若隐状态离散,不要求分布,则为隐马尔可夫模型
  2. 如果隐状态连续、线性且服从高斯分布,则为Kalman滤波器(线性高斯模型)
  3. 如果隐状态连续且非线性,作为得到粒子滤波器

本节主要来介绍kalman滤波器。

阅读更多...

概率图模型

概率图模型( probabilistic graphical model)是一类用图来表达变量相关关系的概率模型。它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的边表示变量间的概率相关关系,即“变量关系图”.根据边的性质不同,概率图模型可大致分为两类:第一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网( Bayesian network);第二类是使用无向图表示变量间的相关关系,称为无向图模型或马尔可夫网( Markovnetwork)

本节将用来介绍概率图模型。

阅读更多...

运动一致性判断

直至以来,SLAM的研究共朝着三个方向努力:精度、速度、鲁棒性。尤以鲁棒性居多。通常动态场景中,根据IMU测量值与视觉测量值分别进行计算得到的结果会有所不同。因此需要进行一致性的检测,以得到真值。本文将主要讲运动一致性检测。

阅读更多...

VINS-Fusion代码阅读

Loop Fusion

Loop Fusion结点包括:

VINS_estimator

VINS_estimator是VINS_Fusion的节点,其不包含回环检测部分,该节点可以单独对相机进行位姿估计。

rosNodeTest.cpp

rosNodeTest.cpp是vins_estimator节点的程序入口。主要实现以下函数。

主程序包含以下流程:

  1. 读取配置文件参数 readParameter()

  2. 订阅了四个话题,分别是imu、双目相机图像以及feature_tracker所提供的跟踪光流点,收到各个话题的消息后执行回调函数,对各个数据进行相应的处理

  3. 开启一个新线程sync_process。

    该线程的作用:若图像buffer里面有数据,读入数据并且添加到estimator中。利用图片携带的时间戳信息能够检测两图片是否同步,若两图片的时间戳差距在一定范围内,则添加到estimator中中,否则丢弃两帧图片。

estimator

VIO系统的整个程序从Estimator estimator开启。

estimator类的定义由estimator.h和estimator.cpp两个文件完成。

包含以下重要的自定义成员:

成员 功能
Feature_Tracker featureTracker
FeatureManager f_manager

estimator类中包含两类成员函数:

  1. 接口函数

    包括以下8个函数:

    函数 功能
    initFirstPose() 初始化初始位姿
    inputIMU() 输入IMU数据
    inputImage() 输入图片数据
    inputFeature() 输入特征
    ProcessIMU() 处理IMU数据,对IMU进行预积分;
    ProcessImage() 处理相机数据;
    1. 基于特征点的视差来判断当前帧是否属于关键帧;
    2. 判断相机到IMU的外参是否有校正,若无则用手眼标定法进行标定,具体在CalibrationExRotation里,此处只标定旋转矩阵,未标定平移矩阵,原因是系统对旋转矩阵较敏感,系统易因为小幅度的角度偏差而崩溃;
    3. 判断是否有进行初始化;若已完成初始化,则调用optimization( ),用ceres_solver对滑窗进行非线性优化的求解,优化项主要有四项:边缘化残差、 imu残差、相机重投影残差以及相机与Imu间同步时间差的残差项。否则进行相应的初始化过程。
    4. 本函数中包含一个failureDetection()函数,用于判断系统在一定条件下是否崩溃,比如非线性求解器中的解有大跳动,求解出相机IMU的外参矩阵或IMU偏移等等,系统挂掉就清空状态,重新初始化。
    ProcessMeasurements() 处理测量值;处理各buffer里的数据,当featureBuf不等于空时,开始进行以下处理(为什么是featureBuf,因为当有图像buffer数据的时候,才会有featuretracker.push(make_pair(t,featureFrame)),即有图像数据后,程序才发给跟踪器叫他产生feature,因此当featureBuf不等于空,所有的buffer,包括imu,图像,都不为空):
    changeSensrType 改变传感器类型,用于确定是否使用IMU,使用单目相机还是双目相机
  1. 内部函数

类的初始化函数Estimator(),由于Estimator类成员内部有两个比较重要的自定义类成员:
(1)Feature_Tracker featuretracker;(以前vins-mono这部分是作为一个独立的Node存在):
用来对原始图像进行畸变校正,特征点采集,光流跟踪
(2)FeatureManager f_manager;
用来对滑动窗口内所有特征点的管理。
简单设置了一些参数后,系统进入main()。

接着main()与Estimator estimator两者开始发生联系:
main()中estimator.setParameter()开启了滑动窗口估计的一个新线程
由于我们在配置文件中 多线程MULTIPLE_THREAD设置为1,因此当setParameter()时候,就开启了一个Estimator类内的新线程:processMeasurements();

pub VIO的各种话题,包括里程计信息,tf变换,相机姿态,点云信息,并且发布关键帧。

隐马尔可夫模型

隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态的序列,再由各个状态随机生成一个观测而产生观测的序列的过程。

隐马尔可夫模型是可用于标注问题的统计学习模型,描述有隐藏的马尔科夫链随机生成观测序列的过程,属于生成模型。本文将学习隐马尔可夫模型,着重介绍掌握HMM的模型、应用、及理论推导过程。

来源:李航的《统计学习方法》

阅读更多...
  • © 2019-2022 guoben
  • PV: UV:

微信