在看vins初始化代码这一部分的时候, 在feature_manager.cpp中, FeatureManager::addFeatureCheckParallax这一部分用到feature_id, 用来给新的feature插入某帧的属性, 这时候需要判断这个feature以前有没有出现过. 判断条件就是查看feature对应的id, 也就是feature_id是不是有相同的id.
我在这个地方很迷惑, 为啥查找id就可以知道feature相同的id就是同一个feature? 这个id是怎么传播的?从哪是开始呢? 以我的经验, 通过光流追踪的点都是没办法区分是不是同一个点的, 原因是有新加的点. 后来仔细看了程序才知道原因:
在feature_tracker.cc中, 保证了每帧特征点数都要达到一定值, 如果有n个跟丢的, 新提取n个特征点.
假如第一帧提取了100个特征点, 那么id就是0~99, 在第二帧只跟到了80个, 即id为20~99的特征点, 那么新增20个点,并把新的id附成100~119. n_id一直在累加, 保证了id的唯一性
/**
* @brief
*
* @param[in] i
* @return true
* @return false
* 给新的特征点赋上id,越界就返回false
*/
bool FeatureTracker::updateID(unsigned int i)
{
if (i < ids.size())
{
if (ids[i] == -1)
ids[i] = n_id++;
return true;
}
else
return false;
}