第1讲 预备知识 1
1.1 本书讲什么 1
1.2 如何使用本书 3
1.2.1 组织方式 3
1.2.2 代码 5
1.2.3 面向的读者 6
1.3 风格约定 6
1.4 致谢和声明 7
第2讲 初识SLAM 9
2.1 引子:小萝卜的例子 11
2.2 经典视觉SLAM框架 17
2.2.1 视觉里程计 17
2.2.2 后端优化 19
2.2.3 回环检测 20
2.2.4 建图 21
2.3 SLAM问题的数学表述 22
2.4 实践:编程基础 25
2.4.1 安装Linux操作系统 25
2.4.2 Hello SLAM 27
2.4.3 使用cmake 28
2.4.4 使用库 30
2.4.5 使用IDE 32
第3讲 三维空间刚体运动 37
3.1 旋转矩阵 39
3.1.1 点和向量,坐标系 39
3.1.2 坐标系间的欧氏变换 40
3.1.3 变换矩阵与齐次坐标 42
3.2 实践:Eigen 44
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.1 SO(3)上的指数映射 69
4.2.2 SE(3)上的指数映射 70
4.3 李代数求导与扰动模型 72
4.3.1 BCH公式与近似形式 72
4.3.2 SO(3)李代数上的求导 73
4.3.3 李代数求导 74
4.3.4 扰动模型(左乘) 75
4.3.5 SE(3)上的李代数求导 76
4.4 实践:Sophus 76
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.4 RGB-D相机模型 92
5.2 图像 93
5.3 实践:图像的存取与访问 95
5.3.1 安装OpenCV 95
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 实践:Ceres 115
6.3.1 Ceres简介 116
6.3.2 安装Ceres 116
6.3.3 使用Ceres拟合曲线 117
6.4 实践:g2o 121
6.4.1 图优化理论简介 121
6.4.2 g2o的编译与安装 122
6.4.3 使用g2o拟合曲线 123
6.5 小结 128
第7讲 视觉里程计1 130
7.1 特征点法 132
7.1.1 特征点 132
7.1.2 ORB特征 134
7.1.3 特征匹配 137
7.2 实践:特征提取和匹配 138
7.3 2D-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.7 3D-2D:PnP 157
7.7.1 直接线性变换 158
7.7.2 P3P 159
7.7.3 Bundle Adjustment 161
7.8 实践:求解PnP 165
7.8.1 使用EPnP求解位姿 165
7.8.2 使用BA优化 166
7.9 3D-3D:ICP 172
7.9.1 SVD方法 173
7.9.2 非线性优化方法 175
7.10 实践:求解ICP 176
7.10.1 SVD方法 176
7.10.2 非线性优化方法 178
7.11 小结 180
第8讲 视觉里程计2 182
8.1 直接法的引出 184
8.2 光流(Optical Flow) 185
8.3 实践:LK光流 187
8.3.1 使用TUM公开数据集 187
8.3.2 使用LK光流 188
8.4 直接法(Direct Method) 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.3 Camera类 210
9.1.4 Frame类 212
9.1.5 MapPoint类 213
9.1.6 Map类 213
9.1.7 Config类 214
9.2 基本的VO:特征提取和匹配 216
9.2.1 两两帧的视觉里程计 216
9.2.2 讨论 224
9.3 改进:优化PnP的结果 224
9.4 改进:局部地图 227
9.5 小结 233
第10讲 后端1 235
10.1 概述 237
10.1.1 状态估计的概率解释 237
10.1.2 线性系统和KF 239
10.1.3 非线性系统和EKF 242
10.1.4 EKF的讨论 243
10.2 BA与图优化 245
10.2.1 投影模型和BA代价函数 245
10.2.2 BA的求解 247
10.2.3 稀疏性和边缘化 248
10.2.4 鲁棒核函数 255
10.2.5 小结 256
10.3 实践:g2o 257
10.3.1 BA数据集 257
10.3.2 g2o求解BA 258
10.3.3 求解 262
10.4 实践:Ceres 264
10.4.1 Ceres求解BA 265
10.4.2 求解 267
10.5 小结 269
第11讲 后端2 270
11.1 位姿图(Pose Graph) 271
11.1.1 Pose Graph的意义 271
11.1.2 Pose Graph的优化 272
11.2 实践:位姿图优化 274
11.2.1 g2o原生位姿图 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 实践:gtsam 289
11.4.1 安装gtsam 4.0 289
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.5 RGB-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.1 MonoSLAM 358
14.1.2 PTAM 359
14.1.3 ORB-SLAM 361
14.1.4 LSD-SLAM 363
14.1.5 SVO 364
14.1.6 RTAB-MAP 366
14.1.7 其他 367
14.2 未来的SLAM话题 367
14.2.1 视觉+惯性导航SLAM 367
14.2.2 语义SLAM 369
14.2.3 SLAM的未来 370
附录A 高斯分布的性质 371
附录B ROS入门 374
参考文献 377