#小编推书#原创SLAM技术书,从基础理论到代码实现

Jessica瑾妞

2017-05-02

《视觉SLAM十四讲:从理论到实践》是一本介绍视觉SLAM 的书,也很可能是第一本以视觉SLAM 为主题的中文书。那么,SLAM 是什么?

SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉SLAM”。
SLAM技术是全自动无人驾驶、无人机、机器人等人工智能产品的核心技术之一。

关于本书

《视觉SLAM十四讲:从理论到实践》系统介绍了视觉SLAM(同时定位与地图构建)所需的基本知识与核心算法,既包括数学理论基础,如三维空间的刚体运动、非线性优化,又包括计算机视觉的算法实现,例如多视图几何、回环检测等。此外,还提供了大量的实例代码供读者学习研究,从而更深入地掌握这些内容。

书中不仅有深入浅出的讲解,同时注重理论和实践结合,大大降低了国内学生和相关从业者的进入门槛。适合对SLAM感兴趣的读者阅读,也适合有志于从事计算机视觉、机器人研究等领域的广大学生阅读,可作为SLAM技术的入门教材。

全书内容主要分为两个部分。

第一部分为数学基础篇,我们会以浅显易懂的方式,铺垫与视觉SLAM 相关的数学知识,包括:

第1 讲是前言,介绍这本书的基本信息,习题部分主要包括一些自测题。

第2 讲为SLAM 系统概述,介绍一个SLAM 系统由哪些模块组成,各模块的具体工作是什么。实践部分介绍编程环境的搭建过程以及IDE 的使用。

第3 讲介绍三维空间运动,你将接触到旋转矩阵、四元数、欧拉角的相关知识,并且在Eigen 当中使用它们。

第4 讲为李群和李代数。即便你现在不懂李代数为何物,也没有关系。你将学到李代数的定义和使用方式,然后通过Sophus 操作它们。

第5 讲介绍针孔相机模型以及图像在计算机中的表达。你将用OpenCV 来调取相机的内外参数。

第6 讲介绍非线性优化,包括状态估计理论基础、最小二乘问题、梯度下降方法。你会完成一个使用Ceres 和g2o 进行曲线拟合的实验。

这些就是我们要用到的所有数学知识了,当然,其中还隐含了你以前学过的高等数学和线性代数。我们保证它们看起来都不会很难。当然,若你想进一步深入挖掘,我们会提供一些参考资料供你阅读,那些材料可能会比正文里讲的知识难一些。 它们也可能成为今后相关行业的面试题,或许还能帮你在找工作时留个好印象。

第二部分为SLAM 技术篇。我们会使用第一部分所介绍的理论,讲述视觉SLAM中各个模块的工作原理。

第7 讲为特征点法的视觉里程计。该讲内容比较多,包括特征点的提取与匹配、对极几何约束的计算、PnP 和ICP 等。在实践中,你将用这些方法去估计两个图像之间的运动。

第8 讲为直接法的视觉里程计。你将学习光流和直接法的原理,然后利用g2o 实现一个简单的RGB-D 直接法。

第9 讲为视觉里程计的实践章,你将搭建一个视觉里程计框架,综合运用先前学过的知识,实现它的基本功能。这个过程中,你会碰到一些问题,例如优化的必要性、关键帧的选择等。

第10 讲为后端优化,主要为对Bundle Adjustment 的深入讨论,包括基本的BA,以及如何利用稀疏性加速求解过程。你将用Ceres 和g2o 分别书写一个BA 程序。

第11 讲主要讲后端优化中的位姿图。位姿图是表达关键帧之间约束的一种更紧凑的形式。你将用g2o 和gtsam 对一个位姿球进行优化。

第12 讲为回环检测,主要介绍以词袋方法为主的回环检测。你将使用dbow3书写字典训练程序和回环检测程序。

第13 讲为地图构建。我们会讨论如何使用单目进行稠密深度图的估计(以及这是多么不可靠),然后讨论RGB-D 的稠密地图构建过程。你会书写极线搜索与块匹配的程序,然后在RGB-D 中遇到点云地图和八叉树地图的构建问题。

第14 讲主要介绍当前的开源SLAM 项目以及未来的发展方向。相信在阅读了前面的知识之后,你会更容易理解它们的原理,实现自己的新想法。

最后,如果你完全看不懂上面在说什么,那么恭喜你!这本书很适合你!加油!

如何使用本书

《视觉SLAM十四讲:从理论到实践》名为“视觉SLAM 十四讲”。顾名思义,我们会像在学校里讲课那样,以“讲”作为本书的基本单元。每一讲都对应一个固定的主题,其中会穿插“理论部分”和“实践”。如果你完全没有听说过它们,那么应该感到兴奋,这说明你会从本书中收获很多知识。你会经常在脚注中发现一些神奇的东西。

“实践部分”两种内容。通常是理论部分在前,实践部分在后。在理论部分中,我们将介绍理解算法所必需的数学知识,并且大多数时候以叙述的方式,而不是像数学教科书那样用“定义—定理—推论”的方式,因为我们觉得这样的方式阅读起来更容易一些,尽管有时候显得不那么严谨。实践部分主要是编程实现,讨论程序里各部分的含义及实验结果。看到标题中带有“实践”两个字的章节,你就应该(兴致勃勃地)打开电脑,和我们一起愉快地编写代码了。

值得一提的是,我们只会把与解决问题相关的数学知识放在书里,并尽量保持浅显。虽然我们是工科生,但也要承认,某些做法只要经验上够用,没必要非得在数学上追求完备。只要我们知道这些算法能够工作,并且数学家们告诉了我们在什么情况下可能不工作,那么我们就表示满意,而不追究那些看似完美但实际复杂冗长的证明(当然它们固有自己的价值)。由于SLAM 牵涉到了太多数学背景,为了防止使本书变成数学教科书,我们把一些细节上的推导和证明留作习题和补充阅读材料,方便感兴趣的读者进一步阅读参考文献,更深入地掌握相关细节。

每一讲正文之后,我们设计了一些习题。其中,带* 号的习题是具有一定难度的。我们强烈建议读者把习题都练习一遍,这对你掌握这些知识很有帮助。

面向读者

《视觉SLAM十四讲:从理论到实践》面向对SLAM 感兴趣的学生和研究人员。阅读本书需要一定的基础,我们假设你具备以下知识:

高等数学、线性代数、概率论。这些是大部分读者应该在大学本科阶段接触过的基本数学知识。你应当明白矩阵和向量是什么,或者做微分和积分是什么意思。对于SLAM 中用到的专业知识,我们会额外加以介绍。

C++ 语言基础。由于我们采用C++ 作为编码语言,所以建议读者至少熟悉这门语言的语法。比如,你应该知道类是什么,如何使用C++ 标准库,模板类如何使用,等等。我们会避免过多地使用技巧,但有些地方确实无法避免。此外,我们还使用了一些C++ 11 标准的内容,不过,我们会在用到的地方加以解释。

Linux 基础。我们的开发环境是Linux 而非Windows,并且只提供Linux 下的源程序,不会再提供Windows 下的开发方法介绍。我们认为,掌握Linux 是一个SLAM 研究人员所必需的,请初学者暂时不要问为什么,把本书的知识学好之后相信你会和我们有同样的想法。各种程序库在Linux 下的配置都非常便捷,

你也会在此过程中体会到Linux 的便利。如果读者此前从未使用过Linux,那么最好找一本Linux 的教材稍加学习(掌握基本知识即可,一般就是相关图书的前面几章内容)。我们不要求读者具备高超的Linux 操作技能,但希望读者至少知道“打开终端,进入代码目录”是如何操作的。本讲的习题里有一些Linux 知识自测题,如果你清楚自测题的答案,那么阅读本书代码不会有任何问题。

对SLAM 感兴趣但不具备上述知识的读者,可能在阅读本书时会感到困难。如果你不了解C++ 的基本知识,可以读一点C++ Primer Plus 之类的图书入门;如果你缺少相关的数学知识,也可以先阅读一些相关数学教材补充知识,不过我们认为,对大多数大学本科水平的朋友,读懂本书所需的数学背景肯定是具备了。代码方面,你最好花点时间亲自输入一遍,再调节里面的参数,看看效果会发生怎样的改变。这会对学习很有帮助。

《视觉SLAM十四讲:从理论到实践》可作为SLAM 相关课程的教材,亦可作为课外自学材料使用。

读者评论

相关博文

  • 经典视觉SLAM框架

    经典视觉SLAM框架

    管理员账号 2017-05-10

    小编说:通过前面的推送我们已经对SLAM有了个大体的认识。(初识视觉SLAM)下面来看经典的视觉SLAM框架,了解一下视觉SLAM究竟由哪几个模块组成。 整体视觉SLAM流程图。 整个视觉SLAM流程包括以下步骤。 1.传感...

    管理员账号 2017-05-10
    297 0 0 0
  • #小编推书#原创SLAM技术书,从基础理论到代码实现

    Jessica瑾妞 2017-05-08

    《视觉SLAM十四讲:从理论到实践》是一本介绍视觉SLAM 的书,也很可能是第一本以视觉SLAM 为主题的中文书。那么,SLAM 是什么? SLAM 是Simultaneous Localization and Mapping 的缩...

    Jessica瑾妞 2017-05-08
    10 0 0 0
  • 初识视觉SLAM:用相机解决定位和建图问题

    初识视觉SLAM:用相机解决定位和建图问题

    管理员账号 2017-05-04

    小编说:视觉SLAM 是指用相机解决定位和建图问题。本文以一个小机器人为例形象地介绍了视觉SLAM的功能及特点。 SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与...

    管理员账号 2017-05-04
    71 0 0 0