一、slam中的李群
1、群的定义
群是一种集合集合加上一种运算的代数结构。要满足:封闭性、结合律、幺元和逆。
2、旋转和群
三维空间中,描述一个物体的旋转(此处仅考虑刚体),旋转的表示有如下几种:旋转矩阵,四元数,欧拉角。其中旋转矩阵是一种特殊正交群,记为SO(3),而用旋转矩阵表示旋转有一点小瑕疵,故我们引入了欧拉角和四元数,并学习使用她们计算旋转,理解她们和群之间的联系。
旋转矩阵:
首先,我们有一个世界坐标系,该坐标系是恒定不变的,然后我们选择一个刚体,比如,一个诺基亚,我们将其抛入空中,假设其由姿态A变为姿态B(此处不考虑平移,仅考虑旋转)。那么,我们可以通过这样一种方式来描述旋转,选择一个相对于世界坐标系固定的 point
a
,通过 point
a
相对于诺基亚视角中的位置变化来描述旋转,即我们以诺基亚机身的中点为原点构建一个三维坐标系,则 point
a
在诺基亚旋转前后的坐标可记为
[x0,y0,z0]T
和
[x1,y1,z1]T
,请记住,point
a
在世界坐标系中并未改变,坐标的改变是由于坐标系的变化,即
[x0,y0,z0]T
和
[x1,y1,z1]T
使用的并不是同一组正交基(相对于世界坐标),我们记为
[e1,e2,e3]
,和
[e1',e2',e3']
,利用 point
a
在世界坐标系中的不变性,我们得到如下等式:
[e1,e2,e3][x0,y0,z0]T=[e1',e2',e3'][x1,y1,z1]T……式1
注意,这里的
[e1,e2,e3]
是一个
3X3
的矩阵,且
e1 e2 e3
为正交基向量,由正交基性质易得:
[e1T,e2T,e3T]T[e1,e2,e3]=I……式2
在式1两边左乘
[e1T,e2T,e3T]T
则得到下式:
[x0,y0,z0]T=[e1T,e2T,e3T]T[e1',e2',e3'][x1,y1,z1]T……式3
其中我们将矩阵
[e1T,e2T,e3T]T[e1',e2',e3']
记为
R
,称为旋转矩阵。而这旋转矩阵正是一种群,我们称之为特殊正交群。
欧拉角:
在引入欧拉角之前,我们先来考虑一个最简单的旋转—绕某一轴的旋转,这种旋转我们可以简单的用外积来表示,即用一个向量来表示,该向量可表示为
aθ
。(其实,对于任意一个旋转,一定可以看成是绕某个轴的旋转,这里便于叙述,不细讲)
我们不难想象,任意的一个旋转总能分解为绕一组正交基的三次旋转,特别的,当我们用三次连续的依次绕ZYX轴旋转时,得到的
θ1,θ2,θ3
分为称为偏航角yaw,俯仰角pitch和滚转角roll,注意,此处强调连续,是指每次旋转后的正交基都发生了改变,故三个角度分别以最开始的坐标轴,绕Z轴旋转后的坐标轴,和再绕Y轴旋转后的坐标轴为坐标系。(ZYX这一顺序只是我们最常用的一种欧拉角,也可能采用其他顺序)
那么如何将欧拉角与旋转矩阵或者说群联系起来呢,一个绕X,Y,Z轴的旋转,可以分别用旋转矩阵
R(θx) R(θy) R(θz)
来描述:
Rx(θ)=⎡⎣⎢⎢1000cosθsinθ0−sinθcosθ⎤⎦⎥⎥
Ry(θ)=⎡⎣⎢⎢cosθ0−sinθ010sinθ0cosθ⎤⎦⎥⎥
Rz(θ)=⎡⎣⎢⎢cosθsinθ0−sinθcosθ0001⎤⎦⎥⎥
根据我们使用的欧拉角的不同,如ZYX欧拉角,则旋转矩阵
R=Rx(θ)Ry(θ)Rz(θ)
,则我们通过这一转换式将欧拉角与李群联系在了一起。
欧拉角一个重大缺点是会面临万向锁难题,即在俯仰角pitch为
±90。
时,第一次旋转和第三次旋转将绕同一轴,这将会导致用欧拉角描述旋转时损失一个自由度。
四元数:
我们发现,使用旋转矩阵描述旋转时会产生冗余(用
3X3
的矩阵即9个值去描述一个自由度为3的运动),而使用欧拉角(3个值描述自由度为3的运动)会面临万向锁难题,那么有没有折中的办法呢,四元数便是这样一个解决方案。
四元数是一种扩展的复数,用她来描述三维空间的旋转时既是紧凑的也是没有奇异性的,一个四元数
q
看起来应该是这样的
q=q0+q1i+q2j+q3k
,对于
i j k
,我们有轮换式
ab=−c
和
i2=j2=k2=−1
。
完整的四元数解释过于复杂,我们需要做的只有两件事:(1)找到四元数表示旋转的方法 (2)知道表示旋转时四元数必要的运算方法
四元数的四则运算、共轭、模长计算与复数无异,不再赘述;四元数具有点乘运算,和matlab中矩阵点乘运算一样,对应位置数值相乘即可;一个四元数的逆
q−1=q∗/||q||2
。
通常我们将旋转向量和四元数关联在一起。对于一个
aθ
的旋转向量来说,当
a=[nx,ny,nz]
时,我们可以得到
q=cosθ2+nxsinθ2i+nysinθ2j+nzsinθ2k
(
θ
加上
2π
表示同一个旋转,
q
却变为
−q
),反之我们可以得到
⎧⎩⎨⎪⎪θ=2arcosq0[nx,ny,nz]T=[q1,q2,q3]T/sinθ2
那么问题来了,我们怎么去计旋转呢,与旋转矩阵类似,我们同样通过描述一个世界坐标系的不变点在旋转前后的刚体坐标系的坐标变化来描述旋转:
首先用一个虚四元数来描述坐标
p=[0,x,y,z]T
然后用上述方法描述旋转
q=[cosθ2,nxsinθ2i,nysinθ2j,nzsinθ2k]
则有
p′=qpq−1
知道了如何用四元数计算旋转,那么我们能否将四元数和群关联起来呢,有了四元数和旋转向量的转换式,似乎不难算出旋转矩阵,但计算过程过于麻烦,这里给出较为简洁的四元数和旋转矩阵的转换公式(公式不唯一):
R=⎡⎣⎢⎢⎢1−2q22−2q232q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q21−2q232q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q21−2q22⎤⎦⎥⎥⎥
q0=tr(R)+1‾‾‾‾‾‾‾‾√2,q1=m23−m324q0,q2=m31−m134q0,q3=m12−m214q0
当
q0
接近0时,分量会变得特别大,导致解不稳定,应换用其他方法。
旋转向量和旋转矩阵:
我们使用罗德里格斯公式将旋转向量转化为旋转矩阵:
R=cosθI+(1−cosθ)nnT+sinθn̂
紧接着给出从旋转矩阵到旋转向量的表达式:
⎧⎩⎨⎪⎪θ=arcos(tr(R)−12)Ra=a
即转轴\textbf{a}是矩阵R特征值1对应的特征向量。
变换和群
我们用一个旋转矩阵来描述刚体在三维空间的旋转,而刚体在三维空间的运动可以看作是旋转+平移,为了使得这种变换是线性的,我们引入了齐次坐标,并且靠其得到了变换矩阵,变换矩阵便是一种特殊欧氏群,记为SE(3)。
旋转+平移看起来应该是这样的:
p′=Rp+t
我们发现这种变化不是线性的。
为此我们引入了齐次坐标:
[p′1]=[R0Tt1][p1]=T[p1]
我们把矩阵T称为变换矩阵。我们给出变换矩阵的逆:
T−1=[RT0T−RTt1]
二、slam中的李代数
1、李代数的定义
李代数由一个集合V,一个数域F和一个二元运算[,](李括号)组成,需满足封闭性、双线性、自反性和雅可比等价。
(下面两个小结建议先看完三再看)
2、BCH公式的近似形式
对于旋转矩阵R和旋转向量Φ来说,我们难免产生一些想法,旋转矩阵连续左乘可以看作是多次连续的旋转,那么旋转向量合成是否也能看成是多次连续的旋转呢?也就是说两个旋转向量的和向量的指数映射是否等于两个旋转向量对应的旋转矩阵的乘积?
答案,是否定的。
首先给出三个结论:
ln(exp(Φ1^)exp(Φ2^))≈⎧⎩⎨⎪⎪(Jl(Φ2)−1Φ1+Φ2^) 当Φ1为小量(Jl(Φ1)−1Φ2+Φ1^) 当Φ2为小量
exp(ΔΦ̂ )exp(Φ̂ )=exp((Φ+J−1l(Φ)ΔΦ)^)
exp((ΔΦ+Φ)^)=exp((JlΔΦ)^)exp(Φ̂ )=exp(Φ̂ )exp((JrΔΦ)^)
其中:
⎧⎩⎨⎪⎪⎪⎪J=sinθθI+(1−sinθθ)aaT+1−cosθθâ J=θ2cotθ2I+(1−θ2cotθ2)aaT−θ2â Jr(Φ)=Jl(-Φ)
3、李代数的求导
由于观测噪声的存在,观测值和实际值总会存在误差,为了使该误差最小,便要对李代数进行求导。求导的方法有二:1.根据李代数加法对李代数进行求导 2.对李代数左乘或右乘微小扰动,对该扰动进行求导。
SO(3)上李代数的求导:
这里让旋转后的坐标对旋转求导,直接给出结论:
d(Rp)dΦ=(−Rp)^Jl
扰动模型(左乘):
设
ΔR
对应的李代数为
φ
,结论:
d(Rp)dφ=(−Rp)^
SE(3)上李代数的求导:
这里让变换后的坐标对变换扰动求导,记
ΔT=exp(δξ̂ )
,结论:
d(Tp)dδξ=[I0T−(Rp+t)^0T]
三、李群和李代数的联系
1、从李群到李代数
旋转矩阵R是正交矩阵,则
RRT=I
,当我们把
R
看作关于时间的函数,则有
R(t)R(t)T=I
,同时对等式两边求导,则
R′(t)R(t)T=−(R′(t)R(t)T)T
,即
R′(t)R(t)T
为反对称矩阵,反对成矩阵都可以和向量相互转换,则
R′(t)R(t)T
可以表示为
Φ̂
,而
Φ
就是一种李代数,在这里其就是
R
对应的旋转向量,记作
??(3)
,位于
ℝ3
空间。
而变换矩阵对应的李代数,位于
ℝ6
,记作
??(3)
,对于其中每一个元素
ξ
有
ξ=[ρΦ]
前三维为平移(不同于t),后三维为旋转(就是旋转向量)。
2、指数映射和对数映射
SO(3)上的指数映射和
??(3)
上的对数映射:
首先给出SO(3)上的指数映射公式:
R=exp(Φ̂ )
接着给出指数映射的定义:
exp(A)=∑n=0∞1n!An
即任意矩阵的指数映射可以写成一个泰勒展开,但是只有收敛时才有结果。
接着直接给出SO(3)上指数映射的推导结果(其实就是泰勒展开加上
Φ=θa
â â =aaT−I
以及
â â â =−â
):
R=exp(Φ̂ )=cosθI+(1−cosθ)aaT+sinθâ
很眼熟,对了,这就是罗德里格斯公式,即SO(3)上的指数映射就是罗德里格斯公式
。
既然指数映射是罗德里格斯公式,那么对数映射不难想象:
⎧⎩⎨⎪⎪θ=arcos(tr(R)−12)Ra=a
SE(3)上的指数映射和
??(3)
上的对数映射:
同样,这里直接给出SE(3)上指数映射的公式:
T=exp(ξ̂ )=[exp(Φ̂ )0TJρ1]
其中
J=sinθθI+(1−sinθθ)aaT+1−cosθθâ
即得到
t=Jρ,R=exp(Φ̂ )
类似于上的对数映射:
⎧⎩⎨⎪⎪⎪⎪θ=arcos(tr(R)−12)Ra=aΦ=θat=Jρ
即可得到
Φ
和
ρ