SLAM ---- VINS 外点剔除
1. 外点剔除
1.1 前端外点剔除
vins-mono 中根据光流跟踪,得到匹配点对;
vins-fusion 中可以设置反向光流,进一步剔除
然后使用F基础矩阵进行剔除外点:rejectWithF()
原理介绍:
1. 输入的图片是带畸变的(如Euroc 单目数据集,为针孔相机模型)
2. 则需要先通过将像素坐标系转到归一化坐标系下并去畸变(可以用 camodocal 模型 liftProjective 完成)
3. liftProjective 之后得到归一化坐标系下的 3D点,除以 z ,得到 [x,y,1]形式的归一化平面上的点,再通过参数转到归一化的像素坐标系下(可以认为是转到去了畸变的图像上),然后进行基础矩阵F的求解,其中会调用RANSAC 进行剔除外点。 (参数:这儿的参数就是 FOCAL_LENGTH,COL / 2.0,ROW / 2.0,归一化坐标值乘以焦距转到像素坐标系,由于图片中原点在图片左上角,于是还需要进行关于原点的平移)
4. 使用的是经典的8点法求解,与本质矩阵 E 求解一样
给人的错觉就是 本质矩阵求解,有点疑惑,后续再看看!!!
void FeatureTracker::rejectWithF()
{
if (forw_pts.size() >= 8)// 当前帧(追踪上)特征点数量足够多
{
ROS_DEBUG("FM ransac begins");
TicToc t_f;
// 1.遍历所有特征点,转化为归一化相机坐标系
vector<cv::Point2f> un_cur_pts(cur_pts.size()), un_forw_pts(forw_pts.size());
for (unsigned int i = 0; i < cur_pts.size(); i++)//遍历上一帧所有特征点
{
Eigen::Vector3d tmp_p;
//对于PINHOLE(针孔相机)可将像素坐标转换到归一化平面并去畸变。根据不同的相机模型将二维坐标转换到三维坐标
m_camera->liftProjective(Eigen::Vector2d(cur_pts[i].x, cur_pts[i].y), tmp_p);
//转换为归一化像素坐标,上一帧和当前帧
tmp_p.x() = FOCAL_LENGTH * tmp_p.x() / tmp_p.z() + COL / 2.0;
tmp_p.y() = FOCAL_LENGTH * tmp_p.y() / tmp_p.z() + ROW / 2.