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

特征点管理器主要就是FeatureManager类

目录

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

 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同步时间差

在这里插入图片描述

/**
* @class 2. FeaturePerId,某feature_id下的所有FeaturePerFrame
* @brief feature_id 特征点ID
* @brief start_frame 出现该角点的第一帧的id--start_frame
* detailed 
*/
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
};
/**
* @class 1. FeaturePerFrame
* @brief _point 每帧的特征点[x,y,z,u,v,vx,vy]
* @brief td IMU和cam同步时间差
* detailed 
*/
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,就可以得到基本数据point了

for (auto &it_per_id : f_manager.feature)
{
   ......
   for (auto &it_per_frame : it_per_id.feature_per_frame)
   {
     Vector3d pts_j = it_per_frame.point;// 3D特征点坐标
 }
}
发布了176 篇原创文章 · 获赞 84 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/104893694