admin管理员组文章数量:1650771
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,就可以
本文标签: 代码详细MonoVinsfeaturemanager
版权声明:本文标题:VINS-Mono 代码详细解读——feature_manager.cpp 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729531027a1204806.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论