简介
open_vins的前端主要有三种方式:(1)光流KLT,描述子和Aruco跟踪。在MSCKF中默认使用的是光流跟踪。open_vins的前端可以参考ov_core中的test_tracking文件。
1.Feature类
class Feature {
public:
/// 特征点的ID
size_t featid;
/// 是否从数据库中删除的标志位
bool to_delete;
/// 特征点在每一次被观测到时的像素坐标
std::unordered_map<size_t, std::vector<Eigen::VectorXf>> uvs;
/// 特征点在每一次被观测到时的去畸变像素坐标
std::unordered_map<size_t, std::vector<Eigen::VectorXf>> uvs_norm;
/// 特征点在每一次被观测到时的时间戳信息,后面MSCKF过程中计算特征点的生命周期只需要计算vector的size就可以。
std::unordered_map<size_t, std::vector<double>> timestamps;
/// 特征点坐标相对于哪一个局部坐标系,默认是第一帧
int anchor_cam_id = -1;
/// Timestamp of anchor clone
double anchor_clone_timestamp;
/// 在局部坐标系anchor frame 的三维坐标,三角化之后的
Eigen::Vector3d p_FinA;
/// 在全局坐标的三角化Pose
Eigen::Vector3d p_FinG;
};
2.光流KLT跟踪
/**
// 此函数为前端主体函数
// KLT跟踪分为以下步骤:
1.对图像直方图均衡化
2.构建图像金字塔
3.对当前图像补充新的特征点保障KLT有足够多的点
4.KLT光流追踪
5.更新database中的一些变量,对于一直跟踪的点,记录被观测到的局部坐标和当前帧时间戳,用于统计特征点的生命周期;新提取到的点则加入到数据库中
***/
void TrackKLT::feed_monocular(double timestamp, cv::Mat &img, size_t cam_id)
{
// 1. 直方图均衡化用来增强图像质量
cv::equalizeHist(img, img);
// 2. 构建3层图像金字塔
std::vector<cv::Mat> imgpyr;
cv::b