文章目录
在前面的内容里,其实我们已经涉及到了群这一概念。比如三维旋转矩阵就构成了 特殊正交群SO(3),而变换矩阵构成了 特殊欧式群SE(3)
S O ( 3 ) = { R ∈ R 3 × 3 ∣ R R T = I , det ( R ) = 1 } S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } \mathrm{SO}(3)=\left\{R\in\mathbb{R}^{3\times3}\mid RR^T=I,\det(R)=1 \right\} \\ \mathrm{SE}(3)=\left\{T=\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\in\mathbb{R}^{4\times4}\mid R\in\mathrm{SO}(3),t\in\mathbb{R}^3\right\} SO(3)={R∈R3×3∣RRT=I,det(R)=1}SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),t∈R3}
群
群实际上是一种集合 + 一种运算的代数结构,可以理解为一个光滑的弯曲空间。如 G = ( A , ⋅ ) G=(A,\cdot) G=(A,⋅) ,群具有以下几个特性
- 封闭性: ∀ a 1 , a 2 ∈ A , a 1 ⋅ a 2 ∈ A \forall a_1,a_2 \in A,\quad a_1 \cdot a_2 \in A ∀a1,a2∈A,a1⋅a2∈A
- 结合律: ∀ a 1 , a 2 , a 3 ∈ A , ( a 1 ⋅ a 2 ) ⋅ a 3 = a 1 ⋅ ( a 2 ⋅ a 3 ) \forall a_1,a_2,a_3 \in A,\quad (a_1\cdot a_2)\cdot a_3=a_1\cdot(a_2\cdot a_3) ∀a1,a2,a3∈A,(a1⋅a2)⋅a3=a1⋅(a2⋅a3)
- 幺元: ∃ a 0 ∈ A , s.t. ∀ a ∈ A , a 0 ⋅ a = a ⋅ a 0 = a \exist a_0 \in A, \quad\text{s.t.}\quad\forall a\in A,\quad a_0\cdot a=a\cdot a_0=a ∃a0∈A,s.t.∀a∈A,a0⋅a=a⋅a0=a
- 逆: ∀ a ∈ A , ∃ a − 1 ∈ A , s.t. a ⋅ a − 1 = a 0 \forall a \in A,\quad \exist a^{-1}\in A,\quad \text{s.t.} \quad a\cdot a^{-1}=a_0 ∀a∈A,∃a−1∈A,s.t.a⋅a−1=a0
李代数
为什么需要李代数
在 SLAM 位姿优化中,直接处理旋转矩阵会面临正交性约束难题,所依我们需要引入李代数,将优化过程放到无约束的李代数空间中进行
从上面的推导中,我们可以得出几个重要的结论
- 对旋转矩阵求导,只需对 R ( t ) R(t) R(t) 左乘一个反对称矩阵 ϕ ∧ \phi^\wedge ϕ∧
- 我们最终得到的 R ( t ) = e x p ( ϕ 0 ∧ t ) R(t)=exp(\phi_0^\wedge t) R(t)=exp(ϕ0∧t) ,揭示了李群和李代数的转换关系
定义
李代数描述了李群的局部性质,即李群单位元附近的正切空间。李代数由**一个集合 + 一个数域 + 一个二元运算符号(李括号)**组成(如 g = ( V , F , [ , ] ) \mathfrak{g}=(\mathbb{V},\mathbb{F},[,]) g=(V,F,[,])),集合具有如下几个特性
- 封闭性: ∀ X , Y ∈ V , [ X , Y ] ∈ V \forall X,Y \in \mathbb{V},\quad [X,Y] \in \mathbb{V} ∀X,Y∈V,[X,Y]∈V
- 双线性: ∀ X , Y , Z ∈ V , a , b ∈ F , \forall X,Y,Z \in \mathbb{V},\quad a,b \in \mathbb{F}, ∀X,Y,Z∈V,a,b∈F, 有 [ a X + b Y , Z ] = a [ X , Z ] + b [ Y , Z ] , [ X + a , Y ] = [ X , Y ] + [ a , Y ] [aX+bY,Z]=a[X,Z]+b[Y,Z],\quad [X+a,Y]=[X,Y]+[a,Y] [aX+bY,Z]=a[X,Z]+b[Y,Z],[X+a,Y]=[X,Y]+[a,Y]
- 自反性: ∀ X ∈ V , [ X , X ] = 0 \forall X \in \mathbb{V},\quad [X,X]=0 ∀X∈V,[X,X]=0
- 雅可比等价: ∀ X , Y , Z ∈ V , [ X , [ Y , Z ] ] + [ Z , [ X , Y ] ] + [ Y , [ Z , X ] ] = 0 \forall X,Y,Z \in \mathbb{V},\quad [X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0 ∀X,Y,Z∈V,[X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0
在接下来的部分,我们将加入几个新的表述, S O ( 3 ) , s o ( 3 ) \mathrm{SO}(3),\mathfrak{so}(3) SO(3),so(3) 将代表旋转部分的李群和李代数,而 S E ( 3 ) , s e ( 3 ) \mathrm{SE}(3),\mathfrak{se}(3) SE(3),se(3) 将代表变换部分的李群和李代数。
李代数 s o ( 3 ) \mathfrak{so}(3) so(3)
前面推导出来的
ϕ
\phi
ϕ 其实就是
s
o
(
3
)
\mathfrak{so}(3)
so(3) ,可以用旋转向量或者旋转向量对应的反对称矩阵表示,二者没有区别
s
o
(
3
)
=
{
ϕ
∈
R
3
,
Φ
=
ϕ
∧
∈
R
3
×
3
}
\mathfrak{so}(3)=\{\phi \in \mathbb{R}^3,\Phi=\phi^\wedge \in \mathbb{R}^{3\times3}\}
so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3}
此时,李括号可表示为:
[
ϕ
1
,
ϕ
2
]
=
(
Φ
1
Φ
2
−
Φ
2
Φ
1
)
∨
[\phi_1,\phi_2]=(\Phi_1\Phi_2-\Phi_2\Phi_1)^\vee
[ϕ1,ϕ2]=(Φ1Φ2−Φ2Φ1)∨ ,可以理解为量化了两种旋转操作的非交换性
李代数 s e ( 3 ) \mathfrak{se}(3) se(3)
s e ( 3 ) = { ξ = [ ρ ϕ ] ∈ R 6 , ρ ∈ R 3 , ϕ ∈ s o ( 3 ) , ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] ∈ R 4 × 4 } \mathfrak{se}(3)= \left\{ \xi=\begin{bmatrix} \rho\\\phi \end{bmatrix} \in\mathbb{R}^6,\rho\in\mathbb{R}^3,\phi\in\mathfrak{so}(3),\xi^\wedge=\begin{bmatrix}\phi^\wedge\quad\rho\\0^T\quad0\end{bmatrix}\in\mathbb{R}^{4\times4} \right\} se(3)={ξ=[ρϕ]∈R6,ρ∈R3,ϕ∈so(3),ξ∧=[ϕ∧ρ0T0]∈R4×4}
s e ( 3 ) \mathfrak{se}(3) se(3) 的元素是由三维平移向量 ρ \rho ρ 和三维旋转向量 ϕ \phi ϕ(也就是 s o ( 3 ) \mathfrak{so}(3) so(3) )组成的六维向量
此时,李括号可表示为:
[
ξ
1
,
ξ
2
]
=
(
ξ
1
∧
ξ
2
∧
−
ξ
2
∧
ξ
1
∧
)
∨
[\xi_1,\xi_2]=(\xi_1^\wedge\xi_2^\wedge-\xi_2^\wedge\xi_1^\wedge)^\vee
[ξ1,ξ2]=(ξ1∧ξ2∧−ξ2∧ξ1∧)∨ ,或者说
[
(
ω
1
,
υ
1
)
,
(
ω
2
,
υ
2
)
]
=
(
ω
1
×
ω
2
,
ω
1
×
υ
2
−
ω
2
×
υ
1
)
[(\omega_1,\upsilon_1),(\omega_2,\upsilon_2)]=(\omega_1\times\omega_2,\omega_1\times\upsilon_2-\omega_2\times\upsilon_1)
[(ω1,υ1),(ω2,υ2)]=(ω1×ω2,ω1×υ2−ω2×υ1)
注意,不同于
s
e
(
3
)
\mathfrak{se}(3)
se(3) ,这并不是单纯表示物理运动的先后顺序差异,而是通过旋转与旋转、旋转与平移的非交换性共同显现而出的差异
指数映射与对数映射
S O ( 3 ) → s o ( 3 ) \mathrm{SO}(3)\rightarrow\mathfrak{so}(3) SO(3)→so(3)
上面已经推导过了一次,我们知道从
S
O
(
3
)
\mathrm{SO}(3)
SO(3) 到
s
o
(
3
)
\mathfrak{so}(3)
so(3) 只需经历一次指数映射(这里的 t 只是参数,实际优化中无需使用)
R
(
t
)
=
exp
(
ϕ
∧
t
)
R(t)=\exp(\phi^\wedge t)
R(t)=exp(ϕ∧t)
我们在前面已经知道了
ϕ
∧
\phi^\wedge
ϕ∧ 其实就是旋转向量的反对称矩阵形式,我们可定义其为由旋转角
θ
\theta
θ 和旋转轴
a
a
a 组成的形式(模长是
θ
\theta
θ ,方向是
a
a
a)
这里比较复杂就不推导了,大家感兴趣的自己去看看书就行,直接把结果放出来
exp
(
ϕ
∧
t
)
=
exp
(
θ
a
∧
)
=
cos
θ
I
+
(
1
−
cos
θ
)
a
a
T
+
sin
θ
a
∧
\exp(\phi^\wedge t)=\exp(\theta a^\wedge)=\cos\theta I+(1-\cos\theta) aa^T+\sin\theta a^\wedge
exp(ϕ∧t)=exp(θa∧)=cosθI+(1−cosθ)aaT+sinθa∧
很眼熟吧,这和我们前面三维空间刚体运动那章推导的罗德里格斯公式几乎一模一样。罗德里格斯公式用于旋转矩阵和旋转向量之间的转换,对于
S
O
(
3
)
\mathrm{SO}(3)
SO(3) 转换到
s
o
(
3
)
\mathfrak{so}(3)
so(3) 也是同理
至于指数映射,也不需要复杂的计算,同样用前面提到过的旋转矩阵转旋转向量的式子即可
θ
=
a
r
c
c
o
s
t
r
(
R
)
−
1
2
R
n
=
n
\theta=arccos\frac{tr(R)-1}{2} \qquad Rn=n
θ=arccos2tr(R)−1Rn=n

S E ( 3 ) → s e ( 3 ) \mathrm{SE}(3)\rightarrow\mathfrak{se}(3) SE(3)→se(3)
这里就不展开讲了,相关的转换看图就好
李代数求导与扰动模型
前面提到过引入李代数是为了优化流程,因为 SLAM 优化的本质就是最小化重投影误差等损失函数,那求导肯定是必不可少的
BCH 公式及其近似形式
在优化结束之后,我们也需要将当前变换和增量变换进行整合(注意!优化针对的是增量,而不是整个变换)
因为不能简单的直接将两个李代数指数映射的乘积定义为它们和的指数映射(因为指数映射非单映射,可能出现多个李代数元素对应同一个李群元素),即
e
x
p
(
ϕ
1
∧
)
e
x
p
(
ϕ
2
∧
)
≠
e
x
p
(
(
ϕ
1
+
ϕ
2
)
∧
)
exp(\phi_1^\wedge)exp(\phi_2^\wedge) \neq exp((\phi_1+\phi_2)^\wedge)
exp(ϕ1∧)exp(ϕ2∧)=exp((ϕ1+ϕ2)∧)
所以我们需要使用 BCH 公式来完成这一步骤,因为原式较长,在
S
O
(
3
)
\mathrm{SO}(3)
SO(3) 中,我们通常使用其如下线性近似表达
l
n
(
e
x
p
(
ϕ
1
∧
)
e
x
p
(
ϕ
2
∧
)
)
∨
≈
{
J
l
(
ϕ
2
)
−
1
ϕ
1
+
ϕ
2
若
ϕ
1
为小量
J
l
(
ϕ
1
)
−
1
ϕ
2
+
ϕ
1
若
ϕ
2
为小量
ln(exp(\phi_1^\wedge)exp(\phi_2^\wedge))^\vee \approx \begin{cases} J_l(\phi_2)^{-1}\phi_1+\phi_2 \qquad 若~\phi_1~为小量 \\ J_l(\phi_1)^{-1}\phi_2+\phi_1 \qquad 若~\phi_2~为小量\end{cases}
ln(exp(ϕ1∧)exp(ϕ2∧))∨≈{Jl(ϕ2)−1ϕ1+ϕ2若 ϕ1 为小量Jl(ϕ1)−1ϕ2+ϕ1若 ϕ2 为小量
其中的
J
l
J_l
Jl 为左雅各比矩阵,与前面
s
e
(
3
)
\mathfrak{se}(3)
se(3) 处提到的一致
J
l
(
ϕ
)
=
sin
θ
θ
+
(
1
−
sin
θ
θ
)
a
a
T
+
1
−
cos
θ
θ
a
∧
J
l
(
ϕ
)
−
1
=
θ
2
cot
θ
2
I
+
(
1
−
θ
2
cot
θ
2
)
a
a
T
−
θ
2
a
∧
J_l(\phi) = \frac{\sin\theta}{\theta} + \left(1-\frac{\sin\theta}{\theta}\right)aa^T + \frac{1-\cos\theta}{\theta}a^\wedge \\ J_l(\phi)^{-1} = \frac{\theta}{2}\cot\frac{\theta}{2}I + \left(1-\frac{\theta}{2}\cot\frac{\theta}{2}\right)aa^T - \frac{\theta}{2}a^\wedge
Jl(ϕ)=θsinθ+(1−θsinθ)aaT+θ1−cosθa∧Jl(ϕ)−1=2θcot2θI+(1−2θcot2θ)aaT−2θa∧
右雅各比矩阵也不复杂,只要对自变量取反即可
J
r
(
ϕ
)
=
J
l
(
−
ϕ
)
J_r(\phi) = J_l(-\phi)
Jr(ϕ)=Jl(−ϕ)
举个例子,假如现有某个旋转
R
R
R ,要对它左乘微小旋转
Δ
R
\Delta R
ΔR ,我们可以以两种形式表达
李群乘法,其本质是非线性运算:
exp
(
Δ
ϕ
∧
)
e
x
p
(
ϕ
∧
)
=
exp
(
(
ϕ
+
J
l
−
1
(
ϕ
)
Δ
ϕ
)
∧
)
\exp(\Delta \phi^\wedge)exp(\phi^\wedge) = \exp((\phi+J_l^{-1}(\phi)\Delta \phi)^\wedge)
exp(Δϕ∧)exp(ϕ∧)=exp((ϕ+Jl−1(ϕ)Δϕ)∧)
或者李代数加法,其本质是线性运算(李代数加法通常用于极微小场景,左乘右乘差别不大):
exp
(
(
ϕ
+
Δ
ϕ
)
∧
)
=
exp
(
(
J
l
Δ
ϕ
)
∧
)
exp
(
ϕ
∧
)
=
exp
(
ϕ
∧
)
exp
(
(
J
r
Δ
ϕ
)
∧
)
\exp((\phi+\Delta\phi)^\wedge) = \exp((J_l\Delta\phi)^\wedge)\exp(\phi^\wedge) = \exp(\phi^\wedge)\exp((J_r\Delta\phi)^\wedge)
exp((ϕ+Δϕ)∧)=exp((JlΔϕ)∧)exp(ϕ∧)=exp(ϕ∧)exp((JrΔϕ)∧)
类似的,对于
S
E
(
3
)
SE(3)
SE(3) ,也有对应的 BCH 近似
J
l
(
ξ
)
=
[
J
l
S
O
(
3
)
L
0
J
l
S
O
(
3
)
]
L
=
θ
−
sin
θ
θ
3
ϕ
∧
+
1
−
cos
θ
θ
2
ϕ
∧
ϕ
∧
+
1
2
I
\mathcal{J_l}(\xi) = \left[ \begin{matrix} J_l^{SO(3)} & L \\ 0 & J_l^{SO(3)} \end{matrix} \right]\\ L=\frac{\theta-\sin\theta}{\theta^3}\phi^\wedge+\frac{1-\cos\theta}{\theta^2}\phi^\wedge\phi^\wedge + \frac{1}{2}I
Jl(ξ)=[JlSO(3)0LJlSO(3)]L=θ3θ−sinθϕ∧+θ21−cosθϕ∧ϕ∧+21I
s o ( 3 ) 求导 \mathfrak{so}(3)求导 so(3)求导
1.BCH 求导
对于
p
′
=
R
n
e
w
p
p'=R_{new} p
p′=Rnewp ,我们要求旋转后的点对旋转的导数,不过由于
S
O
(
3
)
\mathrm{SO}(3)
SO(3) 没有加法,我们要求其转换到李代数空间来进行求导
∂
(
R
p
)
∂
(
R
)
⇒
∂
(
e
x
p
(
ϕ
∧
)
p
)
∂
ϕ
\frac{\partial(Rp)}{\partial(R)} \qquad \Rightarrow \qquad \frac{\partial(exp(\phi^\wedge)p)}{\partial{\phi}}
∂(R)∂(Rp)⇒∂ϕ∂(exp(ϕ∧)p)
这是比较严谨的方法,不过引入了雅各比矩阵之后,计算量实在太大,一般仅适用于较大扰动和高精度需求场景(实际上现在工程已经很少用了,基本都是扰动模型)
2.扰动模型求导
我们可以对当前变换施加一个小的扰动(通常是左乘,即在世界坐标系下添加扰动,右乘为在相机坐标系上添加扰动),使
R
n
e
w
=
exp
(
δ
φ
∧
)
R
R_{new}=\exp(\delta\varphi^\wedge)R
Rnew=exp(δφ∧)R,通过线性化直接求导
∂
(
R
p
)
∂
(
ϕ
)
⇒
lim
φ
→
0
exp
(
φ
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
φ
\frac{\partial(Rp)}{\partial(\phi)} \qquad \Rightarrow \qquad \lim_{\varphi \to 0} \frac{\exp(\varphi^\wedge)\exp(\phi^\wedge)p-\exp(\phi^\wedge)p}{\varphi}
∂(ϕ)∂(Rp)⇒φ→0limφexp(φ∧)exp(ϕ∧)p−exp(ϕ∧)p

相较于复杂的 BCH 求导,计算量更小的扰动模型求导更常用
s e ( 3 ) \mathfrak{se}(3) se(3) 求导
对于 p ′ = T p p'=Tp p′=Tp ,我们左乘一个小扰动 Δ T = exp ( δ ξ ∧ ) \Delta T=\exp(\delta \xi^\wedge) ΔT=exp(δξ∧) ,其李代数为 δ ξ ∧ = [ δ ρ , δ ϕ ] T \delta \xi^\wedge=[\delta \rho,\delta \phi]^T δξ∧=[δρ,δϕ]T
优化全流程
自此,李群和李代数的内容基本结束,接下来将以梯度下降为优化核心,简单介绍下优化的全流程
0.为什么会存在误差
理论上,我们给出的指令是:“先绕 X 轴顺时针转动 6 0 ∘ 60^\circ 60∘ ,再沿着 Y 轴前进 1 m”。这是很明确的指令,并不存在误差,但实际中运动并不如此,机器不会严格按照这个顺序,而是一边旋转一边平移,而我们前面提到过:“ s e ( 3 ) 的旋转和平移是具有非交换性的 \mathfrak{se}(3)的旋转和平移是具有非交换性的 se(3)的旋转和平移是具有非交换性的”,那么这里就出现了误差。这是主要的,其余误差则可能来自于传感器噪声、模型误差等
1.构建损失函数
损失函数一般基于重投影误差,假设有观测像素点
u
i
u_i
ui 和对应的 3D 世界点
P
i
(
[
X
i
,
Y
i
,
Z
i
,
1
]
T
)
P_i([X_i,Y_i,Z_i,1]^T)
Pi([Xi,Yi,Zi,1]T) ,位姿变换
T
(
ξ
)
=
exp
(
ξ
∧
)
T(\xi)=\exp(\xi^\wedge)
T(ξ)=exp(ξ∧) ,投影函数
π
\pi
π(将 3D 点投影到图像平面),则损失函数可以如下定义
L
o
s
s
(
ξ
)
=
∑
i
∣
∣
u
i
−
π
(
T
(
ξ
)
⋅
P
i
)
∣
∣
2
\mathrm{Loss}(\xi)=\sum_i||u_i-\pi(T(\xi)\sdot P_i)||^2
Loss(ξ)=i∑∣∣ui−π(T(ξ)⋅Pi)∣∣2
2.计算梯度
梯度下降的核心就是求 ∂ L o s s ( ξ ) ∂ ξ \frac{\partial\mathrm{Loss(\xi)}}{\partial\xi} ∂ξ∂Loss(ξ) ,这需要在李代数空间中求导。这里就只用扰动模型来做演示了
先对当前位姿 T 施加小扰动
δ
ξ
\delta\xi
δξ ,使
T
′
=
exp
(
δ
ξ
∧
)
T
(
ξ
)
T'=\exp(\delta\xi^\wedge)T(\xi)
T′=exp(δξ∧)T(ξ) ,此时损失函数可近似为(如果不理解这里是怎么变换的,详细的推导我会放在最后)
∂
L
o
s
s
(
ξ
)
∂
ξ
=
∑
i
−
2
(
u
i
−
π
(
T
p
i
)
)
T
∂
π
(
T
p
i
)
∂
(
T
p
i
)
⋅
∂
(
T
p
i
)
∂
ξ
∂
(
T
p
i
)
∂
ξ
=
[
I
−
(
R
p
+
t
)
0
T
0
T
]
\frac{\partial\mathrm{Loss(\xi)}}{\partial\xi}=\sum_i-2(u_i-\pi(Tp_i))^T \frac{\partial\pi (Tp_i)}{\partial(Tp_i)} \cdot \frac{\partial(Tp_i)}{\partial\xi} \\ \frac{\partial(Tp_i)}{\partial\xi}=\begin{bmatrix} I & -(Rp+t) \\ 0^T & 0^T \end{bmatrix}
∂ξ∂Loss(ξ)=i∑−2(ui−π(Tpi))T∂(Tpi)∂π(Tpi)⋅∂ξ∂(Tpi)∂ξ∂(Tpi)=[I0T−(Rp+t)0T]
其中
p
=
[
P
i
T
,
1
]
T
p=[P_i^T,1]^T
p=[PiT,1]T 是齐次坐标,R、t是当前位姿的旋转、平移部分。
∂
π
∂
(
T
p
i
)
\frac{\partial\pi}{\partial(Tp_i)}
∂(Tpi)∂π 是投影函数的雅可比
3.更新位姿
- 计算更新方向: δ ξ = − α ∂ L o s s ( ξ ) ∂ ξ \delta\xi=-\alpha\frac{\partial\mathbf{Loss(\xi)}}{\partial\xi} δξ=−α∂ξ∂Loss(ξ) ( α \alpha α 是学习率)
- 更新位姿: ξ n e w = ξ o l d + δ ξ \xi_{new}=\xi_{old}+\delta\xi ξnew=ξold+δξ
4.判断收敛和后处理
当损失变化小于阈值时,即可判断为梯度下降已经收敛,此时将李代数 ξ \xi ξ 通过指数映射转换为李群元素 T = exp ( ξ ∧ ) T=\exp(\xi^\wedge) T=exp(ξ∧) ,得到最终的位姿矩阵
整个的优化过程可以简单通俗地理解为将完整的变换分成很多小份(多次迭代),然后每次计算一个增量加到当前位姿上,并根据新位姿与理想位姿的差距,优化下一个增量,使得实际位姿逐渐逼近理想位姿
附:损失函数偏导的推导

2232

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



