《视觉SLAM十四讲 第二版》笔记及课后习题(第二讲)
读书笔记:初识SLAM
这一讲算是全书的一个大纲,最关键的就是介绍了经典视觉SLAM框架。
小萝卜的例子
小萝卜要解决的问题分为两个:
- 要明白自身的状态 这就是location
- 要明白外在的环境 这就是mapping
对于视觉SLAM而言,熟悉各类相机的优缺点很有必要:
SLAM问题的数学表述:
运动方程和观测方程:
经典视觉SLAM框架:
我们把整个视觉 SLAM 流程分为以下几步:
- 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机
器人中,还可能有码盘、惯性传感器等信息的读取和同步。 - 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动,
以及局部地图的样子。VO 又称为前端(Front End)。 - 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回
环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,
又称为后端(Back End)。 - 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果
检测到回环,它会把信息提供给后端进行处理。 - 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。
课后习题
1. 阅读文献 [1] 和 [14],你能看懂文献的内容吗?
文献[1]主要专注于对基于单目视觉的 SLAM 方法的分析和讨论,介绍了基于滤波、关键帧BA和直接跟踪这三类目前主流的单目 V-SLAM 方法的优缺点并对它们的代表性系统进行性能分析和比较,然后介绍和讨论了 V-SLAM 技术的最新研究热点和发展趋势, 并进行总结和展望。
文献[14]从帧间配准、环形闭合检测以及图优化技术3方面出发, 对基于图优化的SLAM技术进行综述
2. * 阅读 SLAM 的综述文献,例如 [9, 15, 16, 17, 18] 等。这些文献关于 SLAM 的看法 与本书有何异同?
文献[9]将SLAM发展分为三个年代,目前处于鲁棒性时代。
文献[15]大同小异。
文献[16]介绍了拓扑地图,以解决度量地图计算量大的问题。
文献[17]卡尔曼的介绍,
文献[18]分类和介绍视觉SLAM技术的四个主要框架:卡尔曼滤波器(KF)为基础,圆锥滤波器(PF)为基础,基于期望最大化(EM)和基于成员资格的方案.
3. g++ 命令有哪些参数?怎么填写参数可以更改生成的程序文件名?
-
gcc -E source_file.c
-E,只执行到预编译。直接输出预编译结果。 -
gcc -S source_file.c
-S,只执行到源代码到汇编代码的转换,输出汇编代码。 -
gcc -c source_file.c
-c,只执行到编译,输出目标文件。 -
gcc (-E/S/c/) source_file.c -o output_filename
-o, 指定输出文件名,可以配合以上三种标签使用。
-o 参数可以被省略。这种情况下编译器将使用以下默认名称输出:
-E:预编译结果将被输出到标准输出端口(通常是显示器)
-S:生成名为source_file.s的汇编代码
-c:生成名为source_file.o的目标文件。
无标签情况:生成名为a.out的可执行文件。 -
gcc -g source_file.c
-g,生成供调试用的可执行文件,可以在gdb中运行。由于文件中包含了调试信息因此运行效率很低,且文件也大不少。
这里可以用strip命令重新将文件中debug信息删除。这是会发现生成的文件甚至比正常编译的输出更小了,这是因为strip把原先正常编译中的一些额外信息(如函数名之类)也删除了。用法为 strip a.out -
gcc -s source_file.c
-s, 直接生成与运用strip同样效果的可执行文件(删除了所有符号信息)。 -
gcc -O source_file.c
-O(大写的字母O),编译器对代码进行自动优化编译,输出效率更高的可执行文件。
-O 后面还可以跟上数字指定优化级别,如:gcc -O2 source_file.c
,数字越大,越加优化。但是通常情况下,自动的东西都不是太聪明,太大的优化级别可能会使生成的文件产生一系列的bug。一般可选择2;3会有一定风险。 -
gcc -Wall source_file.c
-W,在编译中开启一些额外的警告(warning)信息。-Wall,将所有的警告信息全开。 -
gcc source_file.c -L/path/to/lib -lxxx -I/path/to/include
-l, 指定所使用到的函数库,本例中链接器会尝试链接名为libxxx.a的函数库。
-L,指定函数库所在的文件夹,本例中链接器会尝试搜索/path/to/lib文件夹。
-I, 指定头文件所在的文件夹,本例中预编译器会尝试搜索/path/to/include文件夹。
使用-o来更改生成的文件名,如g++ -o hello hello.cpp
4. 使用 build 文件夹来编译你的 cmake 工程,然后在 Kdevelop 中试试。
5. 刻意在代码中添加一些语法错误,看看编译会生成什么样的信息。你能看懂 g++ 的错误吗?
只要能看懂英语,善用google、 Stack Overflow就大都能看懂(逃
6. 如果忘了把库链接到可执行程序上,编译会报错吗?什么样的错?
undefined reference to …
这是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件。
7. * 阅读《cmake 实践》,了解 cmake 的其他语法。
已看,还是得边用边学才是最有效率的
8. * 完善 hello SLAM 的小程序,把它做成一个小程序库,安装到本地硬盘中。然后,新建一个工程,使用 find_package 找这个库并调用它。
参考本人之前的博客
9. * 寻找其他 cmake 教学材料,深入了解 cmake,例如https://github.com/TheErk/CMake-tutorial。
确实是非常好的教程呀~
10. 寻找 Kdevelop 的官方网站,看看它还有哪些特性。你都用上了吗?
没有用Kdevelop,用的clion
11. 如果你在上一讲学习了 vim,请试试 Kdevelop 的 vim 编辑功能。
用clion也是一样的~