AI
人工智能
代码解读 | VINS 视觉前端
本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接:代码解读 | VINS 视觉前端
vins前端概述
在搞清楚VINS前端之前,首先要搞清楚什么是SLAM前端?
SLAM的前端、后端系统本身没有特别明确的划分,但是在实际研究中根据处理的先后顺序一般认为特征点提取和跟踪为前端部分,然后利用前端获取的数据进行优化、回环检测等操作,从而将优化、回环检测等作为后端。
而在VINS_MONO中将视觉跟踪模块(feature_trackers)为其前端。在视觉跟踪模块中,首先,对于每一幅新图像,KLT稀疏光流算法对现有特征进行跟踪。然后,检测新的角点特征以保证每个图像特征的最小数目,并设置两个相邻特征之间像素的最小间隔来执行均匀的特征分布。接着,将二维特征点去畸变,然后在通过外点剔除后投影到一个单位球面上。最后,利用基本矩阵模型的RANSAC算法进行外点剔除。
VINS_MONO原文中还将关键帧的选取作为前端分,本文暂不讨论, 后续文章会详细介绍。
VINS-Mono将前端封装为一个ROS节点,该节点的实现在feature_tracker目录下的src中,src里共有3个头文件和3个源文件:
feature_tracker_node.cpp构造了一个ROS节点feature_tracker_node,该节点订阅相机图像话题数据后,提取特征点,然后用KLT光流进行特征点跟踪。feature_tracker节点将跟踪的特征点作为话题进行发布,供后端ROS节点使用。同时feature_tracker_node还会发布标记了特征点的图片,可供Rviz显示以供调试。如下表所示:
操作
话题
消息类型
功能Subscribe
image
sensor_msgs::ImageConstPtr
订阅原始图像,传给回调函数
Publish
feature
sensor_msgs::PointCloud
跟踪的特征点,供后端优化使用
Publish
feature_img
sensor_msgs::Image
跟踪特征点图片,输出给RVIZ,调试用
feature_tracker.h和feature_tracker.cpp实现了一个类FeatureTracker,用来完成特征点提取和特征点跟踪等主要功能,该类中主要函数和实现的功能如下:
函数
功能bool inBorder()
判断跟踪的特征点是否在图像边界内
void reduceVector()
去除无法跟踪的特征点
void FeatureTracker::setMask()
对跟踪点进行排序并去除密集点
void FeatureTracker::addPoints()