编辑推荐

适读人群:《视觉SLAM十四讲:从理论到实践》适合对SLAM感兴趣的读者阅读,也适合有志于从事计算机视觉、机器人研究等领域的广大学生阅读,可作为SLAM技术的入门教材。
  SLAM技术是全自动无人驾驶、无人机、机器人等人工智能产品的核心技术之一。
  作者是SLAM领域非常杰出的青年专家。
  书中不仅有深入浅出的讲解,同时注重理论和实践结合,大大降低了国内学生和相关从业者的进入门槛。

内容简介

  《视觉SLAM十四讲:从理论到实践》系统介绍了视觉SLAM(同时定位与地图构建)所需的基本知识与核心算法,既包括数学理论基础,如三维空间的刚体运动、非线性优化,又包括计算机视觉的算法实现,例如多视图几何、回环检测等。此外,还提供了大量的实例代码供读者学习研究,从而更深入地掌握这些内容。
  《视觉SLAM十四讲:从理论到实践》可以作为对SLAM感兴趣的研究人员的入门自学材料,也可以作为SLAM相关的高校本科生或研究生课程教材使用。

作者简介

  高翔,2008年就读清华大学自动化系,2012年免试进入清华大学自动化系攻读博士学位。研究课题为视觉SLAM,兴趣包括计算机视觉与机器学习。曾撰写过与SLAM相关的论文和技术博客。

  张涛,清华大学自动化系教授、党委书记、副系主任。1995年9月至1999年9月在清华大学自动化系检测技术与自动化装置专业学习,获博士学位。1999年10月至2002年9月在日本国立佐贺大学大学院工学系研究科系统控制专业学习,获博士学位。研究课题包括机器人、航空航天、计算机视觉等。

  刘毅,华中科技大学图像与人工智能研究所在读博士,本科毕业于武汉理工大学数学系。读博期间专注于图像处理、三维重建、视觉SLAM,以及传感器融合研究和应用,读博期间先后于深圳市大疆创新公司,英特尔中国研究院等单位实习。

  颜沁睿,比利时荷语鲁汶大学人工智能硕士,电子工程学士(GroupT)。电子科技大学信息显示与光电技术学士。长期致力于研究人工智能技术在机器人领域的应用,包括计算机视觉、机器学习和SLAM。现担任地平线机器人公司智能驾驶部算法工程师。

精彩书评

  隆重向读者推荐《视觉SLAM十四讲:从理论到实践》。一方面《视觉SLAM十四讲:从理论到实践》是业界少有的涵盖从基础理论到代码实例,系统性讲解SLAM的书;另一方面,《视觉SLAM十四讲:从理论到实践》的作者和地平线颇有渊源,高翔曾经是我们的算法实习生,颜沁睿是自动驾驶算法工程师,都是在SLAM领域非常杰出的青年专家,走在技术实践前沿。在移动互联网大潮之后,自动驾驶、无人机、服务机器人等人工智能硬件会成为下一个产业爆发点,其中关键的技术之一就是动态定位和环境建模的SLAM技术。《视觉SLAM十四讲:从理论到实践》是国内非常有价值的有关SLAM技术的书籍,适合有志于从事机器人技术的研究生和工程师,一定会让读者很有收获。
  ——地平线机器人创始人,中国人工智能学会副秘书长,余凯

  我在新加坡和加拿大给学生讲视觉SLAM时常常觉得缺乏一本适合初学者的教材。高翔博士的《视觉SLAM十四讲:从理论到实践》从基础的四元数、李代数讲起,涵盖了卡尔曼滤波、BundleAdjustment、Pose-Graph等高级优化工具。书中更有zui近十多年成功系统的概述,从2003年的MonoSLAM直到2016年的ORB-SLAM。通篇既有清晰的理论叙述,又辅以大量示例程序,是一本非常好的视觉SLAM教材。
  ——加拿大西蒙弗雷泽大学终身教授,谭平

  视觉SLAM随着近年增强现实、无人驾驶等应用的兴起而重新获得重大关注。视觉SLAM属于计算机视觉和机器人研究的交叉领域,因此涉及的基础知识广而分散。国内专门的研究机构相对较少,因此学生入门的门槛较高。幸运的是,《视觉SLAM十四讲:从理论到实践》不仅有深入浅出的讲解,同时注重理论和实战的结合,大大降低了国内学生和相关从业者的进入门槛。因此,《视觉SLAM十四讲:从理论到实践》非常值得初学者学习实践。
  ——网易感知与智能中心增强现实算法架构师,刘海伟

  作者的这《视觉SLAM十四讲:从理论到实践》既是通俗有趣的高科技演义,又是足以指导研发实践的翔实教程,对国内SLAM界而言可谓意义重大。我甚至发现有不少目前圈内的一流人才都是因为看了《视觉SLAM十四讲:从理论到实践》的早期章节才决定进入这个行业并快速成长起来的。
  《视觉SLAM十四讲:从理论到实践》里所涵盖的知识面、技术细节,甚至是某些宝贵的实践经验,对国内刚刚起步的虚拟现实和增强现实(VR/AR)、无人机、无人车、机器人等行业而言,都将产生深远影响!
  ——uSens凌感科技联合创始人/首席运营官,时驰(Chris)博士

目录

第1讲预备知识1
1.1《视觉SLAM十四讲:从理论到实践》讲什么1
1.2如何使用《视觉SLAM十四讲:从理论到实践》3
1.2.1组织方式3
1.2.2代码5
1.2.3面向的读者6
1.3风格约定6
1.4致谢和声明7
第2讲初识SLAM9
2.1引子:小萝卜的例子11
2.2经典视觉SLAM框架17
2.2.1视觉里程计17
2.2.2后端优化19
2.2.3回环检测20
2.2.4建图21
2.3SLAM问题的数学表述22
2.4实践:编程基础25
2.4.1安装Linux操作系统25
2.4.2HelloSLAM27
2.4.3使用cmake28
2.4.4使用库30
2.4.5使用IDE32
第3讲三维空间刚体运动37
3.1旋转矩阵39
3.1.1点和向量,坐标系39
3.1.2坐标系间的欧氏变换40
3.1.3变换矩阵与齐次坐标42
3.2实践:Eigen44
3.3旋转向量和欧拉角48
3.3.1旋转向量48
3.3.2欧拉角50
3.4四元数51
3.4.1四元数的定义51
3.4.2四元数的运算53
3.4.3用四元数表示旋转55
3.4.4四元数到旋转矩阵的转换55
3.5*相似、仿射、射影变换56
3.6实践:Eigen几何模块57
3.7可视化演示60
第4讲李群与李代数62
4.1李群与李代数基础64
4.1.1群64
4.1.2李代数的引出65
4.1.3李代数的定义67
4.1.4李代数so(3)67
4.1.5李代数se(3)68
4.2指数与对数映射69
4.2.1SO(3)上的指数映射69
4.2.2SE(3)上的指数映射.70
4.3李代数求导与扰动模型72
4.3.1BCH公式与近似形式72
4.3.2SO(3)李代数上的求导73
4.3.3李代数求导74
4.3.4扰动模型(左乘)75
4.3.5SE(3)上的李代数求导76
4.4实践:Sophus76
4.5*相似变换群与李代数.79
4.6小结81
第5讲相机与图像82
5.1相机模型84
5.1.1针孔相机模型84
5.1.2畸变87
5.1.3双目相机模型90
5.1.4RGB-D相机模型92
5.2图像93
5.3实践:图像的存取与访问95
5.3.1安装OpenCV95
5.3.2操作OpenCV图像96
5.4实践:拼接点云99
第6讲非线性优化104
6.1状态估计问题106
6.1.1最大后验与最大似然106
6.1.2最小二乘的引出108
6.2非线性最小二乘109
6.2.1一阶和二阶梯度法110
6.2.2高斯牛顿法111
6.2.3列文伯格—马夸尔特方法113
6.2.4小结114
6.3实践:Ceres115
6.3.1Ceres简介116
6.3.2安装Ceres116
6.3.3使用Ceres拟合曲线117
6.4实践:g2o121
6.4.1图优化理论简介121
6.4.2g2o的编译与安装122
6.4.3使用g2o拟合曲线123
6.5小结128
第7讲视觉里程计1130
7.1特征点法132
7.1.1特征点132
7.1.2ORB特征134
7.1.3特征匹配137
7.2实践:特征提取和匹配138
7.32D?2D:对极几何141
7.3.1对极约束141
7.3.2本质矩阵143
7.3.3单应矩阵146
7.4实践:对极约束求解相机运动148
7.5三角测量153
7.6实践:三角测量154
7.6.1三角测量代码154
7.6.2讨论156
7.73D?2D:PnP157
7.7.1直接线性变换158
7.7.2P3P159
7.7.3BundleAdjustment161
7.8实践:求解PnP165
7.8.1使用EPnP求解位姿165
7.8.2使用BA优化166
7.93D?3D:ICP172
7.9.1SVD方法173
7.9.2非线性优化方法175
7.10实践:求解ICP176
7.10.1SVD方法176
7.10.2非线性优化方法178
7.11小结180
第8讲视觉里程计2182
8.1直接法的引出184
8.2光流(OpticalFlow)185
8.3实践:LK光流187
8.3.1使用TUM公开数据集187
8.3.2使用LK光流188
8.4直接法(DirectMethod)192
8.4.1直接法的推导192
8.4.2直接法的讨论195
8.5实践:RGB-D的直接法196
8.5.1稀疏直接法196
8.5.2定义直接法的边197
8.5.3使用直接法估计相机运动199
8.5.4半稠密直接法200
8.5.5直接法的讨论202
8.5.6直接法优缺点总结203
第9讲实践:设计前端205
9.1搭建VO框架206
9.1.1确定程序框架207
9.1.2确定基本数据结构208
9.1.3Camera类210
9.1.4Frame类212
9.1.5MapPoint类213
9.1.6Map类213
9.1.7Config类214
9.2基本的VO:特征提取和匹配216
9.2.1两两帧的视觉里程计216
9.2.2讨论224
9.3改进:优化PnP的结果224
9.4改进:局部地图227
9.5小结233
第10讲后端1235
10.1概述237
10.1.1状态估计的概率解释237
10.1.2线性系统和KF239
10.1.3非线性系统和EKF242
10.1.4EKF的讨论243
10.2BA与图优化245
10.2.1投影模型和BA代价函数245
10.2.2BA的求解247
10.2.3稀疏性和边缘化248
10.2.4鲁棒核函数255
10.2.5小结256
10.3实践:g2o257
10.3.1BA数据集257
10.3.2g2o求解BA258
10.3.3求解262
10.4实践:Ceres264
10.4.1Ceres求解BA265
10.4.2求解267
10.5小结269
第11讲后端2270
11.1位姿图(PoseGraph)271
11.1.1PoseGraph的意义271
11.1.2PoseGraph的优化272
11.2实践:位姿图优化274
11.2.1g2o原生位姿图274
11.2.2李代数上的位姿图优化278
11.2.3小结284
11.3*因子图优化初步285
11.3.1贝叶斯网络285
11.3.2因子图286
11.3.3增量特性288
11.4*实践:gtsam289
11.4.1安装gtsam4.0289
11.4.2位姿图优化290
第12讲回环检测297
12.1回环检测概述299
12.1.1回环检测的意义299
12.1.2方法300
12.1.3准确率和召回率301
12.2词袋模型303
12.3字典305
12.3.1字典的结构305
12.3.2实践:创建字典306
12.4相似度计算309
12.4.1理论部分309
12.4.2实践:相似度的计算310
12.5实验分析与评述314
12.5.1增加字典规模314
12.5.2相似性评分的处理316
12.5.3关键帧的处理316
12.5.4检测之后的验证317
12.5.5与机器学习的关系317
第13讲建图319
13.1概述320
13.2单目稠密重建322
13.2.1立体视觉322
13.2.2极线搜索与块匹配323
13.2.3高斯分布的深度滤波器325
13.3实践:单目稠密重建328
13.4实验分析与讨论339
13.4.1像素梯度的问题339
13.4.2逆深度340
13.4.3图像间的变换341
13.4.4并行化:效率的问题342
13.4.5其他的改进343
13.5RGB-D稠密建图343
13.5.1实践:点云地图344
13.5.2八叉树地图347
13.5.3实践:八叉树地图350
13.6*TSDF地图和Fusion系列352
13.7小结356
第14讲SLAM:现在与未来357
14.1当前的开源方案358
14.1.1MonoSLAM358
14.1.2PTAM359
14.1.3ORB-SLAM361
14.1.4LSD-SLAM363
14.1.5SVO364
14.1.6RTAB-MAP366
14.1.7其他367
14.2未来的SLAM话题367
14.2.1视觉+惯性导航SLAM367
14.2.2语义SLAM369
14.2.3SLAM的未来370
附录A高斯分布的性质371
A.1高斯分布371
A.2高斯分布的运算371
A.2.1线性运算371
A.2.2乘积372
A.2.3复合运算372
A.3复合的例子372
附录BROS入门374
B.1ROS是什么374
B.2ROS的特点375
B.3如何快速上手ROS375
参考文献377

前言/序言

  这是一本介绍视觉SLAM的书,也很可能是第一本以视觉SLAM为主题的中文书。那么,SLAM是什么?
  SLAM是SimultaneousLocalizationandMapping的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉SLAM”。
  《视觉SLAM十四讲:从理论到实践》的主题就是视觉SLAM。这里我们刻意把许多个定义放到一句话中,是希望读者有一个较明确的概念。首先,SLAM的目的是解决“定位”与“地图构建”这两个问题。也就是说,一边要估计传感器自身的位置,一边要建立周围环境的模型。那么怎么解决呢?这需要用到传感器的信息。传感器能以一定形式观察外部的世界,不过不同传感器观察的方式是不同的。而之所以要花一《视觉SLAM十四讲:从理论到实践》的内容去讨论这个问题,是因为它很难——特别是我们希望实时地、在没有先验知识的情况下进行SLAM。当用相机作为传感器时,我们要做的就是根据一张张连续运动的图像(它们形成了一段视频),从中推断相机的运动,以及周围环境的情况。
  这似乎是个很直观的问题。我们自己走进陌生的环境时不就是这么做的吗?
  在计算机视觉(ComputerVision)创立之初,人们就想象着有朝一日计算机将和人一样,通过眼睛去观察世界,理解周遭的物体,探索未知的领域——这是一个美妙而又浪漫的梦想,吸引了无数的科研人员日夜为之奋斗。我们曾经以为这件事情并不困难,然而进展却远不如预想的那么顺利。我们眼中的花草树木、虫鱼鸟兽,在计算机中却是那样的不同:它们只是一个个由数字排列而成的矩阵(Matrix)。让计算机理解图像的内容,就像让我们自己理解这些数字一样困难。我们既不了解自己如何理解图像,也不知道计算机该如何理解、探索这个世界。于是我们困惑了很久,直到几十年后的今天,才发现了一点点成功的迹象:通过人工智能(ArtificialIntelligence)和机器学习(MachineLearning)技术,计算机渐渐能够辨别出物体、人脸、声音、文字——尽管它所用的方式(概率学建模)与我们是如此不同。另一方面,在SLAM发展了将近30年之后,我们的相机才渐渐开始能够认识到自身的位置,发觉自己在运动——虽然方式还是和我们人类有巨大的差异。不过,至少研究者们已经成功地搭建出种种实时SLAM系统,有的能够快速跟踪自身位置,有的甚至能够进行实时的三维重建。
  这件事情确实很困难,但我们已经有了很大的进展。更令人兴奋的是,近年来随着科技的发展,涌现出了一大批与SLAM相关的应用点。在许多地方,我们都希望知道自身的位置:室内的扫地机和移动机器人需要定位,野外的自动驾驶汽车需要定位,空中的无人机需要定位,虚拟现实和增强现实的设备也需要定位。SLAM是那样重要。没有它,扫地机就无法在房间自主地移动,只能盲目地游荡;家用机器人就无法按照指令准确到达某个房间;虚拟现实也将永远固定在座椅之上——所有这些新奇的事物都无法出现在现实生活中,那将多么令人遗憾。
  今天的研究者和应用开发人员,逐渐意识到了SLAM技术的重要性。在国际上,SLAM已经有近三十年的研究历史,也一直是机器人和计算机视觉的研究热点。21世纪以来,以视觉传感器为中心的视觉SLAM技术,在理论和实践上都经历了明显的转变与突破,正逐步从实验室研究迈向市场应用。同时,我们又遗憾地发现,至少在国内,与SLAM相关的论文、书籍仍然非常匮乏,让许多对SLAM技术感兴趣的初学者无从一窥门径。虽然SLAM的理论框架基本趋于稳定,但其编程实现仍然较为复杂,有着较高的技术门槛。刚步入SLAM领域的研究者,不得不花很长的时间,学习大量的知识,往往要走过许多弯路才得以接近SLAM技术的核心。
  《视觉SLAM十四讲:从理论到实践》全面系统地介绍了以视觉传感器为主体的视觉SLAM技术,我们希望它能(部分地)填补这方面资料的空白。我们会详细地介绍SLAM的理论背景、系统架构,以及各个模块的主流做法。同时,极其重视实践:《视觉SLAM十四讲:从理论到实践》介绍的所有重要算法,都将给出可以运行的实际代码,以求加深读者的理解。之所以这么做,主要是考虑到SLAM毕竟是一项和实践紧密相关的技术。再漂亮的数学理论,如果不能转化为可以运行的代码,那就仍是可望而不可即的空中楼阁,没有实际意义。我们相信,实践出真知,实践出真爱。只有实际地演算过各种算法之后,你才能真正地认识SLAM,真正地喜欢上科研。
  自1986年提出以来,SLAM一直是机器人领域的热点问题。关于它的文献数以千计,想要对SLAM发展史上的所有算法及变种做一个完整的说明,是十分困难而且没有必要的。《视觉SLAM十四讲:从理论到实践》中会介绍SLAM所牵涉的背景知识,例如射影几何、计算机视觉、状态估计理论、李群李代数等,并在这些背景知识之上,给出SLAM这棵大树的主干,而略去一部分形状奇特、纹理复杂的枝叶。我们认为这种做法是有效的。如果读者能够掌握主干的精髓,那么自然会有能力去探索那些边缘的、细节的、错综复杂的前沿知识。所以,我们的目的是,让SLAM的初学者通过阅读《视觉SLAM十四讲:从理论到实践》快速地成长为能够探索这个领域边缘的研究者。另一方面,即便你已经是SLAM领域的研究人员,《视觉SLAM十四讲:从理论到实践》也可能有一些你还觉得陌生的地方,可以让你产生新的见解。
  目前,与SLAM相关的书籍主要有《概率机器人》(Probabilisticrobotics)、《计算机视觉中的多视图几何》(MultipleViewGeometryinComputerVision)、《机器人学中的状态估计》(StateEstimationforRobotics:AMatrix-Lie-GroupApproach)等。它们内容丰富、论述全面、推导严谨,是SLAM研究者中脍炙人口的经典教材。然而就目前来看,还存在两个重要的问题:其一,这些图书的目的在于介绍基础理论,SLAM只是其应用之一。因此,它们并不能算是专门讲解SLAM的书籍。其二,它们的内容偏重于数学理论,基本不涉及编程实现,导致读者经常出现“书能看懂却不会编程”的情况。而我们认为,只有读者亲自实现了算法,调试了各个参数,才能谈得上真正理解了问题本身。
  我们会提及SLAM的历史、理论、算法、现状,并把完整的SLAM系统分成几个模块:视觉里程计、后端优化、建图,以及回环检测。我们将陪着读者一点点实现这些模块中的核心部分,探讨它们在什么情况下有效,什么情况下会出问题,并指导大家在自己的机器上运行这些代码。你会接触到一些必要的数学理论和许多编程知识,会用到Eigen、OpenCV、PCL、g2o、Ceres等库à,掌握它们在Linux操作系统中的使用方法。
  从写作风格上,我们不想把《视觉SLAM十四讲:从理论到实践》写成枯燥的理论书籍。技术类图书应该是严谨可靠的,但严谨不意味着刻板。一本优秀的技术书应该是生动有趣而易于理解的。如果你觉得“这个作者怎么这么不正经”,敬请原谅,因为我并不是一个非常严肃的人。无论如何,有一件事是可以肯定的:只要你对这门新技术感兴趣,在学习《视觉SLAM十四讲:从理论到实践》的过程中肯定会有所收获!您会掌握与SLAM相关的理论知识,你的编程能力也将有明显的进步。在很多时候,您会有一种“我在陪你一起做科研”的感觉,这正是我所希望的。但愿您能在此过程中发现研究的乐趣,喜欢这种“通过一番努力,看到事情顺利运行”的成就感。
  好了,话不多说,祝你旅行愉快!
  如何使用《视觉SLAM十四讲:从理论到实践
  《视觉SLAM十四讲:从理论到实践》名为“视觉SLAM十四讲”。顾名思义,我们会像在学校里讲课那样,以“讲”作为《视觉SLAM十四讲:从理论到实践》的基本单元。每一讲都对应一个固定的主题,其中会穿插“理论部分”和“实践”。如果你完全没有听说过它们,那么应该感到兴奋,这说明你会从《视觉SLAM十四讲:从理论到实践》中收获很多知识。你会经常在脚注中发现一些神奇的东西。
  “实践部分”两种内容。通常是理论部分在前,实践部分在后。在理论部分中,我们将介绍理解算法所必需的数学知识,并且大多数时候以叙述的方式,而不是像数学教科书那样用“定义—定理—推论”的方式,因为我们觉得这样的方式阅读起来更容易一些,尽管有时候显得不那么严谨。实践部分主要是编程实现,讨论程序里各部分的含义及实验结果。看到标题中带有“实践”两个字的章节,你就应该(兴致勃勃地)打开电脑,和我们一起愉快地编写代码了。
  值得一提的是,我们只会把与解决问题相关的数学知识放在书里,并尽量保持浅显。虽然我们是工科生,但也要承认,某些做法只要经验上够用,没必要非得在数学上追求完备。只要我们知道这些算法能够工作,并且数学家们告诉了我们在什么情况下可能不工作,那么我们就表示满意,而不追究那些看似完美但实际复杂冗长的证明(当然它们固有自己的价值)。由于SLAM牵涉到了太多数学背景,为了防止使《视觉SLAM十四讲:从理论到实践》变成数学教科书,我们把一些细节上的推导和证明留作习题和补充阅读材料,方便感兴趣的读者进一步阅读参考文献,更深入地掌握相关细节。
  每一讲正文之后,我们设计了一些习题。其中,带*号的习题是具有一定难度的。我们强烈建议读者把习题都练习一遍,这对你掌握这些知识很有帮助。
  《视觉SLAM十四讲:从理论到实践》内容主要分为两个部分。
  第一部分为数学基础篇,我们会以浅显易懂的方式,铺垫与视觉SLAM相关的数学知识,包括:
  第1讲是前言,介绍这《视觉SLAM十四讲:从理论到实践》的基本信息,习题部分主要包括一些自测题。
  第2讲为SLAM系统概述,介绍一个SLAM系统由哪些模块组成,各模块的
  具体工作是什么。实践部分介绍编程环境的搭建过程以及IDE的使用。
  第3讲介绍三维空间运动,你将接触到旋转矩阵、四元数、欧拉角的相关知识,并且在Eigen当中使用它们。
  第4讲为李群和李代数。即便你现在不懂李代数为何物,也没有关系。你将学到李代数的定义和使用方式,然后通过Sophus操作它们。
  第5讲介绍针孔相机模型以及图像在计算机中的表达。你将用OpenCV来调取相机的内外参数。
  第6讲介绍非线性优化,包括状态估计理论基础、最小二乘问题、梯度下降方法。你会完成一个使用Ceres和g2o进行曲线拟合的实验。
  这些就是我们要用到的所有数学知识了,当然,其中还隐含了你以前学过的高等数学和线性代数。我们保证它们看起来都不会很难。当然,若你想进一步深入挖掘,我们会提供一些参考资料供你阅读,那些材料可能会比正文里讲的知识难一些。它们也可能成为今后相关行业的面试题,或许还能帮你在找工作时留个好印象。
  第二部分为SLAM技术篇。我们会使用第一部分所介绍的理论,讲述视觉SLAM中各个模块的工作原理。
  第7讲为特征点法的视觉里程计。该讲内容比较多,包括特征点的提取与匹配、对极几何约束的计算、PnP和ICP等。在实践中,你将用这些方法去估计两个图像之间的运动。
  第8讲为直接法的视觉里程计。你将学习光流和直接法的原理,然后利用g2o实现一个简单的RGB-D直接法。
  第9讲为视觉里程计的实践章,你将搭建一个视觉里程计框架,综合运用先前学过的知识,实现它的基本功能。这个过程中,你会碰到一些问题,例如优化的必要性、关键帧的选择等。
  第10讲为后端优化,主要为对BundleAdjustment的深入讨论,包括基本的BA,以及如何利用稀疏性加速求解过程。你将用Ceres和g2o分别书写一个BA程序。
  第11讲主要讲后端优化中的位姿图。位姿图是表达关键帧之间约束的一种更紧凑的形式。你将用g2o和gtsam对一个位姿球进行优化。
  第12讲为回环检测,主要介绍以词袋方法为主的回环检测。你将使用dbow3书写字典训练程序和回环检测程序。
  第13讲为地图构建。我们会讨论如何使用单目进行稠密深度图的估计(以及这是多么不可靠),然后讨论RGB-D的稠密地图构建过程。你会书写极线搜索与块匹配的程序,然后在RGB-D中遇到点云地图和八叉树地图的构建问题。
  第14讲主要介绍当前的开源SLAM项目以及未来的发展方向。相信在阅读了前面的知识之后,你会更容易理解它们的原理,实现自己的新想法。
  最后,如果你完全看不懂上面在说什么,那么恭喜你!这《视觉SLAM十四讲:从理论到实践》很适合你!加油!
  代码。《视觉SLAM十四讲:从理论到实践》所有源代码均托管在github上:https://github.com/gaoxiang12/slambook
  强烈建议读者下载它们以供随时查看。代码是按章节划分的,比如,第7讲的内容就会放在ch7文件夹中。此外,对于书中用到的一些小型库,会以压缩包的形式放在3rdparty文件夹下。对于像OpenCV那种大中型库,我们会在它们第一次出现时介绍其安装方法。如果你对代码有任何疑问,请单击GitHub上的Issues按钮,提交问题。如果确实是代码出现问题,我们会及时进行修改;即使是你的理解有偏差,我们也会尽可能回复。如果你不习惯使用Git,那么单击右侧包含download字样的按钮将代码下载至本地即可。
  面向的读者。《视觉SLAM十四讲:从理论到实践》面向对SLAM感兴趣的学生和研究人员。阅读《视觉SLAM十四讲:从理论到实践》需要一定的基础,我们假设你具备以下知识:
  高等数学、线性代数、概率论。这些是大部分读者应该在大学本科阶段接触过的基本数学知识。你应当明白矩阵和向量是什么,或者做微分和积分是什么意思。对于SLAM中用到的专业知识,我们会额外加以介绍。
  C++语言基础。由于我们采用C++作为编码语言,所以建议读者至少熟悉这门语言的语法。比如,你应该知道类是什么,如何使用C++标准库,模板类如何使用,等等。我们会避免过多地使用技巧,但有些地方确实无法避免。此外,我们还使用了一些C++11标准的内容,不过,我们会在用到的地方加以解释。
  Linux基础。我们的开发环境是Linux而非Windows,并且只提供Linux下的源程序,不会再提供Windows下的开发方法介绍。我们认为,掌握Linux是一个SLAM研究人员所必需的,请初学者暂时不要问为什么,把《视觉SLAM十四讲:从理论到实践》的知识学好之后相信你会和我们有同样的想法。各种程序库在Linux下的配置都非常便捷,
  你也会在此过程中体会到Linux的便利。如果读者此前从未使用过Linux,那么最好找一本Linux的教材稍加学习(掌握基本知识即可,一般就是相关图书的前面几章内容)。我们不要求读者具备高超的Linux操作技能,但希望读者至少知道“打开终端,进入代码目录”是如何操作的。本讲的习题里有一些Linux知识自测题,如果你清楚自测题的答案,那么阅读《视觉SLAM十四讲:从理论到实践》代码不会有任何问题。
  对SLAM感兴趣但不具备上述知识的读者,可能在阅读《视觉SLAM十四讲:从理论到实践》时会感到困难。如果你不了解C++的基本知识,可以读一点C++PrimerPlus之类的图书入门;如果你缺少相关的数学知识,也可以先阅读一些相关数学教材补充知识,不过我们认为,对大多数大学本科水平的朋友,读懂《视觉SLAM十四讲:从理论到实践》所需的数学背景肯定是具备了。代码方面,你最好花点时间亲自输入一遍,再调节里面的参数,看看效果会发生怎样的改变。这会对学习很有帮助。
  《视觉SLAM十四讲:从理论到实践》可作为SLAM相关课程的教材,亦可作为课外自学材料使用。
  致谢和声明
  在《视觉SLAM十四讲:从理论到实践》漫长的写作过程中,我们得到了许多人的帮助,包括但不限于:
  中科院的贺一家博士为第5讲的相机模型部分提供了材料。
  颜沁睿提供了第7讲的公式推导材料。
  华中科大的刘毅博士为《视觉SLAM十四讲:从理论到实践》第6讲和第10讲提供了材料。
  众多的老师、同学为《视觉SLAM十四讲:从理论到实践》提供了修改意见:肖锡臻、谢晓佳、耿欣、李帅杰、刘富强、袁梦、孙志明、陈昊升、王京、朱晏辰、丁文东、范帝楷、衡昱帆、高扬、李少朋、吴博、闫雪娇、张腾、郑帆、卢美奇、杨楠,等等。在此向他们表示感谢。
  此外,感谢我的导师张涛教授一直以来对我的支持和帮助。感谢电子工业出版社郑柳洁编辑的支持。没有他们的帮助,《视觉SLAM十四讲:从理论到实践》不可能以现在的面貌来到读者面前。《视觉SLAM十四讲:从理论到实践》的成书与出版是所有人共同努力的结晶,尽管我没法把他们都列在作者列表中,但是它的出版离不开他们的工作。
  《视觉SLAM十四讲:从理论到实践》写作过程中参考了大量文献和论文。其中大部分数学理论知识是前人研究的成果,并非我的原创。一小部分实验设计亦来自各开源代码的演示程序,不过大部分是我自己编写的。此外,也有一些图片摘自公开发表的期刊或会议论文,文中均已注明。
  未做说明的图像,或为原创,或来自网络,恕不一一列举。如有问题,请与我们联系,我们会在第一时间加以修正。
  《视觉SLAM十四讲:从理论到实践》涉及知识点众多,错漏在所难免。如有疑问,欢迎通过电子邮件与我联系。
  感谢我的爱人刘丽莲女士长期的理解和支持。这《视觉SLAM十四讲:从理论到实践》是献给她的。


其他推荐