• SLAM中的李群和李代数


    定义

    群(Group)是一种集合加上一种运算的代数结构,记作(A,⋅)。其中A代表集合,⋅是定义在该集合上的二元运算。那么,如果这个运算满足以下几个条件,则称G=(A,⋅)为群

    • 封闭性
    • 结合律
    • 幺元

    李群的定义

    李群是指具有光滑连续性质的群

    特殊正交群

    特殊正交群SO(n) 也就是所谓的旋转矩阵群,其中SO(2)和SO(3)最为常见。正式的记法是:

    SO(n)={R\Rn×n|RRT=I,det(R)=1}" role="presentation">SO(n)={R\Rn×n|RRT=I,det(R)=1}

    假设有这样一个矩阵R" role="presentation">R,满足RRTI" role="presentation">RRTI
    现在,考虑它随时间发生变化,即从R" role="presentation">R 变成了R(t)" role="presentation">R(t),仍有R(t)R(t)T=I" role="presentation">R(t)R(t)T=I

    R˙(t)R(t)T+R(t)R˙(t)T=0" role="presentation">R˙(t)R(t)T+R(t)R˙(t)T=0

    则:

    R˙(t)R(t)T=(R˙(t)R(t)T)T" role="presentation">R˙(t)R(t)T=(R˙(t)R(t)T)T

    可以看出R˙(t)R(t)T" role="presentation">R˙(t)R(t)T是一个反对称矩阵,则我们可以找到一个三维向量ϕ(t)R3" role="presentation">ϕ(t)R3与之对应。于是有:

    R˙(t)R(t)T=ϕ(t)" role="presentation">R˙(t)R(t)T=ϕ(t)

    左右各右乘R(t)" role="presentation">R(t),由于R" role="presentation">R为正交阵,有:

    R˙(t)=ϕ(t)R(t)=[0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10]R(t)" role="presentation">R˙(t)=ϕ(t)R(t)=[0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10]R(t)

    可以看到,每对旋转矩阵求一次导数,只需左乘一个ϕ矩阵即可。由于ϕ反映了R的导数性质,故称它在SO(3)的正切空间(tangent space)上。同时,将上式类比于一个关于R的微分方程,可得:

    R(t)=exp(ϕ(t))R(t0)" role="presentation">R(t)=exp(ϕ(t))R(t0)

    由此我们可以引出两个概念。

    • 求ϕ的方法以及它的结构?——ϕ是对应到SO(3)上的李代数so(3)
    • exp(ϕ)如何计算?——李群与李代数间的指数/对数映射

    即:李代数表达的正切空间,具有和对应李群相同的自由度。指数映射能把正切空间中任意向量正好映射到原李群。

    特殊欧式群

    特殊欧氏群SE(n) 也就是前面提到的n维欧氏变换,如SE(2)和SE(3)。这里给出SE(3)的记法:

    SE(3)={T=[RTt0T1]R4×4|RSO(3),tR3}" role="presentation">SE(3)={T=[RTt0T1]R4×4|RSO(3),tR3}

    李代数

    对于SO(3)和SE(3),李代数可定义于李群的正切空间上,描述了李群中元素局部性质。

    定义

    李代数由一个集合V,一个数域F和一个二元运算[](其中二元运算被称为李括号)组成。如果它们满足以下几条性质,称(V,F,[]) 为一个李代数,记作g" role="presentation" style="position: relative;">g

    • 封闭性
    • 双线性
    • 自反性
    • 雅可比等价性

    三维旋转群与对应的李代数

    SO(3)" role="presentation" style="position: relative;">SO(3) 对应的李代数是定义在R3" role="presentation" style="position: relative;">R3上的向量,我们记作ϕ" role="presentation" style="position: relative;">ϕ(注意这是个向量)。根据前面的推导,每个ϕ" role="presentation">ϕ都可以生成一个反对称矩阵:

    Φ=ϕ=[0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10]R3×3" role="presentation">Φ=ϕ=[0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10]R3×3

    在此定义下,两个向量ϕ1,ϕ2的李括号为:

    [ϕ1,ϕ2]=Φ1Φ2Φ2Φ1" role="presentation">[ϕ1,ϕ2]=Φ1Φ2Φ2Φ1

    所以三维旋转群与对应的李代数so(3)" role="presentation">so(3)

    so(3)={Φ=ϕR3×3|ϕR3}" role="presentation">so(3)={Φ=ϕR3×3|ϕR3}

    至此,我们已清楚so(3)" role="presentation" style="position: relative;">so(3)的结构。它们是一个由三维向量组成的集合,每个向量对应到一个反对称矩阵,可以表达旋转矩阵的导数。

    三维欧氏群与对应的李代数

    SE(3)={T=[Rt0T1]R4×4|RSO(3),tR3}" role="presentation">SE(3)={T=[Rt0T1]R4×4|RSO(3),tR3}

    每个变换矩阵有六个自由度,故对应的李代数位于R6" role="presentation" style="position: relative;">R6,但是∧不再对应到一个反对称关系,而是:

    ξ=[ρϕ]=[ϕρ0T0]=Ξ" role="presentation">ξ=[ρϕ]=[ϕρ0T0]=Ξ

    ξ" role="presentation" style="position: relative;">ξ的前三维为旋转向量,后三维为平移向量,其定义也十分的直观。该李代数对应于微分方程:

    T˙(t)=ξ(t)T(t)" role="presentation">T˙(t)=ξ(t)T(t)

    因此,

    T(t)=exp(ξ(t))T(t)" role="presentation">T(t)=exp(ξ(t))T(t)

    指数映射和对数映射

    • 任意矩阵的指数映射
      它可以写成一个泰勒展开,但是只有在收敛的情况下才会有结果,其结果仍是一个矩阵。
    exp(A)=n=01n!An" role="presentation">exp(A)=n=01n!An
    • so(3)" role="presentation" style="position: relative;">so(3)中的指数映射
      因此,对so(3)" role="presentation" style="position: relative;">so(3)中任意一元素ϕ" role="presentation" style="position: relative;">ϕ,我们亦可按此方式定义它的指数映射:
    exp(ϕ)=n=01n!(ϕ)n" role="presentation">exp(ϕ)=n=01n!(ϕ)n

    由于ϕ" role="presentation" style="position: relative;">ϕ是三维向量,我们可以定义它的模长和它的方向,分别记作θ" role="presentation" style="position: relative;">θa" role="presentation" style="position: relative;">a(注意这里记号是有含义的,此时a" role="presentation" style="position: relative;">a是一个单位长度的向量),则我们可以得到:

    exp(θa)=cosθI+(1cosθ)aaT+sinθa" role="presentation">exp(θa)=cosθI+(1cosθ)aaT+sinθa

    它和罗德里格斯公式(参观本系列第一篇)如出一辄。这表明,so(3)" role="presentation" style="position: relative;">so(3)实际上就是由所谓的旋转向量组成的空间(注意,SO(3)是旋转矩阵群)。通过罗德里格斯公式或者指数映射,我们把R3 中的一个向量对应到了一个位于SO(3)中的3D旋转。说明李代数so(3)" role="presentation" style="position: relative;">so(3)里的向量,其方向指向旋转轴,而模长表示转过的角度。因此,平时用的rpy欧拉角,实际上是李代数之一。
    对应的,如果定义对数映射,我们也能把SO(3)中的元素对应到so(3)" role="presentation" style="position: relative;">so(3)中:

    ϕ=ln(R)=(n=0(1)nn+1(RI)n+1)" role="presentation">ϕ=ln(R)=(n=0(1)nn+1(RI)n+1)

    其中∨表示从反对称矩阵到向量的对应关系,为∧的逆运算。SO(3)" role="presentation" style="position: relative;">SO(3)so(3)" role="presentation" style="position: relative;">so(3)旋转向量与旋转矩阵很相似,而指数映射即是罗德里格斯公式。旋转向量可以视为旋转矩阵的导数,指导如何在旋转矩阵中进行微积分运算。

    • se(3)" role="presentation" style="position: relative;">se(3)中的指数映射
    exp(ξ)=[n=01n!(ϕ)nn=01(n+1)!(ϕ)nρ0T1]=[ΦJρ0T1]" role="presentation">exp(ξ)=[n=01n!(ϕ)nn=01(n+1)!(ϕ)nρ0T1]=[ΦJρ0T1]

    左上角的Φ" role="presentation" style="position: relative;">Φ是我们熟知的so(3)" role="presentation" style="position: relative;">so(3)中的元素,前文已经介绍过了。而右上角的J" role="presentation" style="position: relative;">J则可整理为(设ϕ=θa" role="presentation" style="position: relative;">ϕ=θa):

    J=sinθθI+(1sinθθ)aaT+1cosθθa" role="presentation">J=sinθθI+(1sinθθ)aaT+1cosθθa

    BCH近似

    我们想要知道当李群发生乘法时,李代数上是不是发生加法,即:

    exp(ϕ1)exp(ϕ2)=exp((ϕ1+ϕ2))" role="presentation">exp(ϕ1)exp(ϕ2)=exp((ϕ1+ϕ2))

    是否成立?他们并不成立,BCH给出了答案:

    ln(exp(A)exp(B))=n=1(1)n1nri+si>0,i[1,n](i=1n(ri+si))1i=1nri!si![Ar1Bs1Ar2Bs2ArnBsn]" role="presentation">ln(exp(A)exp(B))=n=1(1)n1nri+si>0,i[1,n](i=1n(ri+si))1i=1nri!si![Ar1Bs1Ar2Bs2ArnBsn]

    这里给出BCH的近似:

    ln(exp(A)exp(B))=A+B+12[A,B]+112[A,[A,B]]112[B,[A,B]]+" role="presentation">ln(exp(A)exp(B))=A+B+12[A,B]+112[A,[A,B]]112[B,[A,B]]+

    其中,[A,B]=ABBA" role="presentation" style="position: relative;">[A,B]=ABBA
    特别地,在SO(3)上,我们可以求它关于某一个变量的一阶近似:

    ln(R1R2){Jl(ϕ2)1ϕ1+ϕ2Jr(ϕ1)1ϕ2+ϕ1" role="presentation">ln(R1R2){Jl(ϕ2)1ϕ1+ϕ2Jr(ϕ1)1ϕ2+ϕ1

    ϕ1" role="presentation" style="position: relative;">ϕ1 较小时,使用第一个式;在在$ ϕ2 $较小时,使用第二个式。这里的 Jl" role="presentation" style="position: relative;">Jl 和 $J_r $也称为左/右雅可比——从而李代数就分成了左右两种模型:

    Jl=J=n=01(n+1)!(ϕ)n,Jr=J(ϕ)" role="presentation">Jl=J=n=01(n+1)!(ϕ)n,Jr=J(ϕ)
    ln(ΔRR)=ϕ+Jl1(ϕ)Δϕ" role="presentation">ln(ΔRR)=ϕ+Jl1(ϕ)Δϕ

    因此,

    exp(Δϕ)exp(ϕ)=ΔRR=exp(ϕ+Jl1(ϕ)Δϕ)" role="presentation">exp(Δϕ)exp(ϕ)=ΔRR=exp(ϕ+Jl1(ϕ)Δϕ)

    我们将Jl1(ϕ)Δϕ" role="presentation" style="position: relative;">Jl1(ϕ)Δϕ看作Δϕ" role="presentation" style="position: relative;">Δϕ,则有

    exp(ϕ+Δϕ)=exp(JlΔϕ)exp(ϕ)" role="presentation">exp(ϕ+Δϕ)=exp(JlΔϕ)exp(ϕ)
    因此,当我们在李代数上进行加法,则可以近似为李群上带左右雅可比的乘法。
    相当于左乘一个 Jlϕ" role="presentation" style="position: relative;">Jlϕ 对应的旋转阵。类似地,由于左右对称,有:

    exp(ϕ+δϕ)=exp(Jlδϕ)exp(ϕ)=exp(ϕ)exp(Jrδϕ)" role="presentation">exp(ϕ+δϕ)=exp(Jlδϕ)exp(ϕ)=exp(ϕ)exp(Jrδϕ)

    在BCH线性近似的意义下,李群与李代数微小量之间只差一个雅可比矩阵。当区别左右乘时,这两个雅可比自变量差一个符号。

    微分模型和扰动模型

    d(RP)dR=limΔR0(R+ΔR)PRPΔR" role="presentation">d(RP)dR=limΔR0(R+ΔR)PRPΔR

    为了解决这个问题,有两种方式:

    • 一是把增量定义在李代数上,对应于微分模型;
    • 二是把增量直接乘在R上,对应于扰动模型。
    定义在李代数上的增量

    在这个意义下,导数的含义为:

    d(RP)dϕ=limδϕ0exp(ϕ+δϕ)Pexp(ϕ)Pδϕ=limΔϕ0(exp(Jlδϕ)1)exp(ϕ)Pδϕ=(RP)Jl" role="presentation">d(RP)dϕ=limδϕ0exp(ϕ+δϕ)Pexp(ϕ)Pδϕ=limΔϕ0(exp(Jlδϕ)1)exp(ϕ)Pδϕ=(RP)Jl
    定义在李群上的乘增量

    另一种方式是将小量乘在李群上,而非加在李代数上。这种方式定义的模型称为扰动模型。由于左右的差异,需要区别这个增量是左乘在旋转阵,还是右乘在旋转阵上的。如果使用左乘,那么导数的含义为:

    d(RP)dR=limδϕ0exp(δϕ)RPRPδϕ=limΔϕ0(exp(δϕ)1)RPδϕ=(RP)" role="presentation">d(RP)dR=limδϕ0exp(δϕ)RPRPδϕ=limΔϕ0(exp(δϕ)1)RPδϕ=(RP)

    可见,由于我们把小量乘在李群上(而非加在李代数上),结果中的导数将少一个雅可比矩阵。因此,扰动模型计算更为简洁,在实际上更加常用。

  • 相关阅读:
    SpringBoot集成security
    Linux:丢包检查工具,dropwatch
    代码杂谈 之 pyspark如何做相似度计算
    命令执行(rce)
    ROS源代码阅读(1)
    linux等保整改
    网上期货开户高效方便简单
    prompt learning受控文本生成作诗
    C/C++结构体给函数传参
    Sa-Token
  • 原文地址:https://blog.csdn.net/qq_44711190/article/details/127127334