解读《视觉SLAM十四讲》,带你一步一步入门视觉SLAM—— 第 13 讲 建图

2024-06-05 17:32

本文主要是介绍解读《视觉SLAM十四讲》,带你一步一步入门视觉SLAM—— 第 13 讲 建图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一讲拖到现在才开始写,其中一个主要的原因是建图部分的内容,一方面比较难,另一方面它在实际的工程中应用较少,我对这方面的了解不是特别深入。

工程中很少对视觉构建的地图进行复用,其原因主要有(来自我自己的经验):

  • ① 地图的精度较低,多数难以达到导航和定位的要求;
  • ② 视觉对光线比较敏感,构建的地图难以较好复用,有时早上建图,下午定位成功率就很低;
  • ③ 地图体积大,内存占用率高。视觉slam会维护一个比较复杂的地图数据结构,而这些数据如果不加处理,实际上是很占用资源的,对比cartographor这种激光slam的地图,同样场景下只有几十兆大小,而视觉特征点地图则达到几百兆。

而目前视觉建图中应用比较多的是稠密或者半稠密建图,因为至少还可以构建我们人类可以看的场景,于是在一些增强现实的应用场景下,它获得了一定的应用。而稀疏的特征点地图多数情况下,几乎都是都看不出啥。

这一讲书中大部分的内容都是比较完整的,而且理解起来也不难,但是如果要扩宽这些内容到实际的应用中,还是很难的。

概述

在slam中我们对地图有如下一些需求:

  • ① 定位:目前关于视觉的定位主要是通过提前构建场景的三维地图,多数情况是基于特征点的三维地图,然后通过各种的搜索方法进行重定位,可以使用词袋的方式进行粗定位,然后进行局部匹配,进而求解PnP,当然方法不仅限于此,我目前正在做一种全局描述子搜索的定位方法,效果超过了词袋的方式。
  • ② 导航:导航是指机器人能够在地图中进行路径规划,在任意两个地图点之间寻找路径,然后控制自己运动到目标点的过程。这个过程需要一个可靠的环境建图,常采用稠密地图。
  • ③ 避障:是机器人在运动过程中的一个动态调整轨迹的问题,它需要对动态障碍物有一个可靠的检测。
  • ④ 重建:它是指对环境进行三维重建,这种建图偏向于给用户观看,所以它需要建立美观、舒服的场景地图,目前几乎都是采用稠密地图。在视觉slam方面场景重建的应用还是比较多的。
  • ⑤ 交互: 这是一种更偏向于和用户进行互动的应用,它不但需要构建较好的场景地图,多数情况向下还要有语义信息,需要知道场景中有哪些东西,在哪些地方,这种上层的应用目前多数还处在研究阶段,但是这将是未来一个非常好的应用。

单目稠密重建

极线搜索与块匹配
单目稠密重建部分的内容,作者提供给了一个例子通过多张单目图像重建一个稠密的地图,这个例子有一些地方还是值得注意的。

首先,这里的前后帧匹配并不是像第7章中的那样,第七章中使用的是暴力搜索匹配,对前后两张图像上提取的特征点进行描述子匹配。但是在本章中要进行的是稠密的重建,是针对的全像素重建。

例如,对于一张1024*768尺寸的图像,在进行前后帧像素值匹配时,如果已知第一帧中的某一个像素值,然后去第二帧中搜索最近的一个,这显然会耗费巨大的运算资源,而且错误的匹配会非常多,所以加速搜索和匹配是一个很重要的步骤。作者在书中采用的极线搜索的方式,根据几何关系,第一帧观测到的空间点,一定会投影到第二帧的极线上,那么只要在极线附近搜索,势必会减少很多运算量,而且正确的概率也将会更大。要想知道第二帧的极线位置,就必须要知道两帧之间的变换矩阵,所以就引出了第一个需要注意的地方,那就是这里的稠密重建方法,必须要 事先给定两帧之间的变换矩阵。多数情况下这个变换矩阵是由前端提供的。

另外,单个像素没有区分性,换句话来说就是鲁棒性较差,但是一个小的区域之内的匹配鲁棒性势必会更好一些,所以书中采用了 块匹配 的方式。

然后就是通过三角化还原出空间点的位置,由于测量会出现误差,所以提出使用深度滤波器进行多次测量,获得一个收敛的结果。高翔在书中提到使用深度滤波器,也就是高斯分布相乘的方式进行滤波。

高斯分布的深度滤波器
为什么就可以直接将两个高斯分布相乘进行滤波呢?书中并未提及原因,实际上我觉得这是一个非常重要的点,至少学会了这一点,对于简单的数据融合,我们没有必要就非要用卡尔曼滤波。

在这里插入图片描述
在《机器人学中的状态估计》2.2.6 高斯概率密度函数的归一化积中有如上这张图,最左和最右的两个正态分布是两次测量,而中间那个就是两次测量融合之后的效果,是不是有那么点像多次测量求平均值的味道,而这个归一化积的过程就是两次测量的分布求积。至于为何多次测量之后会有更大的可能获得一个最好的结果呢?这里我只是贴出了结论,至于更细节和具体的原因,就交由大家自己去学习了!

主要是我尝试解释这个原因,但是发现可能是自己的理解还不够,导致解释之后更乱!

关于深度滤波器,推荐大家看一下这篇博客:《深度滤波器详细解读》

另外的内容大家还是看《十四讲》吧!

============ TODO:补充建图相关内容 ===========

这一讲本来在写的时候,感觉有好多东西写,但是当我开始查看相关论文以及一些博客之后,发现啥也不会写了,书中省略了的一些内容恰恰是一些很难却很有用的内容,所以我建议大家还是直接阅读SVO、DSO或者LSD的论文和代码,不然仅凭书中的介绍,你可能很难理解这其中的技巧和原理。(感觉这一篇写的有点水,没有什么特别干货的东西,待我看些论文,再研究研究,继续补上一些相关内容)

这篇关于解读《视觉SLAM十四讲》,带你一步一步入门视觉SLAM—— 第 13 讲 建图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033708

相关文章

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Jupyter notebook安装步骤解读

《Jupyternotebook安装步骤解读》:本文主要介绍Jupyternotebook安装步骤,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、开始安装二、更改打开文件位置和快捷启动方式总结在安装Jupyter notebook 之前,确认您已安装pytho

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri