欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-16 18:02:07
...

前言

之所以想要写这个系列的博客,是因为想要总结一下高博的《SLAM视觉十四讲第二版》的各章内容以及自己对书后习题的一些做法,也算是对自己学习过程的一个总结和回顾。博客分为两个大部分,即读书笔记和课后习题。那么,正式开始!

读书笔记:预备知识

SLAMSimultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动 。如果这里的传感器主要为相机,那就称为“视觉 SLAM”。

关于本书的使用和阅读方法:

2-6讲:数学基础

三维空间运动(3):也就是对相机机器人建模,旋转矩阵,欧拉角,四元数这些概念
李群李代数(4):抽象数学,近世代数的一些内容
相机与图像(5):在计算机中表示,使用OpenCV
非线性优化(6):状态估计问题,非线性最小二乘,曲线拟合问题

7-14讲:实践应用

视觉里程计(7~8):特征点法,ICP算法、PnP、对极几何约束、用来估计相邻图像之间的运动,这是最重要的一块;直接法的OV,光流法和直接法,用g2o方法搞RGBD
后端优化(9~10):BA算法,Ceres和g2o的使用、稀疏性研究;位姿图,因子图,加入关键帧之间的约束关系
回环检测(11):BOW词袋模型,字典训练和回环检验
地图构建(12),单目稠密估计、RGBD的稠密估计,极线搜索和块匹配、点云地图和八叉树地图
设计SLAM系统(13):检验全书的学习效果(逃
SLAM研究展望(14):当前开源方案的总结以及SLAM的未来展望
话说这一讲就是对全书的整体结构做了一个概述,所以也没什么笔记可做的,下面直接进入习题模块!

课后习题

1. 有线性方程 Ax = b,当我们知道 A, b,想要求解 x 时,如何求解?这对 A 和 b 需 要哪些条件?提示:从 A 的维度和秩角度来分析。

答:不妨记A的维度为m×n,同时记A的秩为r。

1.若b≠0,则
当r=m=n时,整个方程存在唯一解;
当r=n<m,即A列满秩,整个方程要么无解要么存在唯一解;
当r=m<n,即A行满秩,整个方程有无穷解;
当r<m,r<n,整个方程要么无解要么存在唯一解。
(b≠0时,方程组为非齐次线性方程组,系数矩阵A与增广矩阵B的秩相当时,即R(A)=R(B)时,方程组有解;
R(A)≠R(B)时,方程组无解;R(A)=R(B)<n时,有无穷解,R(A)=R(B)=n时,有唯一零解.)

2.若b=0,则
当r=n时,整个方程只有解x=0;
当r<n,整个方程有无穷解;
(b=0时,方程组为齐次线性方程组,系数矩阵A的行列式D≠0时,该方程组只有唯一零解,即其秩R(A)=n(n为未知数个数)时;D=0时,方程组有无穷解,即R(A)<n时。)

2. 高斯分布是什么?它的一维形式是什么样子?它的高维形式是什么样子?

答:高斯分布(Gaussian distribution)又称为正态分布(normal distribution),是一个非常常见的连续概率分布

具体参考这篇博客或者直接看*。

3. 你知道 C++ 的类吗?你知道 STL 吗?你使用过它们吗?

答:类是面对对象语言的特性:面对将系统看成通过交互作用来完成特定功能的对象的集合。每个对象用自己的方法来管理数据。也就是说对象内部的代码能够操作对象内部的数据。面向对象编程是C++有别于C的核心,其中类封装了数据和接口使得成为一个整体,方便后期的维护和扩展等。

STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。详情可看这里

4. 你以前怎样书写 C++ 程序?(你完全可以说只在 VC6.0 下写过 C++ 工程,只要你有写 C++ 和 C 语言经验就行。)

答:当然是用宇宙第一IDE :
《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)
现在也常用vscode:
《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)
当然,在ubuntu系统上还是用clion最方便:
《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)

5. 你知道 C++11 标准吗?其中哪些新特性你之前听说过或使用过?有没有其他的标准?

答:C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布 ,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于C++11标准的草案(仅编辑上的修正)。此次标准为C++98发布后13年来第一次重大修正。
下面的韦恩图大致上回答了 C 和 C++ 相关的兼容情况:
《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)
c++11可以说是更“现代”的C++,有很多新的语法,例如:nullptr 与 constexpr,auto 与 decltype ,基于范围的 for 循环,Lambda 表达式智能指针和新的容器等等。

6. 你知道 Linux 吗?你有没有至少使用过其中之一(安卓不算),比如 Ubuntu?

答:linux的最佳入门书当属《鸟哥的linux私房菜》。ubuntu正是我正在使用的linux发行版。

7. Linux 的目录结构是什么样的?你知道哪些基本命令,比如 ls, cat 等等?

答:linux是树状目录结构:《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)
目录结构参考
ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。
语法:

ls(选项)(参数)

选项:

-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。

参数:

目录:指定要显示列表的目录,也可以是具体的文件。

cat命令用于连接文件打印到输出设备中,cat是Linux的基本文本输出命令,通常用于查看文件内容。

作用:连接多个文件并且打印到屏幕输出,或者重定向到其他文件,也可以用来查看显示单个文件,或者多个文件。

语法

cat (参数)(选项)
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-e : 等价于 -vE。
-A, --show-all:等价于 -vET。
-t:等价于"-vT"选项;

cat主要功能:
1、一次显示文件的所有内容 cat filename
2、从磁盘创建一个新文件cat >filename(只能创建新文件不能编辑已有文件)
3、将几个文件合并为一个文件cat file1 file2 > file

8. 如何在 Ubuntu 中安装软件(不打开软件中心的情况下)?这些软件被安装在什么地方?当我只知道模糊的软件名称(比如我想要装一个 eigen 名称的库),我应该如何安装它?

答:如果是在软件源里的软件,三种方式:

  1. 通过sudo apt-get install <软件名>进行安装;
  2. 如果是deb文件则可以下载后双击安装,或下载后在终端执行sudo dpkg -i *.deb;
  3. 编译源码安装,(1 ./configure 2 make 3 sudo make install)

软件被安装在默认路径,一般是/usr或者/opt等,当然也可以自己指定安装的路径。可以用whereis或者which命令查看文件安装路径或者查询运行文件所在路径。

应该google查清楚后再安装(逃

9. * 花一个小时学习一下 Vim,因为你迟早会用它。你可以在终端中输入 vimtutor 阅读一遍所有内容。我们不需要你非常熟练地操作它,只要在学习本书的过程中使用它键入代码即可。不要在它的插件上浪费时间,不要想着把 vim 用成 IDE,我们只用它做文本编辑的工作。

答:可参考我之前的博客