解读《视觉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

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase