VINS-Mono 代码详细解读——feature_manager.cpp

本文详细解读VINS-Mono中的特征点管理,重点介绍FeatureManager、FeaturePerId和FeaturePerFrame三者的关系及主要函数,包括关键帧选取、视差检查和边缘化策略,旨在理解视觉惯性导航系统中的特征处理流程。
摘要由CSDN通过智能技术生成

LZ发现estimator.cpp中关键函数为processImage(),里面包含了IMU预积分、图像处理特征点跟踪等一系列流程,上一节中对processIMU()以及预积分的integrationBase类进行解读,本节继续做基础储备,对与estimator.cpp中的feature_manager.cpp进行详细介绍,主要是对特征点管理。特征点管理器主要就是FeatureManager类

目录

一、FeatureManager、FeaturePerId、FeaturePerFrame

1、三者关系

2、FeaturePerId,某feature_id下的所有FeaturePerFrame 

 3、FeaturePerFrame

 二、主要函数

1、endFrame()

2、getFeatureCount()

3、addFeatureCheckParallax()

1、关键帧选取:

2、代码 

4、compensatedParallax2()

 5、getCorresponding()

6、setDepth()

7、trangulate()

8、三个边缘化函数

removeBackShiftDepth()

removeBack()

removeFront()

 

涉及到的类的成员函数

函数名 功能
FeaturePerId::endFrame() 返回最后一个观测到这个特征点的图像帧ID
FeatureManager()::getFeatureCount() 窗口中被跟踪的特征点数量
FeatureManager()::addFeatureCheckParallax() 特征点进入时检查视差,是否为关键帧
FeatureManager()::getCorresponding() 前后两帧之间匹配特征点3D坐标
FeatureManager()::setDepth() 设置特征点逆深度
FeatureManager()::triangulate() 特征点三角化求深度(SVD分解)
FeatureManager()::removeOutlier() 移除外点
FeatureManager()::removeBackShiftDepth()  
FeatureManager()::removeBack() 边缘化最老帧,直接将特征点保存的帧号前移
FeatureManager()::removeFront() 边缘化次新帧,对特征点在次新帧的信息移除

一、FeatureManager、FeaturePerId、FeaturePerFrame

1、三者关系

 f_manager是特征管理器类的对象

FeatureManager f_manager;//特征管理器类

这里f_mangager.feature主要指的是一个list容器

feature_manager.h主要三个类:

FeatureManager管理所有特征点,通过list容器存储特征点属性

FeaturePerId指的是某feature_id下的所有FeaturePerFrame。常用feature_id和观测第一帧start_frame、最后一帧endFrame()

FeaturePerFrame指的是每帧基本的数据:特征点[x,y,z,u,v,vx,vy]和td IMU与cam同步时间差

在这里插入图片描述

2、FeaturePerId,某feature_id下的所有FeaturePerFrame 

feature_id 特征点ID、start_frame 出现该角点的第一帧的id--start_frame

class FeaturePerId
{
  public:
    const int feature_id;// 特征点ID索引
    int start_frame;// 首次被观测到时,该帧的索引
    vector<FeaturePerFrame> feature_per_frame; // 能够观测到某个特征点的所有相关帧

    int used_num;// 该特征出现的次数
    bool is_outlier;// 是否外点
    bool is_margin;// 是否Marg边缘化
    double estimated_depth; // 估计的逆深度
    int solve_flag; // 求解器 0 haven't solve yet; 1 solve succ; 2 solve fail;

    Vector3d gt_p; // ???

    FeaturePerId(int _feature_id, int _start_frame) 
        : feature_id(_feature_id), start_frame(_start_frame),
          used_num(0), estimated_depth(-1.0), solve_flag(0)
    {
    }

    int endFrame();// 返回最后一次观测到这个特征点的帧数ID
};

 3、FeaturePerFrame

 _point 每帧的特征点[x,y,z,u,v,vx,vy], td IMU和cam同步时间差

class FeaturePerFrame
{
  public:
    FeaturePerFrame(const Eigen::Matrix<double, 7, 1> &_point, double td)
    {
        point.x() = _point(0);
        point.y() = _point(1);
        point.z() = _point(2);
        uv.x() = _point(3);
        uv.y() = _point(4);
        velocity.x() = _point(5); 
        velocity.y() = _point(6); 
        cur_td = td;
    }
    double cur_td;
    Vector3d point;
    Vector2d uv;
    Vector2d velocity;

    double z; // 特征点的深度
    bool is_used;// 是否被用了
    double parallax;// 视差
    MatrixXd A; //变换矩阵
    VectorXd b;
    double dep_gradient; // ???
};

三者串联最好的例子是:从f_manager到it_per_id再到底层的it_per_frame,就可以

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值