《视觉SLAM十四讲 第二版》笔记及课后习题(第二讲)

读书笔记:初识SLAM

这一讲算是全书的一个大纲,最关键的就是介绍了经典视觉SLAM框架。

小萝卜的例子

小萝卜要解决的问题分为两个:

  1. 要明白自身的状态 这就是location
  2. 要明白外在的环境 这就是mapping

对于视觉SLAM而言,熟悉各类相机的优缺点很有必要:
在这里插入图片描述

SLAM问题的数学表述:

运动方程和观测方程:
在这里插入图片描述

经典视觉SLAM框架:

在这里插入图片描述
我们把整个视觉 SLAM 流程分为以下几步:

  1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机
    器人中,还可能有码盘、惯性传感器等信息的读取和同步。
  2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动,
    以及局部地图的样子。VO 又称为前端(Front End)。
  3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回
    环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,
    又称为后端(Back End)。
  4. 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果
    检测到回环,它会把信息提供给后端进行处理。
  5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

实践部分

slambook的第一版本推荐的是ubuntu14.04,深蓝学院的slam课程使用的是16.04,第二本(本书)中推荐使用ubuntu18.04,其实用什么版本都是没太大关系的。这里使用的是ubuntu16.04。关于ubuntu和windows双系统的安装,有大量的博客可供参考。建议一定要找最新的博客,因为好多的博客都是一些许多年前的陈词烂调,各种分区的划分也非常容易劝退新手,其实在内存动辄8G 16G 的今天,个人感觉swap就没什么必要。最简单的安装方式就是直接选择"与windows共存选项",然后一路傻瓜式安装即可。

关于hello的实践:
这里用的是clion作为IDE,相比KDevelop而言,它的功能更加强大。直接打开ch2文件夹:
在这里插入图片描述
git上的代码没有任何问题。直接编译执行即可:
在这里插入图片描述

课后习题

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++ 命令有哪些参数?怎么填写参数可以更改生成的程序文件名?

  1. gcc -E source_file.c
    -E,只执行到预编译。直接输出预编译结果。

  2. gcc -S source_file.c
    -S,只执行到源代码到汇编代码的转换,输出汇编代码。

  3. gcc -c source_file.c
    -c,只执行到编译,输出目标文件。

  4. gcc (-E/S/c/) source_file.c -o output_filename
    -o, 指定输出文件名,可以配合以上三种标签使用。
    -o 参数可以被省略。这种情况下编译器将使用以下默认名称输出:
    -E:预编译结果将被输出到标准输出端口(通常是显示器)
    -S:生成名为source_file.s的汇编代码
    -c:生成名为source_file.o的目标文件。
    无标签情况:生成名为a.out的可执行文件。

  5. gcc -g source_file.c
    -g,生成供调试用的可执行文件,可以在gdb中运行。由于文件中包含了调试信息因此运行效率很低,且文件也大不少。
    这里可以用strip命令重新将文件中debug信息删除。这是会发现生成的文件甚至比正常编译的输出更小了,这是因为strip把原先正常编译中的一些额外信息(如函数名之类)也删除了。用法为 strip a.out

  6. gcc -s source_file.c
    -s, 直接生成与运用strip同样效果的可执行文件(删除了所有符号信息)。

  7. gcc -O source_file.c
    -O(大写的字母O),编译器对代码进行自动优化编译,输出效率更高的可执行文件。
    -O 后面还可以跟上数字指定优化级别,如:gcc -O2 source_file.c,数字越大,越加优化。但是通常情况下,自动的东西都不是太聪明,太大的优化级别可能会使生成的文件产生一系列的bug。一般可选择2;3会有一定风险。

  8. gcc -Wall source_file.c
    -W,在编译中开启一些额外的警告(warning)信息。-Wall,将所有的警告信息全开。

  9. 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也是一样的~

发布了36 篇原创文章 · 获赞 8 · 访问量 1587

猜你喜欢

转载自blog.csdn.net/weixin_43619346/article/details/103183262
今日推荐