文章目录
ch02 初识SLAM
ch02-01 经典视觉SLAM框架

视觉SLAM流程包括以下步骤:
- 传感器信息读取: 在视觉SLAM中主要为相机图像信息的读取和预处理.如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步.
- 视觉里程计(Visual Odometry,VO): 视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子.VO又称为前端(Front End).
视觉里程计不可避免地会出现累积漂移(Accumulating Drift)问题.
- 后端优化 (Optimization): 后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图.由于接在VO之后,又称为后端(Back End).
在视觉 SLAM中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法.
- 回环检测 (Loop Closing): 回环检测判断机器人是否到达过先前的位置.如果检测到回环,它会把信息提供给后端进行处理.
- 建图 (Mapping): 它根据估计的轨迹,建立与任务要求对应的地图.
地图的形式包括度量地图(精确表示地图物体的位置关系)与拓扑地图(更强调地图元素之间的关系)两种.
ch02-02 SLAM问题的数学表述
“小萝卜携带着传感器在环境中运动”,由如下两件事情描述:
- 1.什么是运动 ?我们要考虑从k − 1时刻到 k 时刻,小萝卜的位置 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} 表 示 小 罗 卜 在 k 和 k − 1 时 刻 的 位 置 , 表示小罗卜在k和 k-1 时刻的位置, 表示小罗卜在k和k−1时刻的位置,u_k 表示运动传感器的读数(有时也叫输入) , w k w_k wk 表示运动噪声
- 2.什么是观测 ?假设小萝卜在 k k k时刻于 x_k处探测到了某一个路标y_j,我们要考虑这件事情是如何用数学语言来描述的.
观测方程:
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位置上看到路标点
x
k
x_k
xk,产生的观测数据;
y
j
y_j
yj表示第 j个路标点 ;
v
k
,
j
)
v_{k,j})
vk,j)表示观测噪声
这两个方程描述了最基本的SLAM问题:当知道运动测量的读数u ,以及传感器的读数z 时,如何求解定位问题(估计x )和建图问题(估计 y).这时,我们就把SLAM问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
ch03 三维空间刚体运动
ch03.01 旋转矩阵:点和向量,坐标系
01 向量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[ { a_1\\ a_2\\ a_3 } \right]=a_1e_1+a_2e_2+a_3e_3 a=[e1,e2,e3][a1a2a3]=a1e1+a2e2+a3e3
02 向量的内积与外积
2.1 向量的内积: 描述向量间的投影关系
a
⋅
b
=
a
T
b
=
Σ
i
−
1
3
a
1
b
i
=
∣
a
∣
∣
b
∣
c
o
s
<
a
,
b
>
a\cdot b = a^Tb= \displaystyle \Sigma^3_{i-1}a_1b_i=|a||b|cos<a,b>
a⋅b=aTb=Σi−13a1bi=∣a∣∣b∣cos<a,b>
2.2 向量的外积: 描述向量的旋转

ch03.02 坐标系间的欧氏变换
01:欧式变换:
在欧式变换前后的两个坐标系下,同一个向量的模长和方向不发生改变,是为欧式变换. 一个欧式变换由一个旋转和一个平移组成.
02:旋转矩阵 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
1
,
a
2
,
a
3
]
[a_1,a_2,a_3]
[a1,a2,a3]和
[
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{matrix} a_1\\ a_2\\ a_3\end{matrix} \right] =[e^{’}_1,e^{’}_2,e^{’}_3]\left[\begin{matrix} a^{’}_1\\ a^{’}_2\\ a^{’}_3\end{matrix} \right ]
[e1,e2,e3]⎣⎡a1a2a3⎦⎤=[e1’,e2’,e3’]⎣⎡a1’a2’a3’⎦⎤
等式左右两边同时左乘
[
e
1
T
,
e
2
T
,
e
3
T
]
[e^{T}_1,e^{T}_2,e^{T}_3]
[e1T,e2T,e3T], 得到
[
a
1
a
2
a
3
]
=
[
e
1
T
e
1
’
e
1
T
e
2
’
e
1
T
e
3
’
e
2
T
e
1
’
e
2
T
e
2
’
e
2
T
e
3
’
e
3
T
e
1
’
e
3
T
e
2
’
e
3
T
e
3
’
]
[
a
1
’
a
2
’
a
3
’
]
≜
R
a
′
\left[\begin{matrix} a_1\\ a_2\\ a_3\end{matrix} \right] = \left[\begin{matrix} e^{T}_1e^{’}_1 &e^{T}_1e^{’}_2 &e^{T}_1e^{’}_3 \\ e^{T}_2e^{’}_1 &e^{T}_2e^{’}_2 &e^{T}_2e^{’}_3\\ e^{T}_3e^{’}_1 &e^{T}_3e^{’}_2 &e^{T}_3e^{’}_3 \end{matrix} \right] \left[\begin{matrix} a^{’}_1\\ a^{’}_2\\ a^{’}_3 \end{matrix} \right] \triangleq Ra^{'}
⎣⎡a1a2a3⎦⎤=⎣⎡e1Te1’e2Te1’e3Te1’e1Te2’e2Te2’e3Te2’e1Te3’e2Te3’e3Te3’⎦⎤⎣⎡a1’a2’a3’⎦⎤≜Ra′
矩阵$ R$描述了旋转,称为旋转矩阵.
03 旋转矩阵 R R R 的性质
旋转矩阵是**行列式为1的正交矩阵,**任何行列式为1的正交矩阵也是一个旋转矩阵.所有旋转矩阵构成特殊正交群
S
O
SO
SO:
S
O
(
n
)
=
{
R
∈
R
n
x
n
∣
R
R
T
=
I
,
d
e
t
(
R
)
=
I
}
SO(n) = \{ R\in \mathbb{R}^{nxn}|RR^{T} = I, det(R) = I \}
SO(n)={R∈Rnxn∣RRT=I,det(R)=I}
旋转矩阵是正交矩阵(其转置等于其逆),旋转矩阵的逆
R
−
1
R^{-1}
R−1 (即转置
R
T
R^{T}
RT )描述了一个相反的旋转.
04 欧式变换的向量表示:
世界坐标系中的向量a,经过一次旋转(用旋转矩阵
R
R
R描述)和一次平移(用平移向量
t
t
t描述)后,得到了
a
’
a^{’}
a’
a
’
=
R
a
+
t
a^{’} = Ra+t
a’=Ra+t
ch03.03 变换矩阵与齐次坐标
01变换矩阵 T T T:
在三维向量的末尾添加1,构成的四维向量称为齐次坐标.将旋转和平移写入变换矩阵
T
T
T中,得到:
[
a
’
1
]
=
[
R
t
0
1
]
≜
T
[
a
1
]
\left[\begin{matrix} a^{’} \\ 1\end{matrix} \right] = \left[\begin{matrix} R &t \\0 &1\end{matrix} \right] \triangleq T \left[\begin{matrix} a \\ 1\end{matrix} \right]
[a’1]=[R0t1]≜T[a1]
齐次坐标的意义在于将欧式变换表示为线性关系**.
02变换矩阵 T 的性质:
变换矩阵
T
T
T构成特殊欧式群
S
E
SE
SE
S
E
(
3
)
=
{
T
=
[
R
t
0
1
]
∈
R
4
x
4
∣
R
∈
S
O
(
3
)
,
t
∈
R
3
}
SE(3) =\{ T =\left[\begin{matrix} R &t \\0 &1\end{matrix} \right] \in \mathbb{R}^{4x4}|R\in \mathbb SO(3),t\in \mathbb{R}^{3}\}
SE(3)={T=[R0t1]∈R4x4∣R∈SO(3),t∈R3}
变换矩阵的逆表示一个反向的欧式变换
T
−
1
=
[
R
T
−
R
T
t
0
1
]
T^{-1} = \left[\begin{matrix} R^{T} &-R^{T}t \\0 &1\end{matrix} \right]
T−1=[RT0−RTt1]
ch03.04 齐次坐标(Homogeneous Coordinate)的优势
优势1:方便判断是否在直线或平面上
若点
p
=
{
x
,
y
}
p=\{ x,y\}
p={x,y},在直线
l
=
(
a
,
b
,
c
)
l = (a,b,c)
l=(a,b,c)上,则有:
a
x
+
b
y
+
c
=
[
a
,
b
,
c
]
T
⋅
[
x
,
y
,
1
]
=
l
T
⋅
p
’
=
0
ax+by+c = [a,b,c]^{T}\cdot [x,y,1] = l^T \cdot p^{’} = 0
ax+by+c=[a,b,c]T⋅[x,y,1]=lT⋅p’=0
若点
p
=
{
x
,
y
,
z
}
p=\{ x,y,z\}
p={x,y,z},在平面
A
=
(
a
,
b
,
c
,
d
)
A = (a,b,c,d)
A=(a,b,c,d)上,则有:
a
x
+
b
y
+
c
z
+
d
=
[
a
,
b
,
c
,
d
]
T
⋅
[
x
,
y
,
z
,
1
]
=
A
T
⋅
p
’
=
0
ax+by+cz+d = [a,b,c,d]^{T}\cdot [x,y,z,1] = A^T \cdot p^{’} = 0
ax+by+cz+d=[a,b,c,d]T⋅[x,y,z,1]=AT⋅p’=0
优势2:方便表示线线交点和点点共线
在齐次坐标下,
可以用两个点
p
,
q
p,q
p,q的齐次坐标叉乘结果表示它们的共线l
可以用两条直线
l
,
m
l,m
l,m 的齐次坐标叉乘结果表示它们的交点 x

这里利用叉乘的性质: 叉乘结果与两个运算向量都垂直:
性质1的证明:
l
T
⋅
p
=
(
p
×
q
)
⋅
p
=
0
l
T
⋅
q
=
(
p
×
q
)
⋅
q
=
0
l^T \cdot p ={(p \times q) \cdot p}= 0 \\ l^T \cdot q ={(p \times q) \cdot q}= 0
lT⋅p=(p×q)⋅p=0lT⋅q=(p×q)⋅q=0
性质2的证明:
l
T
⋅
p
=
l
T
⋅
(
l
×
m
)
=
0
m
T
⋅
p
=
m
T
⋅
(
l
×
m
)
=
0
l^T \cdot p ={l^T \cdot(l \times m)}= 0 \\ m^T \cdot p ={m^T \cdot(l \times m)}= 0
lT⋅p=lT⋅(l×m)=0mT⋅p=mT⋅(l×m)=0
优势3:能够区分向量和点
点
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的齐次坐标为
(
x
,
y
,
z
,
1
)
(x,y,z,1)
(x,y,z,1)
向量
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的齐次坐标为
(
x
,
y
,
z
,
0
)
(x,y,z,0)
(x,y,z,0)
优势4:能够表达无穷远点
对于平行直线 l = ( a , b , c ) l = (a,b,c) l=(a,b,c)和 m = ( a , b , d ) m=(a,b,d) m=(a,b,d),求取其交点的齐次坐标 x = l × m = ( k b , − k a , 0 ) x=l \times m =(kb,-ka,0) x=l×m=(kb,−ka,0),将其转为非齐次坐标,得到 x = ( k b / 0 , − k a / 0 ) = ( i n f , − i n f ) x=(kb/0,-ka/0) = (inf,-inf) x=(kb/0,−ka/0)=(inf,−inf),这表示无穷远点.
优势5:能够简洁的表示变换
使用齐次坐标,可以将加法运算转化为乘法运算.

ch03.05 旋转向量和欧拉角
01 旋转向量
旋转矩阵的缺点:
- 旋转矩阵有9个量,但一次旋转只有3个自由度,这种表达方式是冗余的.
- 旋转矩阵自带约束(必须是行列式为1的正交矩阵),这些约束会给估计和优化带来困难.
旋转向量: 任意旋转都可以用一个旋转轴和一个旋转角 来刻画.于是,我们可以使用一个向量,其方向表示旋转轴而长度表示旋转角.这种向量称为旋转向量(或轴角,Axis-Angle).
假设有一个旋转轴为$ n$,角度为
θ
\theta
θ的旋转,其对应的旋转向量为
θ
n
\theta n
θn
旋转向量和旋转矩阵之间的转换:罗德里格斯公式
设旋转向量R表示一个绕单位向量n,角度为θ的旋转.
旋转向量到旋转矩阵:
R
=
c
o
s
θ
I
+
(
1
−
c
o
s
θ
)
n
n
T
+
s
i
n
θ
n
∧
R = cos \theta I + (1-cos\theta)nn^{T} + sin\theta n^{\wedge}
R=cosθI+(1−cosθ)nnT+sinθn∧
旋转矩阵到旋转向量:
旋转角 θ = a r c c o s ( ( t r ( R ) − 1 ) / 2 ) \theta =arccos((tr(R)- 1)/2) θ=arccos((tr(R)−1)/2)
旋转轴n是矩阵R RR特征值1对应的特征向量
ch03.06 欧拉角
欧拉角将一次旋转分解成3个分离的转角.常用的一种ZYX转角将任意旋转分解成以下3个轴上的转角:
绕物体的Z轴旋转,得到偏航角yaw
绕旋转之后的Y轴旋转,得到俯仰角pitch
绕旋转之后的X轴旋转,得到滚转角roll
- 欧拉角的一个重大缺点是万向锁问题(奇异性问题): 在俯仰角为$\pm$90° 时,第一次旋转与第三次旋转将使用同一个轴,使得系统丢失了一个自由度(由3次旋转变成了2次旋转).
ch03.07 四元数
为什么需要四元数: 对于三维旋转,找不到不带奇异性的三维向量描述方式.因此引入四元数.四元数是一种扩展的复数,既是紧凑的,也没有奇异性.
01 四元数的定义
1.四元数的定义
一个四元数q qq拥有一个实部和三个虚部
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q = q_0 +q_1 i + q_2 j + q_3 k
q=q0+q1i+q2j+q3k
其中
i
,
j
,
k
i,j,k
i,j,k,为四元数的3个虚部,它们满足以下关系式(自己和自己的运算像复数,自己和别人的运算像叉乘):
i
2
=
j
2
=
k
2
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\begin{array}{rcl} i^2 =j^2 =k^2 = -1 \\ ij =k,ji=-k\\ jk=i,kj=-i \\ ki=j,ik=-j \end{array}
i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
也可以用一个标量和一个向量来表达四元数:
q
=
[
s
,
v
]
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
∈
R
3
x
3
q = [s,v],s =q_0\in \mathbb{R} ,v = [q_1,q_2,q_3]^{T}\in \mathbb{R^{3x3}}
q=[s,v],s=q0∈R,v=[q1,q2,q3]T∈R3x3
s为四元数的实部,v 为四元数的虚部.有实四元数和虚四元数的概念.
2.四元数与旋转角度的关系:
在二维情况下,任意一个旋转都可以用单位复数来描述,乘i ii就是绕i ii轴旋转90°.
在三维情况下,任意一个旋转都可以用单位四元数来描述,乘i ii就是绕i ii轴旋转180°.
3.单位四元数和旋转向量之间的转换:
设单位四元数q 表示一个绕单位向量$ n=[n_x,n_y,n_z]^T$,角度为 θ的旋转.
3.1 从旋转向量到单位四元数:
q
=
[
c
o
s
(
θ
/
2
)
,
n
s
i
n
(
θ
/
2
)
]
T
=
[
c
o
s
(
θ
2
)
,
n
x
s
i
n
(
θ
2
)
,
n
y
s
i
n
(
θ
2
)
,
n
z
s
i
n
(
θ
2
)
]
T
q =[cos(\theta/2),nsin(\theta/2)]^T = [cos(\frac{\theta}{2}),n_xsin(\frac{\theta}{2}),n_ysin(\frac{\theta}{2}),n_zsin(\frac{\theta}{2})]^T
q=[cos(θ/2),nsin(θ/2)]T=[cos(2θ),nxsin(2θ),nysin(2θ),nzsin(2θ)]T
3.2 从单位四元数到旋转向量
{
θ
=
2
a
r
c
cos
(
q
0
)
[
n
x
,
n
y
,
n
z
]
=
[
q
1
,
q
2
,
q
3
]
T
/
s
i
n
(
θ
2
)
\left\{ \begin{aligned} \theta & = 2arc\cos(q_0) \\ \left[n_x,n_y,n_z\right] & = [q_1,q_2,q_3]^T/sin(\frac{\theta}{2}) \\ \end{aligned} \right.
⎩⎨⎧θ[nx,ny,nz]=2arccos(q0)=[q1,q2,q3]T/sin(2θ)
02 用单位四元数表示旋转
给定一个空间三维点$p= [ x , y , z ] ∈ R3 ,p=[x,y,z ] R^3, p=[x,y,z]∈R ^3 $,以及一个由轴角n,θ指定的旋转,三维点p 经过旋转后变为p′.如何使用单位四元数q 表达旋转?
- 把三维空间点用一个虚四元数p 表示:
p = [ 0 , x , y , z ] = [ 0 , v ] p =[0,x,y,z] = [0,v] p=[0,x,y,z]=[0,v]
-
把旋转用单位四元数q qq表示:
q = [ c o s ( θ 2 ) , n s i n ( θ 2 ) q = [cos(\frac{\theta}{2}),nsin(\frac{\theta}{2}) q=[cos(2θ),nsin(2θ) -
旋转后的点 p′ 可表示为:
p ’ = q p q − 1 p^{’} = qpq^{-1} p’=qpq−1
这样得到的点p’ 仍为一个纯虚四元数,其虚部的3个分量表示旋转后3D点的坐标.
只有单位四元数才能表示旋转,因此在程序中创建四元数后,要记得调用normalize()以将其单位化
ch04 李群与李代数
ch04-01 李群与李代数基础
旋转矩阵构成特殊正交群SO(3),变换矩阵构成了特殊欧氏群 SE(3).

1. 群的定义
群(Group)是一种集合加上一种运算的代数结构.把集合记作A AA,运算记作⋅ \cdot⋅ ,那么群可以记作G = ( A , ⋅ ) G =(A,\cdot)G=(A,⋅).群要求这个运算满足如下条件(封结幺逆):
-
封闭性 $ ∀a_1,a_2∈A,a_1⋅a_2∈A. $
-
结合律 $ ∀ a_1,a_2,a_3∈A,(a_1⋅a_2)⋅a_3=a_1⋅(a_2⋅a_3) $
-
幺元 $ ∃ a_0∈A,s.t.∀ a∈A, a_0⋅a=a⋅a_0=a $
-
逆:$ ∀ a∈A,∃ a^{−1}∈ A ,s.t.a⋅a{−1}=a{0}$
李群是指具有连续(光滑)性质的群SO(3)和SE(3)都是李群
2. 李代数的定义
每个李群都有与之对应的李代数,李代数描述了李群的局部性质.
通用的李代数的定义如下:
李代数由一个集合V,一个数域 F 和一个二元运算[ , ] 组成.如果它们满足以下几条性质,则称
(
V
,
F
,
[
,
]
)
(V, F, [, ])
(V,F,[,])为一个李代数,记作$ g $.
-
封闭性: $ ∀ X,Y∈V,[X,Y]∈V. $
-
双线性: $ \forall X,Y,Z \in V, a,b \in F $
[ a X + b Y , Z ] = a [ X , Z ] + b [ Y , Z ] , [ Z , a X + b Y ] = a [ Z , X ] + b [ Z , Y ] [aX+bY,Z]=a[X,Z]+b[Y,Z],[Z,aX+bY]=a[Z,X]+b[Z,Y] [aX+bY,Z]=a[X,Z]+b[Y,Z],[Z,aX+bY]=a[Z,X]+b[Z,Y] -
自反性: $ ∀X,∈V,[X,X]=0. $
-
雅可比等价$ ∀ X,Y,Z∈V,[X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0 . 其 中 的 二 元 运 算 . 其中的二元运算 .其中的二元运算[ , ]$ [,][,]被称为李括号.例如三维向量空间 R 3 \mathbb{R^3} R3 上定义的叉积× \times×是一种李括号.
3. 李代数so(3)
3.1 李群SO(3)对应的李代数so(3)是定义在$ \mathbb{R^3}$ 上的向量,记作
ϕ
\phi
ϕ.
s
o
(
3
)
=
{
ϕ
∈
R
3
,
Φ
=
ϕ
∧
=
a
∧
=
[
0
−
ϕ
3
ϕ
2
ϕ
3
0
−
ϕ
1
−
ϕ
2
ϕ
1
0
]
∈
R
3
x
3
}
so(3)=\{ \phi \in \mathbb R^{3},\Phi=\phi^∧ = {a}^∧ =\left[\begin{matrix} &0 & -\phi_3 &\phi_2 \\ &\phi_3 &0 &-\phi_1 \\ &-\phi_2 & \phi_1 &0\end{matrix} \right] \in \mathbb R^{3x3} \}
so(3)={ϕ∈R3,Φ=ϕ∧=a∧=⎣⎡0ϕ3−ϕ2−ϕ30ϕ1ϕ2−ϕ10⎦⎤∈R3x3}
3.2 李代数so(3)的李括号为
[
ϕ
1
,
ϕ
2
]
=
(
Φ
1
Φ
2
−
Φ
2
Φ
1
)
∨
[\phi_1,\phi_2] = (\Phi_1\Phi_2-\Phi_2\Phi_1)^∨
[ϕ1,ϕ2]=(Φ1Φ2−Φ2Φ1)∨
其中 ∨ 是 ^ 的逆运算,表示将反对称矩阵还原为向量
3.3 so(3)和SO(3)间的映射关系为
- 李群 R = e x p ( ϕ ∧ ) = e x p ( Φ ) R=exp(ϕ^∧)=exp(Φ) R=exp(ϕ∧)=exp(Φ)
- 李代数 ϕ = l n ( R ) ∨ ϕ=ln(R)^∨ ϕ=ln(R)∨
3.4 李代数se(3)
类似地,李群SE(3)的李代数se(3)是定义在
R
6
\mathbb{R^6}
R6上上的向量.记作
ξ
\xi
ξ:
s
e
(
3
)
=
{
ξ
=
[
ρ
,
ϕ
]
∈
R
6
,
ρ
∈
R
3
,
ξ
∧
=
[
0
−
ϕ
3
ϕ
2
ϕ
3
0
−
ϕ
1
−
ϕ
2
ϕ
1
0
]
∈
R
4
x
4
}
se(3)=\{ \xi =\left[{\rho \\, \phi } \right] \in \mathbb R^6,\rho \in \mathbb R^3,\xi ^∧ =\left[\begin{matrix} &0 & -\phi_3 &\phi_2 \\ &\phi_3 &0 &-\phi_1 \\ &-\phi_2 & \phi_1 &0\end{matrix} \right] \in \mathbb R^{4x4} \}
se(3)={ξ=[ρ,ϕ]∈R6,ρ∈R3,ξ∧=⎣⎡0ϕ3−ϕ2−ϕ30ϕ1ϕ2−ϕ10⎦⎤∈R4x4}
se(3)中的每个元素 ξ \xi ξ,是一个六维向量.前三维 ρ \rho ρ表示平移;后三维 ϕ \phi ϕ表示旋转,本质上是so(3)元素.
在这里同样使用^符号将六维向量扩展成为四维矩阵,但不再表示反对称
KaTeX parse error: Expected '}', got '&' at position 41: …atrix}{\phi^ ∧ &̲\rho \\ 0^T ,& …
李代数se(3)的李括号和so(3)类似:
[
ξ
1
,
ξ
2
]
=
(
ξ
1
∧
ξ
2
∧
−
ξ
2
∧
ξ
1
∧
)
∨
[\xi_1,\xi_2] = (\xi_1^{∧}\xi_2^{∧}-\xi_2^{∧}\xi_1^{∧})^∨
[ξ1,ξ2]=(ξ1∧ξ2∧−ξ2∧ξ1∧)∨
se(3)和SE(3)间映射关系为
李群 $ T=exp(ξ∧) $
李代数 $\xi = ln(T) ^{∨} $
ch04-02 李群与李代数的转换关系:指数映射和对数映射
1. SO(3)和so(3)间的转换关系
将三维向量ϕ 分解为其模长θ和方向向量$ \alpha$,即ϕ = θ α .则从so(3)到SO(3)的指数映射可表示为:
R
=
e
x
p
(
ϕ
)
=
e
x
p
(
θ
α
∧
)
=
c
o
s
θ
I
+
(
1
−
c
o
s
θ
)
α
α
T
+
s
i
n
θ
α
∧
R=exp(ϕ)=exp(θα ∧ )=cosθI+(1−cosθ)αα T +sinθα ∧
R=exp(ϕ)=exp(θα∧)=cosθI+(1−cosθ)ααT+sinθα∧
上式即为旋转向量到旋转矩阵的罗德里格斯公式,可见so(3)本质上是旋转向量组成的空间.
从SO(3)到so(3)的对数映射可表示为:
ϕ
=
l
n
(
R
)
V
\phi = ln(R)^{V}
ϕ=ln(R)V
实际计算时可以通过迹的性质分别求出转角θ和转轴α
θ
=
a
r
c
c
o
s
t
r
(
R
)
−
1
2
,
R
α
=
α
θ=arccos \frac{tr(R)−1}{2},Rα=α
θ=arccos2tr(R)−1,Rα=α
2.SE(3)和se(3)间的转换关系
从se(3)到SE(3)的指数映射可表示为:
T
=
e
x
p
(
ξ
∧
)
=
[
R
J
ρ
0
T
,
1
]
T =exp(\xi ^{∧}) =\left[ \begin{matrix} R&J\rho \\ 0^T ,& 1 \end{matrix} \right]
T=exp(ξ∧)=[R0T,Jρ1]
J
=
s
i
n
θ
t
h
e
t
a
I
+
(
1
−
s
i
n
θ
θ
α
α
T
)
+
(
1
−
c
o
s
θ
θ
α
∧
)
J =\frac{sin\theta}{theta}I + (1 - \frac{sin\theta}{\theta}\alpha\alpha^{T}) + (1 - \frac{cos\theta}{\theta}\alpha^{∧})
J=thetasinθI+(1−θsinθααT)+(1−θcosθα∧)
可以看到,平移部分经过指数映射之后,发生了一次以J 为系数矩阵的线性变换.
3. 从SE(3)到se(3)的对数映射可表示为:
ξ = l n ( T ) ∨ \xi =ln(T)^{∨} ξ=ln(T)∨
实际计算时ϕ 可以由SO(3)到so(3)的映射得到,ρ 可以由t = J ρ计算得到.

ch04-03 李代数求导: 引入李代数的一大动机就是方便求导优化
1. 群乘法与李代数加法的关系
BCH公式及其近似形式
-
很遗憾地,李群乘积和李代数加法并不等价,即:
R 1 R 2 = e x p ( ϕ 1 ∧ ) e x p ( ϕ 2 ∧ ) ≠ e x p ( ( ϕ 1 + ϕ 2 ) ∧ ) R_1R_2 =exp(\phi_1^{∧})exp(\phi_2^{∧})\neq exp((ϕ 1 +ϕ 2 ) ∧ ) R1R2=exp(ϕ1∧)exp(ϕ2∧)=exp((ϕ1+ϕ2)∧)
李群乘积与李代数运算的对应关系由BCH公式给出:
l n ( e x p ( A ) e x p ( B ) ) = A + B + 21 [ A , B ] + 121 [ A , [ A , B ] ] − 121 [ B , [ A , B ] ] + . . . ln(exp(A)exp(B))=A+B+ 2 1 [A,B]+ 12 1 [A,[A,B]]− 12 1 [B,[A,B]]+... ln(exp(A)exp(B))=A+B+21[A,B]+121[A,[A,B]]−121[B,[A,B]]+...
上式中[ , ] [,][,]表示李括号运算. -
当 ϕ 1 \phi_1 ϕ1 或ϕ 2 为小量时,可以对BCH公式进行线性近似,得到李群乘积对应的李代数的表达式:
R1⋅R2对应的李代数
= l n ( e x p ( ϕ 1 ∧ ) e x p ( ϕ 1 ∧ ) ) ∨ ≈ J l ( ϕ 2 ) − 1 ϕ 1 + ϕ 2 ( i f ϕ 1 − > m i n ) ≈ J l ( ϕ 1 ) − 1 ϕ 2 + ϕ 1 ( i f ϕ 2 − > m i n ) =ln(exp(ϕ_1^{∧})exp(ϕ_1^{∧}))^{∨} \\\approx {J_l(\phi_2)^{−1}\phi_1+ϕ_2}( if \phi_1->min) \\\approx {J_l(\phi_1)^{−1}\phi_2+ϕ_1}( if \phi_2->min) =ln(exp(ϕ1∧)exp(ϕ1∧))∨≈Jl(ϕ2)−1ϕ1+ϕ2(ifϕ1−>min)≈Jl(ϕ1)−1ϕ2+ϕ1(ifϕ2−>min)
$$
其中左乘雅可比矩阵 J l J_l Jl,即为从SE(3)到se(3)对数映射中的雅可比矩阵
J l = s i n θ θ I + ( 1 − s i n θ θ α α T + 1 − c o s θ θ α ∧ ) J_l = \frac{sin\theta}{\theta}I + (1- \frac{sin\theta}{\theta} \alpha \alpha^{T} +\frac{1-cos\theta}{\theta}\alpha^{∧}) Jl=θsinθI+(1−θsinθααT+θ1−cosθα∧)
其逆为
J
l
−
1
=
θ
2
c
o
t
θ
2
I
+
(
I
−
θ
2
c
o
t
θ
2
)
α
α
T
+
θ
2
α
∧
J_l^{-1} = \frac{\theta}{2}cot\frac{\theta}{2}I+(I-\frac{\theta}{2}cot\frac{\theta}{2})\alpha \alpha^{T} + \frac{\theta}{2}\alpha^{∧}
Jl−1=2θcot2θI+(I−2θcot2θ)ααT+2θα∧
右乘雅可比矩阵只需对自变量取负号即可
J
r
(
ϕ
)
=
J
r
(
−
ϕ
)
J_r(\phi) = J_r(-\phi)
Jr(ϕ)=Jr(−ϕ)
3. 李群SO(3)乘法与李代数so(3)加法的关系:
对旋转R (李代数为ϕ)左乘一个微小旋转ΔR(李代数为Δϕ),得到的旋转李群ΔR⋅R对应的李代数为:
=
l
n
(
e
x
p
(
Δ
ϕ
∧
)
e
x
p
(
Δ
ϕ
∧
)
)
=
ϕ
+
J
l
−
1
(
ϕ
)
Δ
ϕ
=ln(exp(\Delta\phi^{∧})exp(\Delta\phi^{∧})) = \phi+J_l^{-1}(\phi)\Delta \phi
=ln(exp(Δϕ∧)exp(Δϕ∧))=ϕ+Jl−1(ϕ)Δϕ
反之,李代数加法(ϕ+Δϕ)对应的李群元素可表示为:
e
x
p
(
(
ϕ
+
Δ
ϕ
)
∧
)
)
=
e
x
p
(
(
J
l
Δ
ϕ
)
∧
)
e
x
p
(
ϕ
)
∧
)
)
=
e
x
p
(
ϕ
)
∧
e
x
p
(
(
J
r
Δ
ϕ
)
∧
)
exp((\phi+\Delta\phi)^{∧})) =exp(( J_l\Delta \phi)^{∧})exp( \phi)^{∧})) = exp(\ \phi)^{∧}exp((J_r\Delta\phi)^{∧})
exp((ϕ+Δϕ)∧))=exp((JlΔϕ)∧)exp(ϕ)∧))=exp( ϕ)∧exp((JrΔϕ)∧)
4. 同理,李群SE(3)乘法与李代数se(3)加法的关系:
5.
e x p ( Δ ξ ∧ ) e x p ( ξ ∧ ) ≈ e x p ( ( J l − 1 Δ ξ + ξ ) ∧ ) e x p ( ξ ∧ ) e x p ( Δ ξ ∧ ) ≈ e x p ( ( J r − 1 Δ ξ + ξ ) ∧ ) exp(\Delta \xi^{∧})exp( \xi^{∧}) \approx exp((J_l^{-1}\Delta \xi+\xi)^{∧}) \\ exp( \xi^{∧}) exp(\Delta \xi^{∧})\approx exp((J_r^{-1}\Delta \xi+\xi)^{∧}) exp(Δξ∧)exp(ξ∧)≈exp((Jl−1Δξ+ξ)∧)exp(ξ∧)exp(Δξ∧)≈exp((Jr−1Δξ+ξ)∧)
2. SO(3)上的李代数求导
对空间点p进行旋转,得到Rp,旋转之后点的坐标对旋转的导数可表示为:
φ
(
R
p
)
φ
(
R
)
\frac{\varphi(Rp)}{\varphi(R)}
φ(R)φ(Rp)
对于上式的求导,有两种方式:
1.用李代数ϕ表示姿态R,然后根据李代数加法对ϕ 求导.
2.用李代数φ 表示微小扰动∂ R ,然后根据李群左乘对φ 求导.
其中扰动模型表达式简单,更为实用.
李代数求导
用李代数ϕ 表示姿态R,求导得到
φ
(
R
p
)
φ
(
R
)
=
φ
(
e
x
p
(
ϕ
)
∧
p
φ
(
ϕ
)
\frac{\varphi(Rp)}{\varphi(R)} =\frac{\varphi(exp(\phi)^{∧ }p}{\varphi(\phi)}
φ(R)φ(Rp)=φ(ϕ)φ(exp(ϕ)∧p
扰动模型(左乘)
另一种求导方式是对R进行一次左乘扰动∂R,设左乘扰动∂R对应的李代数为φ,对φ求导,得到
φ
(
R
p
)
φ
(
R
)
=
e
x
p
(
(
ϕ
+
φ
)
∧
)
p
−
e
x
p
(
ϕ
∧
)
p
φ
=
−
(
R
p
)
∧
\frac{\varphi(Rp)}{\varphi(R)} =\frac{exp((\phi+\varphi)^{∧})p-exp(\phi^{∧})p}{\varphi} = -(Rp)^{∧}
φ(R)φ(Rp)=φexp((ϕ+φ)∧)p−exp(ϕ∧)p=−(Rp)∧
3. SE(3)上的李代数求导
类似地,空间点p经过变换T得到Tp,给T左乘一个扰动
Δ
T
=
e
x
p
(
δ
ξ
∧
)
\Delta T =exp(\delta \xi^{ ∧ })
ΔT=exp(δξ∧),则有
KaTeX parse error: Undefined control sequence: \matrix at position 43: …(\xi)} =\left[ \̲m̲a̲t̲r̲i̲x̲{I&-(Rp+t)^{∧} …
ch05 相机与图像

ch05-01 针孔相机模型
O−x−y−z为相机坐标系,现实空间点 P 的相机坐标为$[X,Y,Z]^T , 投 影 到 O ′ − x ′ − y ′ 平 面 上 的 点 P ′ , 坐 标 为 ,投影到O ′ − x ′ − y ′ 平面上的点P' ,坐标为 ,投影到O′−x′−y′平面上的点P′,坐标为[X’,Y’,Z’]^T$.
将成像平面对称到相机前方,根据几何相似关系 Z f = X X ′ = Y Y ′ \frac{Z}{f}=\frac{X}{X^{'}}=\frac{Y}{Y^{'}} fZ=X′X=Y′Y ,整理得到投影点P ′ 在投影平面上的坐标 P ′ = [ X ′ , Y ′ ] P'=[X',Y'] P′=[X′,Y′]
{
X
′
=
f
X
Z
Y
′
=
f
Y
Z
\left\{ \begin{aligned} X^{'}=f \frac{X}{Z} \\ Y^{'}=f \frac{Y}{Z} \\ \end{aligned} \right.
⎩⎪⎪⎨⎪⎪⎧X′=fZXY′=fZY
转换得到投影点P ′ 在像素平面上的像素坐标
P
u
,
v
=
[
u
,
v
]
T
P_{u,v} = [u, v]^T
Pu,v=[u,v]T
{
u
=
α
X
′
+
c
x
=
f
x
X
Z
+
c
x
v
=
β
Y
′
+
c
y
=
f
y
Y
Z
+
c
y
\left\{ \begin{aligned} u=\alpha X^{'}+c_{x}=f_x \frac{X}{Z}+c_{x} \\ v=\beta Y^{'}+c_{y}=f_y \frac{Y}{Z} +c_{y}\\ \end{aligned} \right.
⎩⎪⎪⎨⎪⎪⎧u=αX′+cx=fxZX+cxv=βY′+cy=fyZY+cy
其中,
u
,
v
,
c
x
,
c
y
,
f
x
,
f
y
u,v,c_x,c_y,f_x,f_y
u,v,cx,cy,fx,fy的单位为像素,
α
,
β
\alpha, \beta
α,β的单位为像素/米.
将上式写成矩阵形式,得到**现实空间点相机坐标P和投影点像素坐标
P
u
v
∗
∗
P_{uv}**
Puv∗∗之间的关系:
Z
P
u
v
=
[
u
v
1
]
[
x
0
c
x
0
f
y
c
y
0
0
1
]
≜
K
P
ZP_{uv} = \left[ \begin{matrix} u\\ v \\1 \end{matrix} \right] \left[ \begin{matrix} _x & 0 &c_x\\0& f_y &c_y \\0 &0 &1 \end{matrix} \right]\triangleq KP
ZPuv=⎣⎡uv1⎦⎤⎣⎡x000fy0cxcy1⎦⎤≜KP
其中矩阵K称为相机的内参数矩阵.
上式中的P 为现实空间点在相机坐标系下的相机坐标,将其转为世界坐标
p
w
p_w
pw,有
Z
P
u
v
=
K
(
R
P
w
+
t
)
=
K
T
P
w
ZP_{uv}=K(RP_{w}+t) =KTP_{w}
ZPuv=K(RPw+t)=KTPw
因此R ,t (或T )又称为相机的外参数.
将最后一维进行归一化处理,得到点P PP在归一化平面的归一化坐标 $P c = [ X / Z , Y / Z , 1 ] ^T $
P
c
=
P
Z
=
K
−
1
P
u
v
P_c =\frac{P}{Z}=K^{-1}P_{uv}
Pc=ZP=K−1Puv

参数矩阵有内参数K和外参数R,t,其中:
内参数矩阵K体现了归一化相机坐标到像素坐标的变换.
之所以是归一化坐标,这体现了投影性质:在某一条直线上的空间点,最终会投影到同一像素点上.
外参数矩阵R ,t (或T)体现了世界坐标到相机坐标的变换.
ch05-02 畸变模型
畸变包含两种: 径向畸变和切向畸变.
-
径向畸变: 由透镜形状引起,主要包括桶形畸变和枕形畸变.
可以看成坐标点沿着长度方向发生了变化,也就是其距离原点的长度发生了变化.
x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{distorted} =x(1+k_1 r^2 +k_2 r^ 4 + k_3 r^6)\\ y_{distorted} =y(1+k_1 r^2 +k_2 r^ 4 + k_3 r^6) xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
切向畸变: 由透镜和成像平面不严格平行引起.可以看成坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化.
x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y x_{distorted} =x + 2p_1 xy+p_2(r^2 +2x^2)\\ y_{distorted} =y + p_1(r^2 +2y^2) +2p_2 xy xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2y2)+2p2xy
ch05-03 单目相机的成像过程
单目相机的成像过程:
-
- 世界坐标系下有一个固定的原点P,其世界坐标 P w P_w Pw
-
- 由于相机在运动,它的运动由R ,t 或变换矩阵 T ∈ S E ( 3 ) T\in SE(3) T∈SE(3)描述.原点P的相机坐标 P c ′ = R P w + t P_c^{'}=RP_w +t Pc′=RPw+t
-
- 这时 P c ′ P_c^{'} Pc′的分量为X,Y ,Z ,把它们投影到归一化平面Z =1上,得到P 的归一化相机坐标 P c ′ Z = [ X Z , Y Z , 1 ] \frac{P_c^{'}}{Z}=[\frac{X}{Z} ,\frac{Y}{Z},1] ZPc′=[ZX,ZY,1]
-
- 有畸变时,根据畸变参数计算 P c P_c Pc发生畸变后的归一化相机坐标
-
- P的归一化相机坐标经过内参K后,对应到它的像素坐标 P u v = K P c P_{u v }= K P_c Puv=KPc
在讨论相机成像模型时,我们一共谈到了四种坐标: 世界坐标、相机坐标、归一化相机坐标和像素坐标.请读者厘清它们的关系,它反映了整个成像的过程.
ch06 非线性优化
ch06-01 状态估计问题
最大后验与最大似然
SLAM模型由状态方程和运动方程构成:
{
x
k
=
f
(
x
k
−
1
,
u
k
,
w
k
)
z
k
,
j
=
h
(
y
j
,
x
k
,
v
k
,
j
)
\left\{ \begin{aligned} x_{k} =f(x_{k-1},u_k,w_k) \\ z_{k,j} =h(y_j,x_k,v_{k,j})\\ \end{aligned} \right.
{xk=f(xk−1,uk,wk)zk,j=h(yj,xk,vk,j)
通常假设两个噪声项
w
k
,
v
k
,
j
w_k , v_{k,j}
wk,vk,j满足零均值的高斯分布:
w
k
∼
N
(
0
,
R
k
)
,
v
k
,
j
∼
N
(
0
,
Q
k
,
j
)
w_k \sim N(0,R_k),v_{k,j}\sim N(0,Q_{k,j})
wk∼N(0,Rk),vk,j∼N(0,Qk,j)
对机器人的估计,本质上就是已知输入数据u 和观测数据z 的条件下,求机器人位姿x 和路标点y 的条件概率分布:
P
(
x
,
y
∣
z
,
u
)
P(x,y|z,u)
P(x,y∣z,u)
利用贝叶斯法则,有:
P
(
x
,
y
∣
z
,
u
)
=
P
(
z
,
u
∣
x
,
y
)
P
(
z
,
u
)
∝
P
(
z
,
u
∣
x
,
y
)
P
(
x
,
y
)
P(x,y|z,u) = \frac{P(z,u|x,y)}{P(z,u)} \propto {P(z,u|x,y)}{P(x,y)}
P(x,y∣z,u)=P(z,u)P(z,u∣x,y)∝P(z,u∣x,y)P(x,y)
其中,$P(x,y|z,u) $ 为后验概率
P
(
z
,
u
∣
x
,
y
)
{P(z,u|x,y)}
P(z,u∣x,y)为似然
P
(
x
,
y
)
P(x,y)
P(x,y)为先验,上式可表述为后验概 率 ∝ 似 然 ⋅ 先 验 后 直接求后验分布是困难的,但是求一个状态最优估计,使得在该状态下后验概率最大化则是可行的:
(
x
,
y
)
M
L
E
∗
=
a
r
g
m
a
x
P
(
x
,
y
∣
z
,
u
)
(x,y) ^∗_{MLE}=argmaxP(x,y∣z,u)
(x,y)MLE∗=argmaxP(x,y∣z,u)
最大似然估计的直观意义为:在什么样的状态下,最可能产生现在观测到的数据.
ch06-02 最小二乘
基于观测数据z zz的最小二乘
对于某一次观测
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
由于假设噪声$v k , j ∼ N ( 0 , Q k , j )
则
观
测
数
据
则观测数据
则观测数据z_{j,k}$的似然为
P
(
z
j
,
k
∣
x
k
,
y
J
)
=
N
(
h
(
y
j
,
x
k
)
,
Q
k
,
j
)
P(z_{j,k}|x_k,y_J) =N(h(y_j,x_k),Q_{k,j})
P(zj,k∣xk,yJ)=N(h(yj,xk),Qk,j)
将上式代入高斯分布表达式中,并取负对数,得到
(
x
k
,
y
j
)
∗
=
a
r
g
m
a
x
N
(
h
(
y
j
,
x
k
)
,
Q
k
,
j
)
=
a
r
g
m
i
n
(
z
k
,
j
−
h
(
x
k
,
y
j
)
)
T
Q
k
,
j
−
1
(
z
k
,
j
−
h
(
x
k
,
y
j
)
)
(x_k,y_j) ^∗=argmaxN(h(y_j,x_k),Q_{k,j})\\ =arg min(z_{k,j}-h(x_k,y_j))^{T}Q^{-1}_{k,j}(z_{k,j}-h(x_k,y_j))
(xk,yj)∗=argmaxN(h(yj,xk),Qk,j)=argmin(zk,j−h(xk,yj))TQk,j−1(zk,j−h(xk,yj))
上式等价于最小化噪声项(即误差)的一个二次型,其中
Q
k
,
j
−
1
Q^{-1}_{k,j}
Qk,j−1称为信息矩阵,即高斯分布协方差矩阵的逆.
基于观测数据z 和输入数据u 的最小二乘
因为观测z 和输入u 是独立的,因此可对z 和u 的联合似然进行因式分解:
P
(
x
,
y
∣
z
,
u
)
=
∏
k
P
(
u
k
∣
x
k
−
1
,
x
k
)
∏
P
(
z
j
,
k
∣
x
k
,
y
j
)
P(x,y|z,u) =\prod_{k}P(u_k|x_{k-1},x_k) \prod P(z_{j,k}|x_k,y_j)
P(x,y∣z,u)=k∏P(uk∣xk−1,xk)∏P(zj,k∣xk,yj)
定义输入和观测数据与模型之间的误差:
e
u
,
k
=
x
k
−
f
(
x
k
−
1
,
u
k
)
e
z
,
j
,
k
=
z
k
,
j
−
h
(
x
k
,
y
j
)
e_{u,k} =x_k -f(x_{k-1},u_k)\\ e_{z,j,k}=z_{k,j} -h(x_k,y_j)
eu,k=xk−f(xk−1,uk)ez,j,k=zk,j−h(xk,yj)
定义
J
(
x
,
y
)
=
∑
k
e
u
,
k
T
R
k
−
1
e
u
,
k
+
∑
k
∑
j
e
k
,
j
T
Q
k
,
j
−
1
e
z
,
k
,
j
J(x,y)=\sum_k e^{T}_{u,k}R^{-1}_{k}e_{u,k}+\sum_{k}\sum_{j}e^{T}_{k,j}Q^{-1}_{k,j}e_{z,k,j}
J(x,y)=k∑eu,kTRk−1eu,k+k∑j∑ek,jTQk,j−1ez,k,j
则有
(
x
k
,
y
j
)
∗
=
a
r
g
m
i
n
J
(
x
,
y
)
(x_k,y_j) ^∗=argmin J(x,y)
(xk,yj)∗=argminJ(x,y)
ch06-03 非线性最小二乘
对于非线性最小二乘问题:
m
i
n
x
F
(
x
)
=
1
2
∣
∣
f
(
x
)
∣
∣
2
2
min_xF(x) =\frac{1}{2}||f(x)||_2^{2}
minxF(x)=21∣∣f(x)∣∣22
求解该问题的具体步骤如下:
-
- 给定某个初始值 x 0 x_0 x0
-
- 对于第k次迭代,寻找一个增量 Δ x k \Delta x_k Δxk,使得 F ( x k + Δ x k ) F(x_k +\Delta x_k) F(xk+Δxk)达到极小值
-
- 若 Δ x k \Delta x_k Δxk足够小,则停止
-
- 否则 ,令 x k + 1 = x k + Δ x k x_{k +1} =x_k +\Delta x_k xk+1=xk+Δxk,返回第2步 x k + 1 = x k + Δ x k x_{k+1}=x_k+Δx_k xk+1=xk+Δxk,返回第2步
这样,最小二乘问题被转化为一个不断寻找下降增量 Δ x k \Delta x_k Δxk的问题.,具体有以下方法
常见方法有 最速下降法,牛顿法,高斯牛顿法,LM法
1. 一阶梯度法(一阶梯度又称最速下降法)和二阶梯度法(牛顿法)
目标函数
F
(
x
)
F(x)
F(x)在
x
k
x_k
xk附近的Tayor展开
F
(
x
+
Δ
x
k
)
≈
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
+
1
2
Δ
x
k
T
H
(
x
k
)
x
k
F(x+\Delta x_k) \thickapprox F(x_k)+J(x_k)^{T}\Delta x_k +\frac{1}{2} \Delta x_k^{T}H(x_k)x_k
F(x+Δxk)≈F(xk)+J(xk)TΔxk+21ΔxkTH(xk)xk
其中
J
(
x
)
J(x)
J(x)是F(x)关于x的一阶导数矩阵,H(x)是F(x)关于x 的二阶导数矩阵.
其中若
Δ
x
k
\Delta x_k
Δxk 取一阶导数,则
Δ
x
k
∗
=
−
J
(
x
k
)
\Delta x_k ^{*} =-J(x_k)
Δxk∗=−J(xk)
其中若
Δ
x
k
\Delta x_k
Δxk 取2阶导数,则
Δ
x
k
∗
=
a
r
g
m
i
n
(
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
+
1
2
Δ
x
k
T
H
(
x
k
)
x
k
)
\Delta x_k ^{*} =arg min(F(x_k)+J(x_k)^{T}\Delta x_k +\frac{1}{2} \Delta x_k^{T}H(x_k)x_k)
Δxk∗=argmin(F(xk)+J(xk)TΔxk+21ΔxkTH(xk)xk)
令上市对
Δ
x
k
\Delta x_k
Δxk 导数为0,则求得
H
Δ
x
k
=
−
J
H \Delta x_k =-J
HΔxk=−J
2. 高斯牛顿法
将
f
(
x
)
f(x)
f(x)在
X
k
X_k
Xk附近进行泰勒展开 得
f
(
x
k
+
Δ
x
k
)
≈
f
(
x
k
)
+
J
(
x
k
)
Δ
x
k
f(x_k +\Delta x_k)\thickapprox f(x_k) + J(x_k)\Delta x_k
f(xk+Δxk)≈f(xk)+J(xk)Δxk
则
Δ
x
k
∗
=
a
r
g
m
i
n
Δ
x
k
1
2
∣
∣
f
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
∣
∣
2
\Delta x_k ^{*} =arg min_\Delta x_k\frac{1}{2}||f(x_k) + J(x_k)^{T}\Delta x_k||^{2}
Δxk∗=argminΔxk21∣∣f(xk)+J(xk)TΔxk∣∣2
令上式对
Δ
x
\Delta x
Δx的导数为0,得到高斯牛顿方程
J
(
x
k
)
f
(
x
k
)
+
J
(
x
k
)
J
(
x
k
)
T
Δ
x
k
=
0
J(x_k)f(x_k) +J(x_k)J(x_k)^{T}\Delta x_k=0
J(xk)f(xk)+J(xk)J(xk)TΔxk=0
令
H
(
x
)
=
J
(
x
k
)
J
(
x
k
)
T
,
g
(
x
)
=
−
J
(
x
)
f
(
x
)
H(x)=J(x_k)J(x_k)^{T},g(x)=-J(x)f(x)
H(x)=J(xk)J(xk)T,g(x)=−J(x)f(x),则
Δ
x
k
∗
\Delta x_k ^{*}
Δxk∗ 可以取
H
Δ
x
k
=
g
H \Delta x_k =g
HΔxk=g 的解 .
3.列文伯格-马夸尔特方法
泰勒展开只能在展开点附近才有较好的近似效果,因此应给 Δ x \Delta x Δx添加一个范围,称为信赖区域.
定义一个指标
ρ
\rho
ρ刻画这个近似的好坏程度,其分子为实际函数下降的值,分母是近似模型下降的值:
ρ
=
f
(
x
+
Δ
x
)
−
f
(
x
)
J
(
x
)
T
Δ
x
\rho =\frac{f(x+\Delta x)-f(x)}{J(x)^{T} \Delta x}
ρ=J(x)TΔxf(x+Δx)−f(x)
通过调整
ρ
\rho
ρ来确定信赖区域:
若
ρ
\rho
ρ接近1,则近似是最好的.
若
ρ
\rho
ρ太小,说明实际下降的值远小于近似下降的值,则认为近似比较差,需要缩小近似范围.
若
ρ
\rho
ρ太大,说明实际下降的比预计的更大,我们可以放大近似范围.
列文伯格-马夸尔特方法算法步骤如下:
-
step 1:给定初始值 x 0 x_0 x0 ,以及初始优化半径 μ \mu μ
-
step 2:对于第k 次迭代,求解:
m i n Δ x k 1 2 ∣ ∣ f ( x k ) + J ( x k ) T Δ x k ∣ ∣ 2 s.t. ∣ ∣ D Δ x k ∣ ∣ 2 ≤ μ min_{Δx_k} \frac{1}{2}||f(x_k) + J(x_k)^{T}\Delta x_k||^{2} \\ \quad \text{s.t.} ||D\Delta x_k||^2 \leq \mu minΔxk21∣∣f(xk)+J(xk)TΔxk∣∣2s.t.∣∣DΔxk∣∣2≤μ
其中, μ \mu μ是信赖区域的半径,D 为系数矩阵 -
step 3: 计算ρ
-
step 4: ρ > 3 4 \rho > \frac{3}{4} ρ>43 ,则 μ = 2 μ \mu =2\mu μ=2μ
-
step 5: ρ < 1 4 \rho < \frac{1}{4} ρ<41 ,则 μ = 0.5 μ \mu =0.5\mu μ=0.5μ
-
step 6: 若ρ大于某阈值,则认为近似可行.令 x k + 1 = x k + Δ x k x_{k+1}=x_k +\Delta x_k xk+1=xk+Δxk
-
step 7:判断算法是否收敛.如不收敛则返回第2步,否则结束.
在step 2步中
Δ
x
k
\Delta x_k
Δxk的求解要使用拉格朗日乘数法:
L
(
Δ
x
k
,
λ
)
=
1
2
∣
∣
f
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
∣
∣
2
+
λ
2
(
∣
∣
D
Δ
x
k
∣
∣
2
−
μ
)
L(\Delta x_k,\lambda) = \frac{1}{2}||f(x_k) + J(x_k)^{T}\Delta x_k||^{2}+\frac{\lambda}{2}(||D \Delta x_k||^2 -\mu)
L(Δxk,λ)=21∣∣f(xk)+J(xk)TΔxk∣∣2+2λ(∣∣DΔxk∣∣2−μ)
令上式对
Δ
x
k
\Delta x_k
Δxk导数为0,得到
(
H
+
λ
D
T
D
)
Δ
x
k
=
g
(H+\lambda D^TD )\Delta x_k =g
(H+λDTD)Δxk=g
考虑简化形式,即D=I,则相当于求解
(
H
+
λ
I
)
Δ
x
k
=
g
(H+\lambda I )\Delta x_k =g
(H+λI)Δxk=g
当λ较小时,H占主要地位,这说明二次近似模型在该范围内是比较好的,列文伯格-马夸尔特方法更接近于高斯牛顿法.
当λ 比较大时,
λ
I
\lambda I
λI占据主要地位,这说明二次近似模型在该范围内不够好,列文伯格-马夸尔特方法更接近于一阶梯度下降法.
ch07 视觉里程计01
ch07 -01 特征点匹配
特征点:根据特征点匹配计算相机运动
根据特征点匹配计算相机运动.根据相机的成像原理不同,分为以下3种情况:
- 当相机为单目时,我们只知道匹配点的像素坐标,是为2D-2D匹配,使用对极几何求解.以及弹幕初始化的过程。
- 当相机为双目或RGB-D时,我们就知道匹配点的像素坐标和深度坐标,是为3D-3D匹配,使用ICP求解.
- 如果有3D点及其在相机的投影位置,也能估计相机的运动,是为3D-2D匹配,使用PnP求解.
ch07 -02 2D-2D匹配: 对极几何

考虑从两张图像上观测到了同一个3D点,如图所示**。**我们希望可以求解相机两个时刻的运动 R , t R,t R,t。
假设我们要求取两帧图像 I 1 , I 2 I_1,I_2 I1,I2之间的运动,设第一帧到第二帧的运动为R ,t,两个相机中心分别为 O 1 , O 2 O_1,O_2 O1,O2.考虑 I 1 I_1 I1中有一个特征点 p 1 p_1 p1,它在 I 2 I_2 I2中对应着特征点 p 2 p_2 p2.连线$\overrightarrow{O_1 p_1} 和 和 和\overrightarrow{O_2 p_2}$ 在三维空间中交于点P,这时点 O 1 , O 2 , P O_1 ,O_2,P O1,O2,P三个点可以确定一个平面,为极平面. O 1 , O 2 O_1,O_2 O1,O2连线与像平面 I 1 , I 2 I_1,I_2 I1,I2的交点分别为 e 1 , e 2 e_1,e_2 e1,e2, e 1 , e 2 e_1,e_2 e1,e2称为极点, O 1 O 2 O_1O_2 O1O2称为基线,极平面与两个像平面 I 1 , I 2 I_1,I_2 I1,I2之间的相交线 l 1 , l 2 l_1,l_2 l1,l2称为极线.
P
P
P在
I
1
I_1
I1下的线号机坐标为
P
=
[
X
,
Y
,
Z
]
T
P=[X,Y,Z]^{T}
P=[X,Y,Z]T,两个投影像素点
p
1
,
p
2
p_1,p_2
p1,p2 的像素位置满足如下公式:
{
s
1
p
1
=
K
P
s
2
p
2
=
K
(
R
P
+
t
)
\left\{ \begin{aligned}s_1p_1 =KP\\ s_2p_2=K(RP+t)\\ \end{aligned} \right. \\\\
{s1p1=KPs2p2=K(RP+t)
取
p
1
,
p
2
p_1,p_2
p1,p2 的归一化坐标
{
x
1
=
K
−
1
p
1
x
2
=
K
−
1
p
2
\left\{\begin{aligned} x_{1} =K^{-1}p_1\\ x_{2} =K^{-1}p_2\\ \end{aligned}\right.
{x1=K−1p1x2=K−1p2
x 1 , x 2 x_1,x_2 x1,x2是两个像素归一化平面上的坐标。代入上式,得到 x 2 = R x 1 + t x_2=Rx_1 +t x2=Rx1+t
同时左乘
t
∧
t^{ ∧ }
t∧可得:
t
∧
x
2
=
t
∧
R
x
1
t^{ ∧ }x_2=t^{ ∧ }Rx_1
t∧x2=t∧Rx1
同时左乘
x
2
T
x^{T}_2
x2T,可得
x
2
T
t
∧
x
2
=
x
2
T
t
∧
R
x
1
x^{T}_2t^{ ∧ }x_2=x^{T}_2t^{ ∧ }Rx_1
x2Tt∧x2=x2Tt∧Rx1
可得
x
2
T
t
∧
R
x
1
=
0
x^{T}_2t^{ ∧ }Rx_1=0
x2Tt∧Rx1=0
重新带入
p
1
,
p
2
p_1,p_2
p1,p2,可得:
p
2
T
K
−
T
t
∧
R
K
−
1
p
1
=
0
p_2^{T}K^{-T}t^{ ∧ }RK^{-1}p_1=0
p2TK−Tt∧RK−1p1=0
以上俩个式子称为对极约束,定义基础矩阵F和本质矩阵E,可以进一步简化对极约束:
E
=
t
∧
R
F
=
K
−
T
E
K
−
1
x
2
T
E
x
1
=
p
2
T
F
p
1
=
0
E=t^{ ∧ }R \quad \quad \quad F=K^{-T}EK^{-1}\quad \quad \quad x^{T}_2Ex_1=p_2^{T}Fp_1=0
E=t∧RF=K−TEK−1x2TEx1=p2TFp1=0
本质矩阵E 的求解
考虑到E 的尺度等价性,可以用8对点来估计E,是为八点法.
对于一对匹配点,其归一化坐标
x
1
=
[
u
1
,
v
1
,
1
]
,
x
2
=
[
u
2
,
v
2
,
1
]
x_1=[u_1,v_1,1],x_2=[u_2,v_2,1]
x1=[u1,v1,1],x2=[u2,v2,1]根据对极约束,有
(
u
1
,
v
1
,
1
)
[
e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
]
[
u
2
v
2
1
]
=
0
(u_1,v_1,1)\left[ \begin{matrix} e_1 &e_2 &e_3\\e_4 &e_5 &e_6 \\e_7 &e_8 &e_9 \end{matrix} \right]\left[ \begin{matrix} u_2\\v_2\\1\end{matrix} \right]=0
(u1,v1,1)⎣⎡e1e4e7e2e5e8e3e6e9⎦⎤⎣⎡u2v21⎦⎤=0
把矩阵E展开为向量
[
e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
]
T
\left[ \begin{matrix} e_1 &e_2 &e_3 &e_4 &e_5 &e_6 &e_7 &e_8 &e_9 \end{matrix} \right]^{T}
[e1e2e3e4e5e6e7e8e9]T ,对极约束可以写成与e ee有关的线性形式:
[
u
1
u
2
,
u
1
v
2
,
u
1
,
v
1
u
2
,
v
1
v
2
,
v
1
,
u
2
,
v
2
,
1
]
T
.
e
=
0
[u_1u_2,u_1v_2,u_1,v_1u_2,v_1v_2,v_1,u_2,v_2,1]^{T}.e=0
[u1u2,u1v2,u1,v1u2,v1v2,v1,u2,v2,1]T.e=0
把八对点对应的
x
1
,
x
2
x_1,x_2
x1,x2分别代入方程中,得到线性方程组:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9n4lOEh-1629730544222)(../AppData/Roaming/Typora/typora-user-images/1629650165462.png)]](https://i-blog.csdnimg.cn/blog_migrate/d42039dc3112bc6ad4eb7f516fdcbd9e.png)
求得E后,对E进行SVD分解以求取R,t :设E的SVD分解为
E
=
U
∑
V
T
E=U \sum V^T
E=U∑VT则对应的R ,t 分别为:
t
∧
=
U
R
Z
(
π
2
)
∑
U
T
R
=
U
R
Z
T
(
π
2
)
∑
V
T
t^{∧} =U R_Z(\frac{\pi}{2})\sum U^T \quad \quad R=U R^{T}_Z(\frac{\pi}{2})\sum V^T
t∧=URZ(2π)∑UTR=URZT(2π)∑VT
其中
R
Z
(
π
2
)
R_Z(\frac{\pi}{2})
RZ(2π)表示沿Z轴旋转90°得到的旋转矩阵.
对极几何的讨论:
-
-
尺度不确定性: 2D图像不具有深度信息,这导致了单目视觉的尺度不确定性. 实践中设t 为单位1,计算相机运动和和特征点的3D位置,这被称为单目SLAM的初始化.
-
退化问题:当特征的共面或者相机发生纯旋转时,基础矩阵的自由度下降,就出现所谓的退化。实际中数据总是包含一些噪声,这时候继续使用八点法求解基础矩阵,基础矩阵多余出来的自由度将会主要由噪声决定。
为了可以避免退化现象造成的影响,通常在估计基础矩阵F的同时会求解单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵。
-
初始化的纯旋转问题: 若相机发生纯旋转,导致t 为零,得到的E也将为零,会导致我们无从求解R.因此单目初始化不能只有纯旋转,必须要有一定程度的平移.
-
多于8对点的情况:
对于八点法,有 A e = 0 Ae=0 Ae=0,其中A为一个8×9的矩阵.
若匹配点的个数多于8个,A的尺寸变化,上述方程不成立.因此转而求取最小化二次型
m i n e ∣ ∣ A e ∣ ∣ 2 2 = m i n e e T A T A e min_e||Ae||^2_2=min_e e^TA^TAe mine∣∣Ae∣∣22=mineeTATAe
是为最小二乘意义下的E EE矩阵.
-
ch07 -03 3D-2D匹配: PnP(Perspective-n-Point)
2D-2D的对极几何方法需要8个或8个以上的点对(以八点法为例),且存在着初始化、纯旋转和尺度的问题。然而,如果两张图像中其中一张特征点的3D位置已知,那么最少只需3个点对(需要至少一个额外点验证结果)就可以估计相机运动。
在双目或RGB-D的视觉里程计中,我们可以直接使用PnP估计相机运动。而在单目视觉里程计中,必须先进行初始化,然后才能使用PnP。
PnP问题有多种解决方法:
- 直接线性表变换(DLT): 先求解相机位姿,再求解空间点位置
- P3P: 先求解空间点位置,再求解相机位姿
- Bundle Adjustment: 最小化重投影误差,同时求解空间点位置和相机位姿
1. 直接线性变换(DLT): 先求解相机位姿,再求解空间点位置**
考虑某个空间点P的齐次世界坐标为
P
=
(
X
,
Y
,
Z
,
1
)
P = ( X , Y , Z , 1 )
P=(X,Y,Z,1) .在图像
I
1
I_1
I1中投影到特征点的归一化像素坐标
x
1
=
(
u
1
,
v
1
,
1
)
x_1=(u_1,v_1,1)
x1=(u1,v1,1).此时相机的位姿R ,t 是未知的,定义增广矩阵
[
R
∣
t
]
[R|t]
[R∣t](不同于变换矩阵T TT)为一个3×4的矩阵,包含了旋转与平移信息,展开形式如下:
s
(
u
1
v
1
1
)
=
(
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
1
0
t
1
1
t
1
2
)
(
X
Y
Z
1
)
s\left( \begin{matrix} u_1\\v_1\\1\end{matrix} \right)=\left( \begin{matrix}t_1 &t_2 &t_3 &t_4\\t_5 &t_6 &t_7 &t_8\\t_9 &t_10 &t_11&t_12 \end{matrix} \right)\left(\begin{matrix} X\\Y\\Z\\1\end{matrix} \right)
s⎝⎛u1v11⎠⎞=⎝⎛t1t5t9t2t6t10t3t7t11t4t8t12⎠⎞⎝⎜⎜⎛XYZ1⎠⎟⎟⎞
用最后一行把s消去,得到两个约束:
{
t
1
T
P
−
t
3
T
P
u
1
=
0
t
2
T
P
−
t
3
T
P
v
1
=
0
\left\{ \begin{aligned} t^{T}_1P - t^{T}_3Pu_1=0 \\ t^{T}_2P - t^{T}_3Pv_1=0 \end{aligned} \right. \\\\
{t1TP−t3TPu1=0t2TP−t3TPv1=0
其中
t
1
=
(
t
1
,
t
2
,
t
3
,
t
4
)
t_1=(t_1 ,t_2 ,t_3 ,t_4)
t1=(t1,t2,t3,t4),
t
2
=
(
t
5
,
t
6
,
t
7
,
t
8
)
t_2=(t_5 ,t_6 ,t_7 ,t_8)
t2=(t5,t6,t7,t8),
t
3
=
(
t
9
,
t
1
0
,
t
1
1
,
t
1
2
)
t_3=(t_9 ,t_10 ,t_11 ,t_12)
t3=(t9,t10,t11,t12).
t
1
,
t
2
,
t
3
t_1,t_2,t_3
t1,t2,t3为待求量.
将N对匹配的特征点代入方程中,得到线性方程组:
(
P
1
T
0
−
U
1
P
1
T
0
P
1
T
−
U
1
P
1
T
P
N
T
0
−
U
N
P
N
T
0
P
N
T
−
U
N
P
N
T
)
\left( \begin{matrix} P^{T}_1 &0 & -U_1P^{T}_1\\ 0 & P^{T}_1 & -U_1P^{T}_1 \\ P^{T}_N &0 & -U_NP^{T}_N\\ 0 & P^{T}_N &-U_NP^{T}_N\end{matrix} \right)
⎝⎜⎜⎛P1T0PNT00P1T0PNT−U1P1T−U1P1T−UNPNT−UNPNT⎠⎟⎟⎞
只需6对匹配点即可求解增广矩阵[ R ∣ t ] ,若匹配点数多于6对时,可以求最小二乘解.对于求解出的旋转矩阵R,可以通过QR分解等手段将其投影到S E ( 3 ) 上.
2. P3P: 先求解空间点位置,再求解相机位姿
这里要说明的是在场景1中,我们通常输入的是物体在世界坐标系下的3D点以及这些3D点在图像上投影的2D点,因此求得的是相机(相机坐标系)相对于真实物体(世界坐标系)的位姿,如图所示:

而在场景2中,通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是当前帧相对于上一帧的位姿变换,如图所示:

两种情况本质上是相同的,都是基于已知3D点和对应的图像2D点求解相机运动的过程。下面详细探讨P3P的求解过程。
已知3对匹配点的世界坐标A ,B ,C 和投影坐标a ,b ,c ,根据三角形的余弦定理,有
{
O
A
2
+
O
B
2
−
2
O
A
⋅
O
B
⋅
c
o
s
<
a
,
b
>
=
A
B
2
O
B
2
+
O
C
2
−
2
O
B
⋅
O
C
⋅
c
o
s
<
b
,
c
>
=
B
C
2
O
A
2
+
O
C
2
−
2
O
A
⋅
O
C
⋅
c
o
s
<
a
,
c
>
=
A
C
2
\left\{ \begin{aligned} OA^2+OB^2-2OA \cdot OB\cdot cos<a,b>=AB^2 \\ OB^2+OC^2-2OB \cdot OC\cdot cos<b,c>=BC^2 \\ OA^2+OC^2-2OA \cdot OC\cdot cos<a,c>=AC^2 \\ \end{aligned} \right. \\\\
⎩⎪⎨⎪⎧OA2+OB2−2OA⋅OB⋅cos<a,b>=AB2OB2+OC2−2OB⋅OC⋅cos<b,c>=BC2OA2+OC2−2OA⋅OC⋅cos<a,c>=AC2
记
x
=
O
A
/
O
C
,
y
=
O
B
/
O
C
,
u
=
B
C
2
/
A
B
2
,
v
=
A
C
2
/
A
B
2
x=OA/OC,y = OB / OC ,u = BC^2 / AB^2 ,v=AC^2/AB^2
x=OA/OC,y=OB/OC,u=BC2/AB2,v=AC2/AB2
{
(
1
−
u
)
y
2
−
u
x
2
−
c
o
s
<
b
,
c
>
y
+
2
u
x
y
c
o
s
<
a
,
b
>
+
1
=
0
(
1
−
w
)
x
2
−
w
y
2
−
c
o
s
<
a
,
c
>
y
+
2
w
x
y
c
o
s
<
a
,
b
>
+
1
=
0
\left\{ \begin{aligned} (1-u)y^2-ux^2-cos<b,c>y+2uxycos<a,b> + 1=0\\ (1-w)x^2-wy^2-cos<a,c>y+2wxycos<a,b> + 1=0\\ \end{aligned} \right.
{(1−u)y2−ux2−cos<b,c>y+2uxycos<a,b>+1=0(1−w)x2−wy2−cos<a,c>y+2wxycos<a,b>+1=0
上式中,三个余弦角
cos
⟨
a
,
b
⟩
,
cos
⟨
b
,
c
⟩
,
cos
⟨
a
,
c
⟩
\cos \langle a,b \rangle ,\cos \langle b,c \rangle,\cos \langle a,c \rangle
cos⟨a,b⟩,cos⟨b,c⟩,cos⟨a,c⟩以及u uu,v vv是已知的,可以求解出x ,y 进而求解出A ,B ,C 三点的相机坐标.然后根据3D-3D的点对,计算相机的运动R ,t .
3. Bundle Adjustment: 最小化重投影误差,同时求解空间点位置和相机位姿
设相机位姿变换矩阵T ,某空间点的世界坐标
P
i
=
[
X
,
Y
,
Z
]
T
P_i=[X,Y,Z]^T
Pi=[X,Y,Z]T, 其投影的像素坐标为
u
i
=
[
u
i
,
v
i
]
T
u_i=[u_i,v_i]^T
ui=[ui,vi]T ,像素位置与空间点位置的关系如下:
s
i
u
i
=
K
T
P
i
s_iu_i=KTP_i
siui=KTPi
由于相机位姿未知及观测点的噪声,上式存在一个误差,称为重投影误差$ \displaystyle e=u_i-\frac{1}{s_i}KTP_i$因此我们对重投影误差求和,寻找最好的相机位姿和特征点的空间位置,最小化重投影误差:
T
∗
=
a
r
g
m
i
n
T
1
2
∑
i
=
1
n
∣
∣
u
i
−
1
s
i
K
T
P
i
∣
∣
2
P
i
∗
=
a
r
g
m
i
n
P
i
1
2
∑
i
=
1
n
∣
∣
u
i
−
1
s
i
K
T
P
i
∣
∣
2
T^*=\quad argmin_T \frac{1}{2}\sum^n_{i=1}||u_i-\frac{1}{s_i}KTP_i||^2\\ P_i^*=\quad argmin_{P_i} \frac{1}{2}\sum^n_{i=1}||u_i-\frac{1}{s_i}KTP_i||^2
T∗=argminT21i=1∑n∣∣ui−si1KTPi∣∣2Pi∗=argminPi21i=1∑n∣∣ui−si1KTPi∣∣2
使用最小二乘优化,要分别求e对T和P的导数:
e
(
x
+
Δ
x
)
≈
e
(
x
)
+
J
Δ
x
e(x + \Delta x) \approx e(x)+J\Delta x
e(x+Δx)≈e(x)+JΔx
-
求e 对T 的导数:当e为像素坐标误差(2维),x为相机位姿(6维)时,J将是一个2×6的矩阵.我们来推导J的形式:
取中间变量 P ′ = ( T P ) 1 : 3 = [ X ′ , Y ′ , Z ′ ] T P' = (TP)_{1:3}=[X',Y',Z']^T P′=(TP)1:3=[X′,Y′,Z′]T使用李代数求导的扰动模型,对T左乘微小扰动 δ ξ \delta \xi δξ,求导得到:
∂ e ∂ δ ξ = l i m δ ξ = 0 e ( δ ξ ⊕ ξ ) − e ( ξ ) δ ξ = ∂ e ∂ P ‘ ∂ P ‘ ∂ δ ξ \displaystyle\frac{\partial e}{\partial \delta \xi} =lim_{\delta \xi=0} \frac{e(\delta \xi\oplus \xi)-e( \xi)}{\delta \xi} = \frac{\partial e}{\partial {P^{‘}}}\frac{\partial {P^{‘}}}{\partial \delta \xi} ∂δξ∂e=limδξ=0δξe(δξ⊕ξ)−e(ξ)=∂P‘∂e∂δξ∂P‘
其中,$\oplus $ 表示李代数的左乘扰动 ,其中 第一项 $ \displaystyle \frac{\partial e}{\partial P^{‘}}$:该误差表示误差关于投影点的导数:
∂ e ∂ P ‘ = − ( ∂ u ∂ X ‘ ∂ u ∂ Y ‘ ∂ u ∂ Z ‘ ∂ v ∂ X ‘ ∂ v ∂ Y ‘ ∂ v ∂ Z ‘ ) = − ( f x Z ‘ 0 − f x X ‘ Z ‘ 2 0 f y Z ‘ − f x Y ‘ Z ‘ 2 ) \frac{\partial e}{\partial P^{‘}}=-\left( \begin{matrix} \frac{\partial u}{\partial X^{‘}} & \frac{\partial u}{\partial Y^{‘} } &\frac{\partial u}{\partial Z^{‘}}\\ \frac{\partial v}{\partial X^{‘}} & \frac{\partial v}{\partial Y^{‘} } &\frac{\partial v}{\partial Z^{‘}} \end{matrix} \right)=-\left( \begin{matrix} \frac{f_x}{ Z^{‘}} & 0 &-\frac{f_xX^{‘}}{ Z^{‘2}} \\ 0 & \frac{f_y}{ Z^{‘}} &-\frac{f_xY^{‘}}{ Z^{‘2}} \end{matrix} \right) ∂P‘∂e=−(∂X‘∂u∂X‘∂v∂Y‘∂u∂Y‘∂v∂Z‘∂u∂Z‘∂v)=−(Z‘fx00Z‘fy−Z‘2fxX‘−Z‘2fxY‘)
第二项 ∂ P ‘ ∂ δ ξ \displaystyle \frac{\partial {P^{‘}}}{\partial \delta \xi} ∂δξ∂P‘ 为变换后的点关于李代数的导数:
∂ P ‘ ∂ δ ξ = T P ∂ δ ξ = ( T P ) ⨀ = ∂ e ∂ P ‘ = − ( I − P 0 T 0 T ) \displaystyle \frac{\partial {P^{‘}}}{\partial \delta \xi}=\frac{TP}{\partial \delta \xi} =(TP)^{\bigodot} = \frac{\partial e}{\partial P^{‘}}=-\left( \begin{matrix} I &-P \\ 0^T &0^T \end{matrix} \right) ∂δξ∂P‘=∂δξTP=(TP)⨀=∂P‘∂e=−(I0T−P0T)
而在 P ′ P^{'} P′的定义中,取出前3维,于是得到: ∂ P ‘ ∂ δ ξ = T P ∂ δ ξ = ( T P ) ⨀ = [ I , − P ] \displaystyle \frac{\partial {P^{‘}}}{\partial \delta \xi}=\frac{TP}{\partial \delta \xi} =(TP)^{\bigodot} =[I,-P] ∂δξ∂P‘=∂δξTP=(TP)⨀=[I,−P]而
( ) \left( \begin{matrix} \end{matrix} \right) ()
P ′ ∧ = ( 0 Z ′ − Y ′ − Z ′ 0 X ′ Y ′ − X ′ 0 ) P^{'\wedge}= \left( \begin{matrix} 0 &Z^{'} &-Y^{'}\\ -Z^{'} &0 &X^{'}\\ Y^{'} &-X^{'} &0 \end{matrix} \right) P′∧=⎝⎛0−Z′Y′Z′0−X′−Y′X′0⎠⎞将两项相乘,得到了2×6的雅可比矩阵 J T \displaystyle J^T JT,求e 对P的导数可得结果如下:
J T = ∂ e ∂ δ ξ = ( f x Z ‘ 0 − f x X ‘ Z ‘ 2 − f x X ‘ Y ‘ Z ‘ 2 f x + f x X ‘ 2 Z ‘ 2 − f x Y ‘ Z ‘ 0 f Y Z ‘ − f y Y ‘ Z ‘ 2 − f y − f y Y X ‘ 2 Z ‘ 2 f y Y ‘ X ‘ Z ‘ 2 f y X ‘ Z ‘ ) J^T=\frac{\partial e}{\partial \delta \xi} =\displaystyle \left( \begin{matrix} \frac{f_x}{ Z^{‘}} & 0 &-\frac{f_xX^{‘}}{ Z^{‘2}} &-\frac{f_xX^{‘}Y^{‘}}{ Z^{‘2}} & f_x+\frac{f_xX^{‘2}}{ Z^{‘2}} &-\frac{f_xY^{‘}}{ Z^{‘}} \\ 0 &\frac{f_Y}{ Z^{‘}} &-\frac{f_yY^{‘}}{ Z^{‘2}} &-f_y-\frac{f_yYX^{‘2}}{ Z^{‘2}} &\frac{f_yY^{‘}X^{‘}}{ Z^{‘2}} &\frac{f_yX^{‘}}{ Z^{‘}} \end{matrix} \right) JT=∂δξ∂e=(Z‘fx00Z‘fY−Z‘2fxX‘−Z‘2fyY‘−Z‘2fxX‘Y‘−fy−Z‘2fyYX‘2fx+Z‘2fxX‘2Z‘2fyY‘X‘−Z‘fxY‘Z‘fyX‘)**该Jocabi矩阵描述了,重投影误差关于相机位姿李代数的一阶变化关系。**前面有负号的原因是 该误差由观测值减预测值得到。
特征点位置的优化,需要求解e对空间点P的导数,由链式法则可得:
∂ e ∂ P = ∂ e ∂ P ‘ ∂ P ‘ ∂ P \frac{\partial e}{\partial P}=\frac{\partial e}{\partial P^{‘}} \frac{\partial P^{‘}}{\partial P} ∂P∂e=∂P‘∂e∂P∂P‘
第一项误差关于投影点的导数已经得到,关于第二项 ∂ P ‘ ∂ P \displaystyle\frac{\partial P^{‘}}{\partial P} ∂P∂P‘,按照定义
P ‘ = e x p ( ξ ∧ ) P = R P + t P^{‘} =exp(\xi^{\wedge})P=RP+t P‘=exp(ξ∧)P=RP+t
求导后为可得:
P
‘
=
R
P^{‘} =R
P‘=R
所所以
∂
e
∂
P
\displaystyle \frac{\partial e}{\partial P}
∂P∂e为:
∂
e
∂
P
=
−
(
f
x
Z
‘
0
−
f
x
X
‘
Z
‘
2
0
f
y
Z
‘
−
f
x
Y
‘
Z
‘
2
)
\displaystyle \frac{\partial e}{\partial P} = -\left( \begin{matrix} \frac{f_x}{ Z^{‘}} & 0 &-\frac{f_xX^{‘}}{ Z^{‘2}} \\ 0 & \frac{f_y}{ Z^{‘}} &-\frac{f_xY^{‘}}{ Z^{‘2}} \end{matrix} \right)
∂P∂e=−(Z‘fx00Z‘fy−Z‘2fxX‘−Z‘2fxY‘)
小姐:
由以上两个大的步骤我们推导得到 观测相机方程关于相机位姿与特征点的两个导数矩阵。
4.EPnP求解位姿
详细见OPenCV提供的EPnP求PnP问题,然后通过G2O优化求解,见十四讲P165.
ch07 -04 3D-3D匹配: ICP
对于一组已配对好的3D点:
P
=
p
1
,
⋯
,
p
n
,
P
′
=
p
1
′
,
⋯
,
p
n
′
P={p_1,⋯,p_n},P′={p_1′,⋯,p_n′}
P=p1,⋯,pn,P′=p1′,⋯,pn′
现在,想要找一个欧氏变换R ,t ,使得:
∀
i
,
p
i
=
R
p
i
′
+
t
∀ i,p_i=Rp_i′+t
∀i,pi=Rpi′+t
ICP问题的求解包含两种方式:
- 利用线性代数的求解(主要是SVD)
- 利用非线性优化方式的求解(类似于Bundle Adjustment)
1. SVD方法
定义第 i对点的误差项为 e i = p i − ( R p i ′ + t ) e_i = p_i - (R p'_i + t) ei=pi−(Rpi′+t),定义两组点的质心 p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) p = \frac{1}{n} \sum_{i=1}^n (p_i),p' = \frac{1}{n} \sum_{i=1}^n (p'_i) p=n1∑i=1n(pi),p′=n1∑i=1n(pi′)
构建最小二乘问题,求取最合适的 R, t.
m
i
n
R
,
t
J
=
1
2
∣
∣
(
p
i
−
(
(
R
p
i
′
+
t
)
)
)
∣
∣
2
2
=
1
2
∣
∣
(
p
i
−
p
−
R
(
p
i
′
−
p
′
)
∣
∣
2
+
∣
∣
p
−
R
p
′
−
t
∣
∣
2
min_{R,t}J=\frac{1}{2}||(p_i-((R p'_i + t)))||_2^2\\ = \frac{1}{2}||(p_i-p-R (p'_i - p')||^2+||p-Rp'-t||^2
minR,tJ=21∣∣(pi−((Rpi′+t)))∣∣22=21∣∣(pi−p−R(pi′−p′)∣∣2+∣∣p−Rp′−t∣∣2
左边只和旋转矩阵R相关,而右边既有 R也有t,但只和质心相关.因此令左边取最小值解出R,代入到右边令式子等于0求出t.
定义去质心坐标
q
i
=
p
i
−
p
,
q
i
′
=
p
i
′
−
p
′
q i = p i − p , \quad \quad q'_i=p'_i-p'
qi=pi−p,qi′=pi′−p′ 则优化目标可写成:
R
∗
=
m
i
n
R
∑
i
=
1
n
∣
∣
(
p
i
−
p
−
R
(
p
i
′
−
p
′
)
∣
∣
2
=
m
i
n
R
∑
i
=
1
n
−
q
i
T
R
q
i
′
=
−
t
r
(
R
∑
i
=
1
n
q
i
′
q
i
T
)
R^* =min_R \sum ^n_{i=1}||(p_i-p-R (p'_i - p')||^2 \\ =min_R \sum ^n_{i=1}-q_i^TRq_i' \\ =-tr(R \sum ^n_{i=1}q_i'q_i^T)
R∗=minRi=1∑n∣∣(pi−p−R(pi′−p′)∣∣2=minRi=1∑n−qiTRqi′=−tr(Ri=1∑nqi′qiT)
省略数学证明,定义矩阵:
W
=
∑
i
=
1
n
q
i
q
i
′
T
W =\sum ^n_{i=1}q_iq_i^{'T}
W=i=1∑nqiqi′T
对矩阵W WW进行SVD分解得到:
W
=
U
Σ
V
T
W=UΣVT
W=UΣVT
可求解
R
=
U
V
T
R=UV^T
R=UVT
2. 非线性优化方法
使用李代数表达表达位姿,目标函数可以写成
m
i
n
ξ
=
1
2
∑
i
−
1
n
∣
∣
(
p
i
−
e
x
p
(
ξ
∧
)
p
′
)
∣
∣
2
2
min_\xi =\frac{1}{2}\sum^n_{i-1} ||(p_i-exp(\xi^{\wedge})p')||^2_2
minξ=21i−1∑n∣∣(pi−exp(ξ∧)p′)∣∣22
误差项关于位姿的导数可以用李代数求导的扰动模型,计算导数得到:
∂
P
∂
δ
ξ
=
−
(
e
x
p
(
ξ
∧
)
p
i
′
)
⨀
\displaystyle \frac{\partial {P^{}}}{\partial \delta \xi} =-(exp(\xi^{\wedge})p'_i)^{\bigodot}
∂δξ∂P=−(exp(ξ∧)pi′)⨀
对于一组已配对好的3D点:
P
=
p
1
,
⋯
,
p
n
,
P
′
=
p
1
′
,
⋯
,
p
n
′
P={p_1,⋯,p_n},P′={p_1′,⋯,p_n′}
P=p1,⋯,pn,P′=p1′,⋯,pn′
现在,想要找一个欧氏变换R ,t ,使得:
∀
i
,
p
i
=
R
p
i
′
+
t
∀ i,p_i=Rp_i′+t
∀i,pi=Rpi′+t
ICP问题的求解包含两种方式:
- 利用线性代数的求解(主要是SVD)
- 利用非线性优化方式的求解(类似于Bundle Adjustment)
3. SVD方法求解
定义第 i对点的误差项为 e i = p i − ( R p i ′ + t ) e_i = p_i - (R p'_i + t) ei=pi−(Rpi′+t),定义两组点的质心 p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) p = \frac{1}{n} \sum_{i=1}^n (p_i),p' = \frac{1}{n} \sum_{i=1}^n (p'_i) p=n1∑i=1n(pi),p′=n1∑i=1n(pi′)
构建最小二乘问题,求取最合适的 R, t.
m
i
n
R
,
t
J
=
1
2
∣
∣
(
p
i
−
(
(
R
p
i
′
+
t
)
)
)
∣
∣
2
2
=
1
2
∣
∣
(
p
i
−
p
−
R
(
p
i
′
−
p
′
)
∣
∣
2
+
∣
∣
p
−
R
p
′
−
t
∣
∣
2
min_{R,t}J=\frac{1}{2}||(p_i-((R p'_i + t)))||_2^2\\ = \frac{1}{2}||(p_i-p-R (p'_i - p')||^2+||p-Rp'-t||^2
minR,tJ=21∣∣(pi−((Rpi′+t)))∣∣22=21∣∣(pi−p−R(pi′−p′)∣∣2+∣∣p−Rp′−t∣∣2
左边只和旋转矩阵R相关,而右边既有 R也有t,但只和质心相关.因此令左边取最小值解出R,代入到右边令式子等于0求出t.
定义去质心坐标
q
i
=
p
i
−
p
,
q
i
′
=
p
i
′
−
p
′
q i = p i − p , \quad \quad q'_i=p'_i-p'
qi=pi−p,qi′=pi′−p′ 则优化目标可写成:
R
∗
=
m
i
n
R
∑
i
=
1
n
∣
∣
(
p
i
−
p
−
R
(
p
i
′
−
p
′
)
∣
∣
2
=
m
i
n
R
∑
i
=
1
n
−
q
i
T
R
q
i
′
=
−
t
r
(
R
∑
i
=
1
n
q
i
′
q
i
T
)
R^* =min_R \sum ^n_{i=1}||(p_i-p-R (p'_i - p')||^2 \\ =min_R \sum ^n_{i=1}-q_i^TRq_i' \\ =-tr(R \sum ^n_{i=1}q_i'q_i^T)
R∗=minRi=1∑n∣∣(pi−p−R(pi′−p′)∣∣2=minRi=1∑n−qiTRqi′=−tr(Ri=1∑nqi′qiT)
省略数学证明,定义矩阵:
W
=
∑
i
=
1
n
q
i
q
i
′
T
W =\sum ^n_{i=1}q_iq_i^{'T}
W=i=1∑nqiqi′T
对矩阵W WW进行SVD分解得到:
W
=
U
Σ
V
T
W=UΣVT
W=UΣVT
可求解
R
=
U
V
T
R=UV^T
R=UVT
4. 非线性优化方法求解
使用李代数表达表达位姿,目标函数可以写成
m
i
n
ξ
=
1
2
∑
i
−
1
n
∣
∣
(
p
i
−
e
x
p
(
ξ
∧
)
p
′
)
∣
∣
2
2
min_\xi =\frac{1}{2}\sum^n_{i-1} ||(p_i-exp(\xi^{\wedge})p')||^2_2
minξ=21i−1∑n∣∣(pi−exp(ξ∧)p′)∣∣22
误差项关于位姿的导数可以用李代数求导的扰动模型,计算导数得到:
∂
P
∂
δ
ξ
=
−
(
e
x
p
(
ξ
∧
)
p
i
′
)
⨀
\displaystyle \frac{\partial {P^{}}}{\partial \delta \xi} =-(exp(\xi^{\wedge})p'_i)^{\bigodot}
∂δξ∂P=−(exp(ξ∧)pi′)⨀
可以直接使用最小二乘优化方法求解位姿.
本文深入浅出地介绍了视觉SLAM技术,覆盖经典框架、数学表述、三维空间刚体运动、李群李代数、相机模型与图像处理、非线性优化及视觉里程计等内容。通过解析视觉里程计、特征点匹配、PnP问题等关键环节,揭示了SLAM在估计相机运动、地图构建中的核心算法与优化策略。
1407

被折叠的 条评论
为什么被折叠?



