VINS-Mono中feature_id的构造

在视觉惯性导航系统(VINS)的实现中,特征点管理是一个关键部分。文章讨论了如何通过feature_id来确保每个特征点的唯一标识。当新特征点被添加时,如果旧的特征点丢失,新特征会获得连续的id,避免重复。在feature_tracker.cc中,通过维护ids数组和n_id计数器,保证了id的分配不会冲突,从而实现id的全局唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值