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

前言

之所以想要写这个系列的博客,是因为想要总结一下高博的《SLAM视觉十四讲第二版》的各章内容以及自己对书后习题的一些做法,也算是对自己学习过程的一个总结和回顾。博客分为两个大部分,即读书笔记和课后习题。 博客分为三个部分,即读书笔记,实践部分和课后习题。读书笔记来自于自己的整理以及相关的PPT和书本截图;实践部分就是书中的各章节的具体实践(这一块是坑比较多的,各种调试的问题还有各种库的安装),课后习题部分就是各章的课后习题,当然也参考了一部分其余的博客(站在巨人的肩膀上)。
那么,废话不多说,正式开始!

读书笔记:预备知识

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 :
在这里插入图片描述
现在也常用vscode:
在这里插入图片描述
当然,在ubuntu系统上还是用clion最方便:
在这里插入图片描述

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++ 相关的兼容情况:
在这里插入图片描述
c++11可以说是更“现代”的C++,有很多新的语法,例如:nullptr 与 constexpr,auto 与 decltype ,基于范围的 for 循环,Lambda 表达式智能指针和新的容器等等。

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

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

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

答:linux是树状目录结构:在这里插入图片描述
目录结构参考
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,我们只用它做文本编辑的工作。

答:可参考我之前的博客

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

猜你喜欢

转载自blog.csdn.net/weixin_43619346/article/details/103181076