旋转的求导过程
1.基础知识回顾:导数与微分
导数是针对一个点处函数变化率来说的,求导过程伴随着求极限。设函数 h h h自变量为 x x x,那么在 x 0 x_0 x0处 h h h的导数意思是,在 x 0 x_0 x0临域内, Δ x ↦ 0 \Delta x \mapsto 0 Δx↦0时, h h h的变化量 Δ h \Delta h Δh与 Δ x \Delta x Δx的比值,即 lim Δ x → 0 Δ h Δ x = lim Δ x → 0 h ( x 0 + Δ x ) − h ( x 0 ) Δ x \lim_{\Delta x \rightarrow 0} \frac{\Delta h}{\Delta x}= \lim_{\Delta x \rightarrow 0} \frac{h(x_0+\Delta x)-h(x_0)}{\Delta x} Δx→0limΔxΔh=Δx→0limΔxh(x0+Δx)−h(x0)
2.优化中的旋转量
2.1 背景
在之前的博客中介绍过旋转的表示方法,不了解的同学可以看看:刚体运动中的坐标变换-旋转矩阵、旋转向量、欧拉角及四元数
在VSLAM非线性优化中,使用旋转矩阵来进行坐标变换,而待优化的误差为预测坐标与观测坐标的差值,在摄像头观测到一个坐标点时,假设我们不优化坐标点,那么此时变量就是变换矩阵,而变换矩阵由旋转矩阵和平移向量组成。要对误差函数求导,就必须对旋转矩阵求导。但是旋转矩阵为乘法运算定义良好的李群元素,如果直接将微小扰动乘在原函数值上做差,再除以这个微小扰动,这个导数是无法进一步简化的,这样会造成优化上的麻烦(目前我觉得是可以这么做,但就是很麻烦,聪明的数学家是不会允许这种情形出现的)。
其实,所有李群都有自己的李代数,这个李代数表征了李群的切空间性质,有了李代数,求导会容易很多。对坐标值的求导过程正是通过李代数的指数映射来简化的。
2.2 李群和李代数
2.2.1 李群
旋转的参数化表示之一,就是使用旋转矩阵R来表示,旋转矩阵是一个正交阵,即其逆为自身的转置,且行列式值为1。
S O ( n ) = { R ∈ R n × n ∣ R R T = I , d e t ( R ) = 1 } SO(n)=\{R\in \mathbb{R}^{n\times n} |RR^{T}=I,det(R)=1\} SO(n)={R∈Rn×n∣RRT=I,det(R)=1}
- 这里的第一条性质表明,反向旋转 θ \theta θ角度,其旋转矩阵等于正向旋转矩阵的转置。而第二条性质,表明旋转矩阵代表的变换为等体积变换[1]。
所有旋转矩阵构成的集合,加上矩阵乘法,就构成了特殊正交群SO(n)这一李群(n表示维度)。SO(n)群内元素具有连续光滑的性质。旋转矩阵为SO(3)。
- 本次记录主要针对高博视觉SLAM十四讲中第45页,75页,85页及186页附近内容的梳理,有书的同学可以对照着看。
在SO(3)李代数的推导中可知,so(3)中的向量表征了SO(3)某一旋转的导数与该旋转的线性变换关系。
2.2.2 李代数与李群的关系:指数映射
对于正交矩阵,显而易见下列等式都成立:
R
R
T
=
I
RR^T=I
RRT=I
两边求导,得到如下结果(矩阵转置和求导顺序可以互换):
R
′
R
T
+
R
R
T
′
=
R
′
R
T
+
R
R
′
T
(1)
{R}'R^T+R{R^T}'={R}'R^T+R{{R}'}^T \tag{1}
R′RT+RRT′=R′RT+RR′T(1)
- 这里矩阵求导,可以当作对矩阵每个格子中元素求导,对单元函数(就是没有多个变元的函数,我手动推导了以下过程:
因为
R
R
T
=
I
RR^T=I
RRT=I,设
R
R
R每个格子里的量是时间的函数,即:
R
=
(
a
11
(
t
)
a
12
(
t
)
a
13
(
t
)
a
21
(
t
)
a
22
(
t
)
a
23
(
t
)
a
31
(
t
)
a
32
(
t
)
a
33
(
t
)
)
R= \begin{pmatrix} a_{11}(t) & a_{12}(t) & a_{13}(t) \\ a_{21}(t) & a_{22}(t) & a_{23}(t)\\ a_{31}(t) & a_{32}(t) & a_{33}(t) \end{pmatrix}
R=⎝⎛a11(t)a21(t)a31(t)a12(t)a22(t)a32(t)a13(t)a23(t)a33(t)⎠⎞
此时对
R
(
t
)
R(t)
R(t)求导,含义是对每个
a
i
j
(
t
)
a_{ij}(t)
aij(t)求导,对矩阵求导的定义同样适用于等式右边。
证明,
(
R
(
t
)
R
(
t
)
T
)
′
=
R
˙
(
t
)
R
(
t
)
T
+
R
(
t
)
R
(
t
)
˙
T
({R(t)R(t)^T})'=\dot{R}(t){R(t)}^T+R(t){\dot{R(t)}}^T
(R(t)R(t)T)′=R˙(t)R(t)T+R(t)R(t)˙T
假设
R
(
t
)
R
(
t
)
T
=
A
R(t)R(t)^T=A
R(t)R(t)T=A
则有
A
i
j
=
R
(
t
)
i
,
1
:
3
R
(
t
)
T
1
:
3
,
j
A_{ij}={R(t)}_{i,1:3}{R(t)^T}_{1:3,j}
Aij=R(t)i,1:3R(t)T1:3,j
对
A
i
j
A_{ij}
Aij先乘积展开,求导后合并可得
A
i
j
′
=
R
(
t
)
˙
i
,
1
:
3
R
(
t
)
T
1
:
3
,
j
+
R
(
t
)
i
,
1
:
3
R
(
t
)
T
˙
1
:
3
,
j
{A_{ij}}'=\dot{R(t)}_{i,1:3}{R(t)^T}_{1:3,j}+{R(t)}_{i,1:3}\dot{R(t)^T}_{1:3,j}
Aij′=R(t)˙i,1:3R(t)T1:3,j+R(t)i,1:3R(t)T˙1:3,j
即可得到两个矩阵乘积的求导公式,这个和初等函数乘积求导是一样的。
所以有:
R
˙
(
t
)
R
(
t
)
T
+
R
(
t
)
R
(
t
)
˙
T
=
0
3
×
3
\dot{R}(t){R(t)}^T+R(t){\dot{R(t)}}^T=0^{3\times3}
R˙(t)R(t)T+R(t)R(t)˙T=03×3
然后利用矩阵乘法的转置,上式等同于下:
R
′
R
T
=
−
(
R
′
R
T
)
T
(2)
{R}'R^T=-{({R}'R^T)}^T \tag{2}
R′RT=−(R′RT)T(2)
- 证明完毕
对于正交阵,其求导后的矩阵与本身转置的矩阵相乘的结果,是一个反对称矩阵。而反对称矩阵有个特点,对角格子全为零,剩余格子是由三个量按规律排列的。
用$ \phi (t)= \begin{pmatrix}
a1\
a2\
a3
\end{pmatrix}$表示一个三维向量,则其对应的反对称矩阵为:
ϕ
(
t
)
^
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
\hat{\phi (t)}= \begin{bmatrix} 0 &-a3 &a2 \\ a3& 0& -a1\\ -a2&a1 &0 \end{bmatrix}
ϕ(t)^=⎣⎡0a3−a2−a30a1a2−a10⎦⎤
公式二可以写为
R
′
R
T
=
ϕ
(
t
)
^
{R}'R^T=\hat{\phi (t)}
R′RT=ϕ(t)^,两边同时乘以
R
R
R
R
′
=
ϕ
(
t
)
^
R
(3)
{R}'=\hat{\phi (t)}R \tag{3}
R′=ϕ(t)^R(3)
正交矩阵型函数,其导数等于正交矩阵函数乘以一个反对称矩阵(这个反对称矩阵是导数与逆的乘积)。
对旋转矩进行对应的so(3)向量所代表的线性变换矩阵(即李代数对应的反对称矩阵)的线性变换,就可以得到该旋转矩阵的一阶导数,换为普通函数更好理解:即
y
′
=
A
y
{y}'=Ay
y′=Ay,那么很明显,
y
y
y为以
e
e
e为底的指数函数,
y
=
e
A
x
y=e^{Ax}
y=eAx,这里也是类似的。通过解这个微分方程,可以得到:
R
=
exp
(
ϕ
(
t
)
^
)
(4)
R=\exp (\hat{\phi (t)}) \tag{4}
R=exp(ϕ(t)^)(4)
这个就是李代数与李群中元素的映射关系。通过这个映射关系,可以对求导进行简化。实际上在非线性优化时,使用的就是李代数与李群间的指数映射关系。
2.2.3 如何求李代数
ϕ
(
t
)
^
=
log
(
R
)
=
θ
sin
θ
(
R
−
R
T
)
(5)
\hat{\phi (t)}=\log (R)=\frac{\theta}{\sin \theta}(R-R^T) \tag{5}
ϕ(t)^=log(R)=sinθθ(R−RT)(5)
其中:
θ
=
arccos
τ
−
1
2
=
arccos
r
11
+
r
22
+
r
33
−
1
2
\theta=\arccos \frac{\tau -1}{2}=\arccos \frac{r_{11}+r_{22}+r_{33} -1}{2}
θ=arccos2τ−1=arccos2r11+r22+r33−1
根据公式5得到的反对称矩阵,可以映射回相应的李代数。
ϕ
=
[
ϕ
(
t
)
^
(
2
,
1
)
,
−
ϕ
(
t
)
^
(
2
,
0
)
,
ϕ
(
t
)
^
(
1
,
0
)
]
T
\phi=[\hat{\phi(t)}(2,1),-\hat{\phi(t)}(2,0),\hat{\phi(t)}(1,0)]^T
ϕ=[ϕ(t)^(2,1),−ϕ(t)^(2,0),ϕ(t)^(1,0)]T
3.求导:左扰动模型
在求导时,利用BCH近似求导的方法在我看来是利用函数显示计算增量,而扰动模型是利用递推公式计算增量,二者结果是等价的。
左扰动指扰动旋转矩阵左乘到旋转矩阵上:
∂
(
R
p
)
∂
φ
=
lim
φ
→
0
(
exp
φ
^
exp
ϕ
^
)
p
−
exp
ϕ
^
p
φ
(6)
\frac{\partial (Rp)}{\partial \varphi }=\lim_{\varphi \rightarrow 0}\frac{(\exp{\hat{\varphi}}\exp{\hat{\phi}})p-\exp{\hat{\phi}}p}{\varphi} \tag{6}
∂φ∂(Rp)=φ→0limφ(expφ^expϕ^)p−expϕ^p(6)
等价无穷小关系
lim
x
→
0
exp
(
x
)
=
1
+
x
\lim_{x\rightarrow0}\exp(x)=1+x
x→0limexp(x)=1+x
所以公式6可以进行如下变换:
∂
(
R
p
)
∂
φ
=
lim
φ
→
0
(
1
+
φ
^
)
exp
ϕ
^
p
−
exp
ϕ
^
p
φ
=
φ
^
exp
ϕ
^
p
φ
=
φ
^
R
p
φ
=
−
R
p
^
φ
φ
=
−
(
R
p
^
)
\frac{\partial (Rp)}{\partial \varphi }=\lim_{\varphi \rightarrow 0}\frac{(1+\hat{\varphi})\exp{\hat{\phi}}p-\exp{\hat{\phi}}p}{\varphi} \\=\frac{\hat{\varphi}\exp{\hat{\phi}}p}{\varphi}\\ =\frac{\hat{\varphi}Rp}{\varphi}\\=\frac{-\hat{Rp}\varphi}{\varphi}\\=-(\hat{Rp})
∂φ∂(Rp)=φ→0limφ(1+φ^)expϕ^p−expϕ^p=φφ^expϕ^p=φφ^Rp=φ−Rp^φ=−(Rp^)