一、视觉SLAM十四讲在讲些啥
SLAM:Simultaneous Localization and Mapping 翻译:同时定位
与地图构建
搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。
当特定传感器主要为相机
时,就称为视觉SLAM
二、咋使用这本书
理论+实践
理论部分
第1讲:预备知识,习题可以自测一下自己是否具备相应的学习这本书的最低要求
第2讲:SLAM系统概述,介绍SLAM系统的组成,各个模块的作用;以及编程环境的搭建和IDE的使用
第3讲:三维空间刚体运动,包括旋转矩阵、欧拉角、四元数等
第4讲:李群和李代数,介绍李代数的相关定义和使用方式
第5讲:针孔相机模型以及图像在计算机中的表达,通过OpenCV调用相机内外参数
第6讲:非线性变换,包括状态估计理论基础、最小二乘问题、梯度下降方法等
实践部分
第7讲:特征点法的视觉里程计,包括特征提取与匹配、对极几何约束的计算、PnP和ICP等;用这些方法估计两个图像之间的运动
第8讲:直接法的视觉里程计,包括光流和直接法的原理;实现一个简单的直接发运动估计
第9讲:后端优化,对Bundle Adjustment(BA)的深入讨论,包括基本的BA以及如何利用稀疏性加速求解过程;用Ceres和g2o分别编写BA程序
第10讲:后端优化中的位姿图;使用g2o对一个位姿球进行优化
第11讲:回环检测,以词袋方法为主;使用DBoW3编写字典训练程序和回环检测程序
第12讲:地图构建,使用单目进行稠密深度图的估计(该方法特别不可靠),学习RGB-D的稠密地图构建过程;编写极线搜索和块匹配程序,在RGB-D中进行点云地图和八叉树地图构建
第13讲:工程实践,搭建一个双目视觉里程计框架,运用之前学过的知识进行实现和优化
第14讲:介绍开源SLAM方案和未来发展方向
本书源码下载:slambook2
三、自测习题
1,有线性方程Ax=b,若已知A,b,需要求解x,该如何求解?这对A和b有哪些要求?
提示:从A的维度和秩角度来分析。
答:
2,高斯分布是什么?它的一维形式时什么样子?它的高维形式时什么样子?
答:高斯分布(Gaussian distribution),也称正态分布(Normal distribution)
正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此又称之为钟形曲线。
若随机变量X服从一个数学期望为μ、方差为σ²的正态分布,记为N(μ,σ²)
其概率密度函数为正态分布的数学期望μ决定了其位置,其标准差σ决定了分布的幅度
一维高斯分布(正态分布):
当μ = 0,σ = 1时的正态分布是标准正态分布
import numpy as np
import matplotlib.pyplot as plt
# 高斯函数
def gaussian(x, amplitude, mean, std):
return amplitude * np.exp(-(x - mean) ** 2 / (2 * std ** 2))
# 参数
amplitude = 1 # 高峰值
mean = 0 # 平均值
std = 1 # 标准差
x = np.linspace(-5, 5, 400) # x轴的范围
# 计算高斯函数
y = gaussian(x, amplitude, mean, std)
# 绘图
plt.plot(x, y, color='blue', linewidth=2)
plt.title('Gaussian Function')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
效果图:
二维高斯函数:
二维高斯函数3D展示
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x,y = np.mgrid[-5:5:200j,-5:5:200j]
sigma = 2
z = 1/(2 * np.pi * (sigma**2)) * np.exp(-(x**2+y**2)/(2 * sigma**2))
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow',alpha = 0.9)
plt.show()
效果图如下:
二维高斯函数平面彩色展示
import numpy as np
from matplotlib import pyplot as plt
# 定义二维高斯函数
def gaussian_2d(x, y, amp, x0, y0, sx, sy):
return amp * np.exp(-((x - x0) ** 2 / (2 * sx ** 2) + (y - y0) ** 2 / (2 * sy ** 2)))
# 参数设置
amp, x0, y0, sx, sy = 1, 0, 0, 1, 1 # 高斯函数的参数
# 创建二维网格
x = np.linspace(-5, 5, 200)
y = np.linspace(-5, 5, 200)
x, y = np.meshgrid(x, y)
# 计算高斯函数
gauss_2d = gaussian_2d(x, y, amp, x0, y0, sx, sy)
# 绘制高斯函数
plt.imshow(gauss_2d.T, extent=[x.min(), x.max(), y.min(), y.max()], cmap='viridis')
plt.colorbar()
plt.show()
效果图如下:
二维高斯函数平面灰度图展示
import numpy as np
import matplotlib.pyplot as plt
# 二维高斯函数
def gaussian_2d(x, y, sigma_x, sigma_y, rotation, x_0, y_0, A):
angle = rotation * np.pi / 180
x_shift = x - x_0
y_shift = y - y_0
gauss_expr = A * np.exp(-(x_shift ** 2 / (2 * sigma_x ** 2) + y_shift ** 2 / (2 * sigma_y ** 2)))\
* np.cos(2 * np.pi * rotation) - 2 * np.pi * rotation
return gauss_expr
# 定义二维网格
x = np.linspace(-10, 10, 400)
y = np.linspace(-10, 10, 400)
x, y = np.meshgrid(x, y)
# 高斯参数
sigma_x, sigma_y = 2, 3
rotation = 0 # 旋转角度
x_0, y_0 = 0, 0
A = 1 # 高斯峰值
# 计算高斯函数
z = gaussian_2d(x, y, sigma_x, sigma_y, rotation, x_0, y_0, A)
# 绘图
plt.imshow(z, cmap='gray', extent=[x.min(), x.max(), y.min(), y.max()], origin='lower')
plt.colorbar()
plt.show()
效果图如下:
3,你知道C++中的类吗? 你知道STL吗? 你使用过它们吗?
答:
C++中的类——百度百科
在现实世界中,经常有属于同一类的对象
例如,你的自行车只是世界上很多自行车中的一辆。在面向对象软件中,也有很多共享相同特征的不同的对象:矩形、雇用记录、视频剪辑等。可以利用这些对象的相同特征为它们建立一个集合。而这个集合就称为类。
类是定义同一类所有对象的变量和方法的蓝图或原型
例如,可以建立一个定义包含当前档位等实例变量的自行车类。这个类也定义和提供了实例方法(变档、刹车)的实现。实例变量的值由类的每个实例提供
因此,当你创建自行车类以后,必须在使用之前对它进行实例化
当创建类的实例时,就建立了这种类型的一个对象,然后系统为类定义的实例变量分配内存。然后可以调用对象的实例方法实现一些功能
相同类的实例共享相同的实例方法
除了实例变量和方法,类也可以定义类变量和类方法
可以从类的实例中或者直接从类中访问类变量和方法。类方法只能操作类变量 - 不必访问实例变量或实例方法
标准模板库(Standard Template Library,STL)——百度百科
标准模板库是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器
模板是C++程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库使得C++编程语言在有了同Java一样强大的类库的同时,保有了更大的可扩展性
以前备赛蓝桥杯,刷题OJ的时候经常使用
4,你以前怎样书写C++程序?(你完全可以说只在Visual C++6.0下写过CH+工程只要你有写C++和C语言的经验就行。)
答:我一般用CodeBlocks这个IDE编写C++程序
5,你知道C++11标准吗? 你听说过或用过其中哪些新特性? 有没有其他的标准
答:C++11——百度百科
C++11标准是 ISO/IEC 14882:2011 - Information technology – Programming languages – C++ 的简称
C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布 [2],并于2011年9月出版。
C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)
C++标准程序库的变更(标准库组件的升级;线程支持;多元组类型;散列表;正则表达式;通用智能指针;可扩展的随机数功能;包装引用;多态函数对象包装器;用于元编程的类型属性;用于计算函数对象返回类型的统一方法)
6,你知道Linux吗?你有没有至少使用过一种(不算安卓)操作系统,比如 Ubuntu?
答:知道,玩过CentOS和Ubuntu
7,Linux的目录结构是什么样的? 你知道哪些基本命令,比如 Is,cat等?
答:Linux 目录结构像一棵树一样布局,其中/root
目录是树的主干,其余目录从该树干分支出来
目录主要包含三种类型的文件:
通用文件:通用文件是包含 ASCII 或二进制数据的普通文件。视频、图像、文档等是通用文件的常见示例。
目录文件:在 Linux 中,目录也被归类为作为其他文件类型和目录的存储空间的文件。
设备文件:您可能熟悉看到在 Windows 中插入 USB 时创建的F:或G:驱动器。同样,在 Linux 中,USB 和其他硬件组件表示为/dev/device_id文件。
更多Linux基本操作命令可参考博文:Linux基本操作命令
8,如何在 Ubuntu系统中安装软件(不打开软件中心的情况下)? 这些软件被安装在什么地方? 如果只知道模糊的软件名称(比如想要装一个名称中含有Eigen 的库),应该如何安装它?
答:softname参数为要安装的软件
安装软件命令:sudo apt-get install softname
卸载软件命令:sudo apt-get remove softname
安装的软件默认安装目录为/usr/bin
想要装一个名称中含有Eigen的库,首先搜索包sudo apt search eigen
,然后再下载安装sudo install XXX
即可
9*,花一个小时学习Vim,因为你迟早会用它。你可以在终端中输入vimtutor阅读一遍所有内容。我们不需要你非常熟练地操作它,只要能够在学习本书的过程中使用它输入代码即可。不要在它的插件上浪费时间,不要想着把Vim用成 IDE,我们只用它做文本编辑的工作。
答:好的高博!