• slam学习 - 基本VO代码学习


    本打算学习 orb -slam3 源码,但还是先把《slam 14》上的代码看完再说,至少把整个流程走一遍。

    相关参考

    https://blog.csdn.net/weixin_44684139/article/details/105305564
    https://blog.csdn.net/qq_35590091/article/details/97111744

    代码需求分析

    按照书上的内容,把代码分为一下几个类别

    1. Camera类别【功能,工具人】
    2. frame类别【主要基本对象,机器人的相关东西】
    3. MapPoint类【主要被观测对象,现实世界的点】
    4. Map类【领导,上面的两个太多了,人员优化一下】
    5. VisualOdometry 类【公司或者说某个具体项目需求,可以理解为 main 函数】

    在这里插入图片描述

    代码流程

    1. 两步前端

    首先要知道他的目的是:一共有5步,求这5步拍摄的位置和方向(也就是求每一步的变换矩阵)。
    方法:只依据当前和前一帧的信息计算变换矩阵。
    步骤:(不包括异常处理等步骤)

    步骤函数
    提取关键点extractKeyPoints
    特征匹配featureMatching
    计算位姿poseEstimationPnP
    得出第二针图像中某些点的3D位置,为下次pnp准备setRef3DPoints
    将第二针插入map的数组中addkeyframe
    2. 局部地图前端

    大概的变换只在上述第四步: 以前是和前辈比较,现在是和人才库(局部地图)比较。
    变化的目的是:维护一个局部地图。(这个版本好像没有全局地图的概念)
    那显而易见,如果想要维护局部地图那就必须要有:

    1. 增加地图点
    2. 删除地图点
    3. 【?不知道slam14讲中0.4版本的代码里面有没优化地图点的】

    删除比较容易,如何添加地图点呢?这个回答不错:

    optimizeMap()这个函数实现了添加新点(嵌套着addMapPoints())。向地图中增加关键点的机制是:当前帧的关键点一旦和地图点匹配上了,那么就无视他。没有匹配上的关键点需要映射到世界坐标系中,增加局部地图点的规模。具体看函数:void Map_VisualOdometry::addMapPoints()

    问题1 但这里什么叫匹配上了?什么叫没有匹配上呢?其实就是特征匹配,以前是两张图匹配,现在是 图-地图 模式。匹配好的点放在 match_3dpts_,match_2dkp_index_。具体加入三维地图点的机制:

    1. 先 图 - 地图 的特征点进行匹配(100个配对点 - > 阈值法筛选80个)
    2. 如果没有匹配上(可能是orb特征差距过大),但毕竟也是有深度的点,直接加入地图中。(适用于快速移动的时候)
    3. 这也是 optimizemap的作用:删除看不见的、边缘的,增加新的点

    问题2 这个 addkeyframe 关键帧是指什么?即只要旋转或者平移超过一定距离就可以被认为是关键。

    问题3 既然局部地图都有了,关键帧用来做什么的?这个时候又没有回环检测!这个我也没看到有什么大用处…

    总结

    在这里插入图片描述
    学习这个主要是为了orbslam的学习铺垫,不然看天书了。

  • 相关阅读:
    #LLM入门|Prompt#1.1 第一部分_面向开发者的LLM入门教程_简介
    Linux系统中使用vim编写C语言代码实现过程
    闪迪ssd plus固态硬盘不识别开卡成功,慧荣SM2246XT量产教程
    vue 项目打包性能分析插件 webpack-bundle-analyzer
    vue深拷贝的几种实现方式
    CentOS 7 Web面板的文件管理器说明
    SSM+教学网站 毕业设计-附源码211611
    数据库导入数据集TPCH IMDB也可
    Qt QPixmap旋转图像
    React---SOLID五种代码干净原则,提升代码可读性与可维护性。
  • 原文地址:https://blog.csdn.net/qq_43110298/article/details/128157773