《视觉SLAM十四讲》笔记摘抄
- ch02 初识SLAM
- ch03 三维空间刚体运动
- ch04 李群与李代数
- ch05 相机与图像
- ch06 非线性优化
- ch07 视觉里程计01
ch02 初识SLAM
经典视觉SLAM框架
视觉SLAM流程包括以下步骤:
-
传感器信息读取: 在视觉SLAM中主要为相机图像信息的读取和预处理.如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步.
-
视觉里程计(Visual Odometry,VO): 视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子.VO又称为前端(Front End).
视觉里程计不可避免地会出现累积漂移(Accumulating Drift)问题.
-
后端优化 (Optimization): 后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图.由于接在VO之后,又称为后端(Back End).
在视觉 SLAM中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法.
-
回环检测 (Loop Closing): 回环检测判断机器人是否到达过先前的位置.如果检测到回环,它会把信息提供给后端进行处理.
-
建图 (Mapping): 它根据估计的轨迹,建立与任务要求对应的地图.
地图的形式包括度量地图(精确表示地图物体的位置关系)与拓扑地图(更强调地图元素之间的关
系)两种.
SLAM问题的数学表述
“小萝卜携带着传感器在环境中运动”,由如下两件事情描述:
-
什么是运动 ?我们要考虑从 k − 1 k-1 k−1时刻到 k k k时刻,小萝卜的位置 x x x是如何变化的.
运动方程:
x k = f ( x k − 1 , u k , w k ) x_k = f(x_{k-1}, u_k, w_k) xk=f(xk−1,uk,wk)
- x k , x k − 1 x_k, x_{k-1} xk,xk−1表示小萝卜在 k k k和 k − 1 k-1 k−1时刻的位置
- u k u_k uk表示运动传感器的读数(有时也叫输入)
- w k w_k wk表示噪声
-
什么是观测 ?假设小萝卜在 k k k时刻于 x k x_k xk处探测到了某一个路标 y j y_j yj,我们要考虑这件事情是如何用数学语言来描述的.
观测方程:
z k , j = h ( y j , x k , v k , j ) z_{k,j} = h(y_j, x_k, v_{k,j}) zk,j=h(yj,xk,vk,j)
- z k , j z_{k,j} zk,j表示小萝卜在 x k x_k xk位置上看到路标点 y j y_j yj,产生的观测数据
- y j y_j yj表示第 j j j个路标点
- v k , j v_{k,j} vk,j表示噪声
这两个方程描述了最基本的SLAM问题:当知道运动测量的读数 u u u ,以及传感器的读数 z z z 时,如何求解定位问题(估计 x x x )和建图问题(估计 y y y)?这时,我们就把SLAM问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
ch03 三维空间刚体运动
旋转矩阵
点和向量,坐标系
-
向量 a a a在线性空间的基 [ e 1 , e 2 , e 3 ] [e_1, e_2, e_3] [e1,e2,e3]下的坐标为 [ a 1 , a 2 , a 3 ] T [a_1, a_2, a_3]^T [a1,a2,a3]T.
a = [ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = a 1 e 1 + a 2 e 2 + a 3 e 3 a = [e_1, e_2, e_3] \left[\begin{array}{c} a_1 \\ a_2 \\ a_3 \end{array}\right] = a_1e_1 + a_2e_2 + a_3e_3 a=[e1,e2,e3]⎣⎡a1a2a3⎦⎤=a1e1+a2e2+a3e3
-
向量的内积与外积
-
向量的内积: 描述向量间的投影关系
a ⋅ b = a T b = ∑ i = 1 3 a i b i = ∣ a ∣ ∣ b ∣ cos ⟨ a , b ⟩ a \cdot b = a^T b = \sum_{i=1}^3 a_ib_i = |a|\,|b| \cos \langle a,b \rangle a⋅b=aTb=i=1∑3aibi=∣a∣∣b∣cos⟨a,b⟩ -
向量的外积: 描述向量的旋转
a × b = [ i j k a 1 a 2 a 3 b 1 b 2 b 3 ] = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b ≜ a ∧ b a \times b = \left[\begin{array}{ccc} i & j & k \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ \end{array}\right] = \left[\begin{array}{c} a_2b_3 - a_3b_2 \\ a_3b_1 - a_1b_3 \\ a_1b_2 - a_2b_1 \end{array}\right] = \left[\begin{array}{ccc} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{array}\right] b \triangleq a ^\wedge b a×b=⎣⎡ia1b1ja2b2ka3b3⎦⎤=⎣⎡a2b3−a3b2a3b1−a1b3a1b2−a2b1⎦⎤=⎣⎡0a3−a2−a30a1a2−a10⎦⎤b≜a∧b其中 a ∧ a^\wedge a∧表示 a a a的反对称矩阵
a ∧ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] a ^\wedge = \left[\begin{array}{ccc} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{array}\right] a∧=⎣⎡0a3−a2−a30a1a2−a10⎦⎤
-
坐标系间的欧氏变换
-
欧式变换:
在欧式变换前后的两个坐标系下,同一个向量的模长和方向不发生改变,是为欧式变换.
一个欧式变换由一个旋转和一个平移组成.
-
旋转矩阵 R R R:
-
旋转矩阵 R R R的推导:
设单位正交基 [ e 1 , e 2 , e 3 ] [e_1, e_2, e_3] [e1,e2,e3]经过一次旋转变成了 [ e 1 ′ , e 2 ′ , e 3 ′ ] [e_1’, e_2’, e_3’] [e1′,e2′,e3′],对于同一个向量 a a a,在两个坐标系下的坐标分别为 [ a 1 , a 2 , a 3 ] T [a_1, a_2, a_3]^T [a1,a2,a3]T和 [ a 1 ′ , a 2 ′ , a 3 ′ ] T [a_1’, a_2’, a_3’]^T [a1′,a2′,a3′]T.根据坐标的定义:
[ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ , e 2 ′ , e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] [e_1, e_2, e_3] \left[\begin{array}{c} a_1 \\ a_2 \\ a_3 \end{array}\right] = [e_1’, e_2’, e_3’] \left[\begin{array}{c} a_1’ \\ a_2’ \\ a_3’ \end{array}\right] [e1,e2,e3]⎣⎡a1a2a3⎦⎤=[e1′,e2′,e3′]⎣⎡a1′a2′a3′⎦⎤等式左右两边同时左乘 [ e 1 T , e 2 T , e 3 T ] T [e_1^T, e_
-