滤波算法与SLAM
第一章:预备知识(均来自视觉SLAM十四讲的三、四讲)
本系列并不面向0基础SLAM小白,默认读者拥有一定的slam和机器人开发经验
至少跑过了基础开源代码如FAST_LIO或ORB-SLAM,理解坐标系变换等基本知识
前言
本章内容包含SLAM基础数学知识,包括旋转矩阵、李群、李代数等
如需要进一步公式推导或更细致的内容,推荐阅读《视觉SLAM十四讲》第三讲和第四讲
一、状态方程与观测方程
定义机器人在
k
k
k时刻的状态为
x
k
x_k
xk,输入为
u
k
u_k
uk,状态噪声为
ω
k
\omega_k
ωk,则状态传递满足:
x
k
+
1
=
f
(
x
k
,
u
k
,
ω
k
)
x_{k+1} = f(x_k,u_k,\omega_k)
xk+1=f(xk,uk,ωk)设机器人在
k
k
k时刻观测到环境中第
j
j
j个路标
y
y
y,观测噪声为
ν
k
,
j
\nu_{k,j}
νk,j,则观测方程定义为:
z
k
,
j
=
h
(
y
j
,
x
k
,
ν
k
,
j
)
z_{k,j} = h(y_j, x_k, \nu_{k,j})
zk,j=h(yj,xk,νk,j)这里的路标在代码中的表现形式取决于传感器的信息维度。如果是相机,则
y
j
y_j
yj实际上代表一个特征点的坐标,如果是雷达,则是三维点。不管如何,其代表的意义都是:真实世界中某一点在传感器坐标系中的投影。
二、齐次坐标
定义三维点 p = [ x , y , z ] T ∈ R 3 p=[x,y,z]^T \in\mathbb R^3 p=[x,y,z]T∈R3,则其具有唯一的齐次坐标 p ~ = [ x , y , z , 1 ] T ∈ R 4 \tilde{p}=[x,y,z,1]^T \in \mathbb R^4 p~=[x,y,z,1]T∈R4
三、刚体变换、相似变换
变换矩阵一般记为
T
T
T,按照《视觉SLAM十四讲》的习惯,记
T
21
T_{21}
T21为坐标系1到坐标系2的变换矩阵。
例如:在通用的场景下,设
p
1
~
,
p
2
~
\tilde{p_1},\tilde{p_2}
p1~,p2~两个点,则有
p
2
~
=
T
21
p
2
~
\tilde{p_2} = T_{21}\tilde{p_2}
p2~=T21p2~
在多传感器融合的场景下,
T
L
C
T_{LC}
TLC也可代表相机到雷达的外参矩阵
在先验地图定位的场景下,
T
k
0
T_{k0}
Tk0也可代表k时刻机器人在地图中的位姿,虽然一般这种情况论文中会记为
T
0
k
T_0^k
T0k
具体地,
T
T
T一般可以写为
T
=
[
R
t
0
1
]
∈
S
E
(
3
)
T=\begin{bmatrix} R&t\\ 0&1\\ \end{bmatrix}\in SE(3)
T=[R0t1]∈SE(3)
其中
R
,
t
R,t
R,t分别代表旋转矩阵和平移向量,满足
R
∈
S
O
(
3
)
,
t
∈
R
3
R\in SO(3), t\in \mathbb R^3
R∈SO(3),t∈R3
则对于
p
2
~
=
T
21
p
2
~
\tilde{p_2} = T_{21}\tilde{p_2}
p2~=T21p2~也可以写为
p
2
=
R
p
1
+
t
p_2=Rp_1+t
p2=Rp1+t
相似变换一般记为
S
S
S,写为
S
=
[
s
R
t
0
1
]
∈
S
i
m
(
3
)
S=\begin{bmatrix} sR&t\\ 0&1\\ \end{bmatrix}\in Sim(3)
S=[sR0t1]∈Sim(3)
在单目视觉SLAM中会常用到,这里不展开
四、升维&降维符号
这里遵循《视觉SLAM十四讲》中对"
∧
\land
∧"符号的定义,对向量
a
=
[
a
1
,
a
2
,
a
3
]
T
a=[a_1,a_2,a_3]^T
a=[a1,a2,a3]T有
a
∧
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
=
A
a^\land = \begin{bmatrix} 0&-a_3&a_2\\ a_3&0&-a_1\\ -a_2&a_1&0\\ \end{bmatrix} =A
a∧=
0a3−a2−a30a1a2−a10
=A
同理的,对“
∨
\vee
∨”满足:
A
∨
=
a
A^\vee=a
A∨=a
这一变换为了方便记住,本文称"
∧
\land
∧"为升维,将
3
∗
1
3*1
3∗1的向量升维到
3
∗
3
3*3
3∗3矩阵,“
∨
\vee
∨”则为降维符号
五、其他的旋转表示方法
1)欧拉角:用XYZ三轴上的旋转角度表示一次旋转,roll-pitch-yaw分别对应X-Y-Z轴上的旋转,存在万向锁的问题,一般不用;
2)旋转向量:用一个单位向量
n
⃗
\vec{n}
n和一个旋转角
θ
\theta
θ表示一次旋转,使用罗德里格旋转公式和旋转矩阵转换:
R
=
c
o
s
θ
⋅
I
+
(
1
−
c
o
s
θ
)
n
⃗
⋅
n
⃗
T
+
s
i
n
θ
⋅
n
⃗
∧
θ
=
a
r
c
c
o
s
t
r
(
R
)
−
1
2
\begin{matrix} R=cos\theta\cdot I+(1-cos\theta)\vec{n}\cdot\vec{n}^T+sin\theta\cdot\vec{n}^\land\\ \\ \theta=arccos\frac{tr(R)-1}{2} \end{matrix}
R=cosθ⋅I+(1−cosθ)n⋅nT+sinθ⋅n∧θ=arccos2tr(R)−1
3)四元数:一般记为
q
=
[
w
,
x
,
y
,
z
]
T
q=[w,x,y,z]^T
q=[w,x,y,z]T,代表一次旋转,亦记为
q
=
[
s
,
v
⃗
]
T
q=[s,\vec{v}]^T
q=[s,v]T。设
q
21
q_{21}
q21代表
R
21
R_{21}
R21对应的四元数,那么
p
2
,
p
1
p_2,p_1
p2,p1满足:
p
2
=
R
21
p
1
=
q
21
p
1
q
21
−
1
p_2=R_{21}p_1=q_{21}p_1q_{21}^{-1}
p2=R21p1=q21p1q21−1
由四元数计算旋转矩阵通过以下公式:
R
=
v
⃗
v
⃗
T
+
s
2
⋅
I
+
2
s
⋅
v
⃗
∧
+
(
v
⃗
∧
)
2
R=\vec{v}\vec{v}^T+s^2\cdot I+2s\cdot \vec{v}^\land +(\vec{v}^\land)^2
R=vvT+s2⋅I+2s⋅v∧+(v∧)2
六、李群&李代数
终于到这里了,最麻烦的内容,简单过一下面试能答点就行
李群的定义可以简单理解为:只对一种运算封闭的集合,叫做李群(但是作为普通SLAM玩家不需要管这些)
对于旋转矩阵
R
R
R,属于李群
S
O
(
3
)
SO(3)
SO(3),满足:
R
1
R
2
∈
S
O
(
3
)
R_1R_2\in SO(3)
R1R2∈SO(3),但是
R
1
+
R
2
∉
S
O
(
3
)
R_1+R_2\notin SO(3)
R1+R2∈/SO(3),同理变换矩阵
T
T
T属于李群
S
E
(
3
)
SE(3)
SE(3)
对于旋转矩阵,定义李代数
ϕ
∈
R
3
\phi\in\mathbb R^3
ϕ∈R3,那么有
R
=
exp
(
ϕ
∧
)
R=\exp(\phi^\land)
R=exp(ϕ∧)这一公式也叫指数变换:已知李代数,求李群
同理有对数变换:已知李群,求李代数
理解起来可能有点乱,代入正常的指数函数就好理解了,知道x,求exp(x)就是对x进行指数变换
就像已知李代数,要对李代数进行指数变换才能得到李群,即:李群=exp(李代数)
李代数的表示类似李群,即:
R
∈
S
O
(
3
)
,
ϕ
∈
s
o
(
3
)
R\in SO(3), \phi\in so(3)
R∈SO(3),ϕ∈so(3),
T
∈
S
E
(
3
)
,
ξ
∈
s
e
(
3
)
T\in SE(3), \xi \in se(3)
T∈SE(3),ξ∈se(3)
李括号用于表示两个李代数的差异性,如果是自身与自身的李括号,则为0(因为没有差别嘛)
七、BCH近似
引入李代数和李群,一个原因是旋转矩阵不满足加减法,只能乘除,李代数则有加减法
如果是简单的指数函数
e
x
e^x
ex,
x
y
=
e
x
+
y
xy=e^{x+y}
xy=ex+y是显而易见的
但是对旋转矩阵是否也满足这个,答案是否定的,所以引入BCH近似,用于表示李群乘法在李代数上的表现
设旋转矩阵
R
R
R对应李代数
ϕ
\phi
ϕ,增加一旋转
Δ
R
\Delta R
ΔR,对应李代数
Δ
ϕ
\Delta \phi
Δϕ
那么对于旋转
Δ
R
⋅
R
\Delta R\cdot R
ΔR⋅R,设其对应的李代数为
ϕ
g
t
\phi_{gt}
ϕgt
则用BCH近似可得
ϕ
g
t
=
J
l
−
1
(
ϕ
)
Δ
ϕ
+
ϕ
\phi_{gt}=J_l^{-1}(\phi)\Delta \phi+\phi
ϕgt=Jl−1(ϕ)Δϕ+ϕ这里的雅可比矩阵与指数映射过程有关
八、李代数求导
设
R
R
R是对点
p
p
p的一次旋转,得到结果
R
p
Rp
Rp,求其对旋转的偏导数,而旋转矩阵并无加减法计算,无法求导,所以转为对李代数求导
回想导数的定义:
d
f
(
x
+
Δ
x
)
d
(
Δ
x
)
=
lim
Δ
x
→
0
f
(
x
+
Δ
x
)
−
f
(
x
)
Δ
x
\frac{df(x+\Delta x)}{d(\Delta x)}=\lim_{\Delta x\rightarrow 0 }\frac{f(x+\Delta x)-f(x)}{\Delta x}
d(Δx)df(x+Δx)=Δx→0limΔxf(x+Δx)−f(x)
而《视觉SLAM十四讲》中提到的左扰动模型,是对旋转左乘一个微小扰动
Δ
R
\Delta R
ΔR,对应的李代数为
Δ
ϕ
\Delta \phi
Δϕ,那么有
∂
R
p
∂
Δ
ϕ
=
lim
Δ
ϕ
→
0
Δ
R
⋅
R
p
−
Δ
R
p
Δ
ϕ
=
lim
Δ
ϕ
→
0
e
x
p
(
Δ
ϕ
∧
)
e
x
p
(
ϕ
∧
)
p
−
e
x
p
(
Δ
ϕ
∧
)
p
Δ
ϕ
\frac{\partial Rp}{\partial\Delta\phi}=\lim_{\Delta \phi\rightarrow 0 }\frac{\Delta R\cdot Rp-\Delta Rp}{\Delta \phi}=\lim_{\Delta \phi\rightarrow 0 }\frac{exp(\Delta\phi^\land)exp(\phi^\land)p-exp(\Delta\phi^\land)p}{\Delta \phi}
∂Δϕ∂Rp=Δϕ→0limΔϕΔR⋅Rp−ΔRp=Δϕ→0limΔϕexp(Δϕ∧)exp(ϕ∧)p−exp(Δϕ∧)p计算过程不复杂,最后结果为
∂
R
p
∂
Δ
ϕ
=
−
(
R
p
)
∧
\frac{\partial Rp}{\partial\Delta\phi}=-(Rp)^\land
∂Δϕ∂Rp=−(Rp)∧
相比直接求导省去一个雅可比矩阵的计算,同样的,对变换矩阵也有:
∂
T
p
∂
Δ
ξ
=
[
I
−
(
R
p
+
t
)
∧
0
T
0
T
]
\frac{\partial Tp}{\partial\Delta\xi}=\begin{bmatrix} I&-(Rp+t)^\land\\ 0^T&0^T\\ \end{bmatrix}
∂Δξ∂Tp=[I0T−(Rp+t)∧0T]