当前位置: 首页 > news >正文

ORB-SLAM2源码学习:MapPoint.cc④: 新增地图点总结

前言

让我们来总结ORB-SLAM2 中的新增地图点。

1.在第一阶段跟踪中的恒速模型跟踪中新增地图点

针对双目相机或RGB-D相机,找出上一帧中具有有效深度值且不是地图点的特征点,将其中较近的点作为上一帧新的临时地图点, 并记录在向扯mlpTemporalPoints 中。注意,这里因为是临时地图点,所以没有添加地图点的相互观测和属性信息(最佳描述子、平均观测方向、观测距离范围)。

ORB-SLAM2源码学习:Tracking.cc:Tracking::UpdateLastFrame更新上一帧位姿并创建临时地图点-CSDN博客

void Tracking :: UpdateLastFrame ()
{//Step 1 : 利用参考关键帧更新L - 帧在世界坐标系F 的位姿//······//Step 2 : 对于双门相机或RGB-D 相机,为上一帧生成新的临时地图点//······//加入上一帧的地图点中mLastFrame.mvpMapPoints[i] =pNewMP;//标记为临时添加的地图,之后会全部删除mlpTemporalPoints.push_back(pNewMP);

2.第二阶段跟踪结束后新建关键帧时

针对双目相机或RGB-D相机,找出当前帧中具有有效深度值且不是地图点的特征点,将其中较近的点作为当前帧的新的地图点。与函数Tracking::UpdateLastFrame()功能类似,不同之处是这里添加的是真正的地图点, 会添加地图点和关键帧的相互观测和属性信息,如最佳描述子、平均观测方向、观测距离范围。

....
MapPoint* pNewMP = new MapPoint(x3D,pKF,mpMap);// 这些添加属性的操作是每次创建MapPoint后都要做的pNewMP->AddObservation(pKF,i);pKF->AddMapPoint(pNewMP,i);pNewMP->ComputeDistinctiveDescriptors();pNewMP->UpdateNormalAndDepth();mpMap->AddMapPoint(pNewMP);mCurrentFrame.mvpMapPoints[i]=pNewMP;
....

ORB-SLAM2源码学习:Tracking.cc: void Tracking::CreateNewKeyFrame 创建新的关键帧-CSDN博客

3.局部建图线程中

1.在局部建图线程中,用当前关键帧与相邻关键帧通过三角化生成新的地图点。这里地图点会添加相互观测和属性信息,如最佳描述子、平均观测方向、观测距离范围,并且会将新增地图点放到一个名为“最近新增地图点”的队列mlpRecentAddedMapPoints中,这些新增的地图点后续需要接受函数MapPointCulling 的检验。

            //三角化生成3D点成功,构造成MapPointMapPoint* pMP = new MapPoint(x3D,mpCurrentKeyFrame,mpMap);// Step 6.9:为该MapPoint添加属性:// a.观测到该MapPoint的关键帧pMP->AddObservation(mpCurrentKeyFrame,idx1);            pMP->AddObservation(pKF2,idx2);mpCurrentKeyFrame->AddMapPoint(pMP,idx1);pKF2->AddMapPoint(pMP,idx2);// b.该MapPoint的描述子pMP->ComputeDistinctiveDescriptors();// c.该MapPoint的平均观测方向和深度范围pMP->UpdateNormalAndDepth();mpMap->AddMapPoint(pMP);

ORB-SLAM2源码学习:LocalMapping.cc: LocalMapping::CreateNewMapPoints生成新的地图点-CSDN博客

2.在局部建图线程中, 将当前关键帧的地图点分别与一级、二级相连关键帧的地图点进行正向融合和反向融合。这里的融合包括替换或新增地图点,并且会添加相互观测。最后会统一更新地图点的属性信息。

    ....vpMapPointMatches = mpCurrentKeyFrame->GetMapPointMatches();for(size_t i=0, iend=vpMapPointMatches.size(); i<iend; i++){MapPoint* pMP=vpMapPointMatches[i];if(pMP){if(!pMP->isBad()){// 在所有找到pMP的关键帧中,获得最佳的描述子pMP->ComputeDistinctiveDescriptors();// 更新平均观测方向和观测距离pMP->UpdateNormalAndDepth();}}}....

ORB-SLAM2源码学习:LocalMapping.cc: void LocalMapping::SearchInNeighbors 检查并融合当前关键帧和相邻帧(两级相邻)的重复地图点-CSDN博客

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

http://www.lryc.cn/news/523120.html

相关文章:

  • 2025西湖论剑-babytrace
  • 绘图专用,26个常见流程图符号及其解释
  • 【个人学习记录】软件开发生命周期(SDLC)是什么?
  • 自学SpringBoot笔记
  • 03JavaWeb——Ajax-Vue-Element(项目实战)
  • [leetcode](找到vector中的特定元素并删除)无重复字符的最长子串
  • Mockito+PowerMock+Junit单元测试
  • Ncat: bind to :::7777: Address already in use报错问题解决
  • Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错,禁用dns
  • 在线图片像素颜色拾取工具
  • Qt之登录界面(splash)
  • NotebookLM:Google 最新 AI 笔记助理解析与实战应用
  • 软路由系统iStoreOS 一键安装 docker compose
  • vue3本地文件下载
  • 纯代码实现给WordPress添加文章复制功能
  • Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)
  • 【PyQt】图像处理系统
  • Ruby语言的循环实现
  • javaEE安全开发 SQL预编译 Filter过滤器 Listener 监听器 访问控制
  • 一体机cell服务器更换内存步骤
  • Hadoop•用Web UI查看Hadoop状态词频统计
  • rhel7.9利用有网络环境打包ansible
  • vim文本编辑器三种模式的转换关系
  • 深度学习:大模型Decoding+MindSpore NLP分布式推理详解
  • 【JVM中的三色标记法是什么?】
  • 数据库服务体系结构
  • vscode项目依赖问题
  • R数据分析:有调节的中介与有中介的调节的整体介绍
  • RabbitMQ-消息可靠性以及延迟消息
  • Hack The Box-Starting Point系列Oopsie