视觉slam十四讲 ---CH4 李群与李代数求导
李群与李代数相较于CH3是比较的抽象的数学知识,这个工具的提出目的是解决一些旋转位姿描述的优化问题。本讲最终的目的是解决如何描述对旋转求导的问题。
1. 什么是群
群是一种集合加上一种运算的代数结构
记集合为A,运算为⋅" role="presentation">⋅,则若此结构满足以下几条性质,构成一个群。

第三讲中的旋转矩阵R以及变换矩阵T加上乘法运算就构成一种群。
特殊正交群
SO(3)={R∈Rn×n|RRT=I,det(R)=1}" role="presentation">SO(3)={R∈Rn×n|RRT=I,det(R)=1}
特殊欧式群
SE(3)={T=[Rt0T1]∈R4×4|R∈SO(3),t∈R3}" role="presentation">SE(3)={T=[Rt0T1]∈R4×4|R∈SO(3),t∈R3}
对于SO(3)以及SE(3),它们对于乘法是封闭的,也就是说对于多个旋转矩阵或者变换矩阵相乘,结果仍为旋转矩阵或者变换矩阵。这一点在上一章描述多次旋转时可以看作是多个旋转矩阵相乘是相同的。
本章的章节名是李群与李代数。那么什么是李群呢?
李群是具有连续(光滑)性质的群。类似于二维函数的连续。数学上已经证明SO(3)以及SE(3)都是李群。
在涉及一些优化问题时,我们需要对于旋转这一位姿变换进行求导操作来找出一些类似于"旋转的变化率"的概念帮助我们去优化。(如梯度下降)。但是对于SO(3)以及SE(3),仅满足乘法的封闭性,并不满足加法的封闭性,也就是并不处于线性空间中。如下导数的定义,显然想要求导且导数有意义的话,该代数结构应该在线性空间中才可以实现。

2. 李代数
对于R或者T来说,并不能直接对其求导,那么能否找到一种映射关系将其映射到线性空间中呢?
给出如下推导,假设旋转是随时间变化的函数。
∀R(t)∈SO(3),R(t)R(t)T=I两边求导(抽象的求导)得R(t)˙R(t)T+R(t)R(t)T˙=0即R(t)˙R(t)T=−R(t)R(t)T˙由(ab)T=bTaTR(t)˙R(t)T=−(R(t)R(t)T˙)T对于一个反对称矩阵,有a=−aT,显然上式满足,故R(t)˙R(t)T为反对称矩阵。假设R(t)˙R(t)T=ϕ(t)∧" role="presentation">∀R(t)∈SO(3),R(t)R(t)T=I两边求导(抽象的求导)得˙R(t)R(t)T+R(t)˙R(t)T=0即˙R(t)R(t)T=−R(t)˙R(t)T由(ab)T=bTaT˙R(t)R(t)T=−(˙R(t)R(t)T)T对于一个反对称矩阵,有a=−aT,显然上式满足,故˙R(t)R(t)T为反对称矩阵。假设˙R(t)R(t)T=ϕ(t)∧
需要注意的是,这里的ϕ(t)∧" role="presentation">ϕ(t)∧中的^代表着一个三维向量ϕ" role="presentation">ϕ扩充为一个反对称阵。比如
a=(1,2,3)Ta∧=[012−103−2−30]" role="presentation">a=(1,2,3)Ta∧=⎡⎢⎣012−103−2−30⎤⎥⎦
因此ϕ(t)∧" role="presentation">ϕ(t)∧代表我们假设R由ϕ" role="presentation">ϕ扩充而来。
接着推理有
两边右乘R,有R(t)˙=ϕ(t)∧R(t)假定t=0时刻R=I,且认为t=0附近ϕ(t)变化不大,记作ϕ0可认为上式就是一个微分方程。解得ln(R(t))=ϕ0∧同理有R(t)=exp(ϕ0∧)" role="presentation">两边右乘R,有˙R(t)=ϕ(t)∧R(t)假定t=0时刻R=I,且认为t=0附近ϕ(t)变化不大,记作ϕ0可认为上式就是一个微分方程。解得ln(R(t))=ϕ∧0同理有R(t)=exp(ϕ∧0)
可以看出,经过一通推导,我们发现旋转矩阵与一个东西有着对数形式上的映射。这里的ϕ0" role="presentation">ϕ0就是SO(3)对应的李代数。
与李群一样,李代数的构成也要满足一定的性质。如下

可以知道对于ϕ0" role="presentation">ϕ0来说,满足如上的定义

其李括号的定义的运算类型为

对于SE(3)上的李群,直接给出其李代数对应形式

其李括号的定义为

这里的∧" role="presentation">∧操作与so(3)的定义不同,不再表示由三维向量扩充反对称阵,而是表示将ξ" role="presentation">ξ这个六维向量扩充为一个四维矩阵。不难看出ξ" role="presentation">ξ的前三维由平移向量得出,后三维就是se(3)。
数学上已经证明,李代数处于线性空间中,可以进行求导操作
3. 对数映射与指数映射
上面我们给出了李代数与李群的映射关系,即
ln(R(t))=ϕ0∧即lnR(t)∨=ϕ0 R(t)=exp(ϕ0∧)" role="presentation">ln(R(t))=ϕ∧0即lnR(t)∨=ϕ0 R(t)=exp(ϕ∧0)
但是这只是抽象的公式,并没有告诉我们如何将其中的一些具体元素对应转换。但是通过这个我们可以知道对于已知李群求李代数是一种对数映射,已知李代数求李群是一种指数映射。
对于exp(ϕ∧),进行泰勒展开因为ex=∑n=0∞xnn!=1+x+x22!+x33!+x44!+…又对于一个三维向量可以写成模长乘单位方向向量的模式,不妨假设ϕ=θa→,a→为单位向量" role="presentation">对于exp(ϕ∧),进行泰勒展开因为ex=∞∑n=0xnn!=1+x+x22!+x33!+x44!+…又对于一个三维向量可以写成模长乘单位方向向量的模式,不妨假设ϕ=θ→a,→a为单位向量
具体形式与化简如下图

化简应用的性质如下

最终我们得出这样的一个式子

不难看出,这个公式与上一讲旋转矩阵转角轴(旋转向量)的罗德里格斯公式如出一辙。这也揭示了so(3)的物理意义就是旋转向量。
因此由so(3)的李代数指数映射求其对应的李群SO(3)的过程本质上就是旋转向量向旋转矩阵的转换。
对于已知旋转矩阵求其so(3)上的李代数的过程,我们有对数映射形式lnR(t)=ϕ" role="presentation">lnR(t)=ϕ,尽然可以使用与求指数映射形式类似的泰勒展开来推导,这样比较麻烦。
但是我们已经知道了so(3)上的李代数实际上就是角轴,因此使用第三章中旋转向量转角轴的公式即可。
角度θ=arcos(tr(R)−12)轴向量Rn→=n→,求解R特征值为1时的特征向量" role="presentation">角度θ=arcos(tr(R)−12)轴向量R→n=→n,求解R特征值为1时的特征向量
关于方向向量的求解,因为使用角轴描述旋转时,旋转前后的单位方向向量是不变的(因为是绕着这个轴转的嘛)。因此对轴乘以旋转矩阵进行旋转操作后的结果仍是其本身,依据这个列出的特征方程。
至于SE(3)与se(3)之间的转换,由下图总结给出
最后总结以下李群与李代数的映射关系以及变换

4. 李群与李代数的近似
既然李代数处于线性空间,而且李群与李代数可以通过指数映射以及对数映射进行转换,那么我们是否可以直接使用李代数表述李群的求导操作呢?
一个朴素的思想
对于R1R2=exp(ϕ1∧)exp(ϕ2∧)在实数域中有exp(x1)exp(x2)=exp(x1+x2)猜想:是否有R1R2=exp(ϕ1∧)exp(ϕ2∧)=exp(ϕ1∧+ϕ2∧)=exp((ϕ1+ϕ2)∧)" role="presentation">对于R1R2=exp(ϕ∧1)exp(ϕ∧2)在实数域中有exp(x1)exp(x2)=exp(x1+x2)猜想:是否有R1R2=exp(ϕ∧1)exp(ϕ∧2)=exp(ϕ∧1+ϕ∧2)=exp((ϕ1+ϕ2)∧)
但是根据BCH近似公式

可以知道对于两个矩阵,exp(A)exp(B)≠exp(A+B)而是等于exp(A+B+余项)" role="presentation">exp(A)exp(B)≠exp(A+B)而是等于exp(A+B+余项)。
不过根据如下公式可以将上式进行线性近似

其中Jl" role="presentation">Jl为左乘雅可比矩阵,Jr" role="presentation">Jr为右乘雅可比矩阵。具体表示方法如下


也就是说当两个量中有一个为小量时可以使用BCH近似来实现李群乘法转化为李代数加法。但是还是不够直观,给出如下推导。注意雅可比矩阵视为常系数。
exp((Jl(ϕ2)ϕ1)∧)exp(ϕ2∧)=exp(Jl(ϕ2)(ϕ1)∧)exp(ϕ2∧)根据以上BCH近似将Jl(ϕ2)(ϕ1)∧看作小量,有exp(Jl(ϕ2)(ϕ1)∧)exp(ϕ2∧)=exp(Jl−1(ϕ2)Jl(ϕ2)ϕ1∧+ϕ2∧)=exp(ϕ1∧+ϕ2∧)=exp((ϕ1+ϕ2)∧)" role="presentation">exp((Jl(ϕ2)ϕ1)∧)exp(ϕ∧2)=exp(Jl(ϕ2)(ϕ1)∧)exp(ϕ∧2)根据以上BCH近似将Jl(ϕ2)(ϕ1)∧看作小量,有exp(Jl(ϕ2)(ϕ1)∧)exp(ϕ∧2)=exp(J−1l(ϕ2)Jl(ϕ2)ϕ∧1+ϕ∧2)=exp(ϕ∧1+ϕ∧2)=exp((ϕ1+ϕ2)∧)
即最后得出了这样一个等式,且将Jl(ϕ2)" role="presentation">Jl(ϕ2)简写为Jl" role="presentation">Jl
exp((ϕ1+ϕ2)∧)=exp(Jlϕ1∧)exp(ϕ2∧)" role="presentation">exp((ϕ1+ϕ2)∧)=exp(Jlϕ∧1)exp(ϕ∧2)
依据这个等式,我们就可以将李代数的加法与李群的乘法近似且简洁的联系在一起了。下面贴出SE(3)与se(3)的关系,推导类似。

5. 李代数求导
以上我们就已经具备了实现李代数求导的准备。
求导的方法有两种
- 李代数求导
- 扰动模型求导
对于旋转矩阵求导的应用场景如下
对于一个三维向量p→,对其进行旋转操作R,求旋转后的向量或者点相对于旋转的变化率不妨记为∂Rp∂R" role="presentation">对于一个三维向量→p,对其进行旋转操作R,求旋转后的向量或者点相对于旋转的变化率不妨记为∂Rp∂R
李代数求导
李代数求导就是将上式中的旋转矩阵李群直接用对应的李代数来进行替换,然后在李代数中套用导数定义来实现

- 第二步使用了上面推导的exp((ϕ1+ϕ2)∧)=exp(Jlϕ1∧)exp(ϕ2∧)" role="presentation">exp((ϕ1+ϕ2)∧)=exp(Jlϕ∧1)exp(ϕ∧2)
- 第三步近似,因为Jlδϕ∧" role="presentation">Jlδϕ∧是一个小量,因此由泰勒展开或者说等价无穷小,ex=1+x" role="presentation">ex=1+x有Jlδϕ∧=(I+(Jl)δϕ∧)" role="presentation">Jlδϕ∧=(I+(Jl)δϕ∧)
- 第四步展开括号或者提公因式可以得出
- 第五步由反对称阵与向量叉乘的关系a→×b→=a→∧b→=−b→×a→=−b→∧a→" role="presentation">→a×→b=→a∧→b=−→b×→a=−→b∧→a 即 a→∧b→=−b→∧a→" role="presentation">→a∧→b=−→b∧→a
- 第六步上下约掉δϕ" role="presentation">δϕ
扰动模型求导
扰动模型求导的思路是在原来的旋转矩阵上左乘一个小的扰动旋转。然后对这个扰动求导。
不严谨的表示为
limΔR→0ΔRRp−RpΔR" role="presentation">limΔR→0ΔRRp−RpΔR
要做的就是将上述中的李群换成对应的李代数。设ΔR↔δφ" role="presentation">ΔR↔δφ,推导如下图。

推导所使用的化简方法与李代数求导并无二异。
可以看出,使用扰动求导的方法得出的结果更加简洁,没有最后的左乘雅可比矩阵。
但是使用两种方法求出的结果是有差异的。
- 李代数求导的对象是对旋转矩阵本身,令导数等于0求出的旋转矩阵即为最优的旋转。
- 扰动模型求导的对象是ΔR" role="presentation">ΔR,令导数等于0求出的为最优的ΔR" role="presentation">ΔR,最终的R=ΔRR" role="presentation">R=ΔRR
最后贴出SE(3)求导的推导。

需要注意的是(Tp)⊙" role="presentation">(Tp)⊙中的⊙" role="presentation">⊙符号代表着SE(3)求导。
最后想要支持李代数李群相关运算,可以使用Sophus库来实现,Sophus库是Eigen的一个关于李代数李群的一个扩展库。