本博客是在学习高翔《视觉SLAM十四讲》过程中对位姿变换与李群李代数相关知识点做的总结,不涉及公式的证明与推导。
一、位姿变换
1、旋转矩阵与变换矩阵
旋转矩阵是描述刚体旋转最常见的一种形式,而变换矩阵通常是指旋转矩阵与平移向量组成的齐次变换矩阵。对于三维空间的位姿变换,有旋转矩阵:
R=[r1r2r3]=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥
平移向量:
t=[t1t2t3]T
则旋转矩阵R 与平移向量t 组成的齐次变换矩阵为:
T=[R0Tt1]=⎡⎣⎢⎢⎢⎢r11r21r310r12r22r320r13r23r330t1t2t31⎤⎦⎥⎥⎥⎥
旋转矩阵R 是一种单位正交阵,它具有单位正交阵所有的性质:
{r1T⋅r2=r1T⋅r3=r2T⋅r3=0∥r1∥=∥r2∥=∥r3∥=det(R)=1
重要的是,旋转矩阵的逆等于旋转矩阵的转置,即R−1=RT ,从而有RR−1=RRT=I 。齐次变换矩阵T 的逆为:
T−1=[R−10T−R−1t1]=[RT0T−RTt1]
假设我们由座标系A经过变换矩阵TABT=[R0Tt1] 得到了座标系B,那么座标系B下的点PBP 可在座标系A中表示为:
PAP=TABTPBP=[R0Tt1][PBP1]=RPBP+t
同样,座标系A下的点PAP 可在座标系B中表示为:
PBP=TBATPAP=TABT−1PAP=[RT0T−RTt1][PAP1]=RTPAP−RTt=RT(PAP−t)
2、欧拉角与旋转矩阵
欧拉角是描述刚体旋转最直观的一种形式,它往往只用于可视化的人机交互,而无法直接参与运算。
对于三维空间座标系,我们通常这样规定:
⎧⎩⎨绕 X 轴旋转的角度称为横滚角,Roll绕 Y 轴旋转的角度称为俯仰角,Pitch绕 Z 轴旋转的角度称为偏航角,Yaw
所有的旋转,沿着旋转轴方向顺时针旋转的角度为正,逆时针旋转的角度为负。对于平移,沿着该轴正方向平移的距离为正,负方向平移的距离为负。
设刚体绕着Z 轴旋转γ 角度,那么刚体上所有点的z 座标值不变,x 与y 的座标值分别变为:
x′=ρcos(θ+γ)=ρ(cosθ⋅cosγ−sinθ⋅sinγ)=x⋅cosγ−y⋅sinγy′=ρsin(θ+γ)=ρ(cosθ⋅sinγ+sinθ⋅cosγ)=x⋅sinγ+y⋅cosγ
写成矩阵的形式:
⎡⎣⎢x′y′z′⎤⎦⎥=⎡⎣⎢cosγsinγ0−sinγcosγ0001⎤⎦⎥⎡⎣⎢xyz⎤⎦⎥=RZ(γ)⎡⎣⎢xyz⎤⎦⎥
从而,我们总结出欧拉角与旋转矩阵的关系:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪Roll:RX(α)=rotx(α)=⎡⎣⎢1000cosαsinα0−sinαcosα⎤⎦⎥Pitch:RY(β)=roty(β)=⎡⎣⎢cosβ0−sinβ010sinβ0cosβ⎤⎦⎥Yaw:RZ(γ)=rotz(γ)=⎡⎣⎢cosγsinγ0−sinγcosγ0001⎤⎦⎥
有了欧拉角与旋转矩阵之间的转换关系,下面举一个简单的例子验证一下:
如上图所示,有位于立方体顶点上的三个座标系O1 、O2 、O3 ,以及位于立方体中心的点P ,立方体的边长分别为6、8、10。下面先进行三个座标系之间的变换:
O1→O2 :
相对变换:O1 先沿着座标轴O1X1 的正方向平移10个单位到达O2 ,然后绕着当前位置的O1Z1 轴顺时针旋转90°,此时新得到的O1 与O2 座标系完全重合,即完成了O1 到O2 的座标系变换。以上过程可以在MATLAB中用变换矩阵表述为:
T12T=transl(10,0,0)*trotz(pi/2)=⎡⎣⎢⎢⎢10000100001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥
绝对变换:O1 先绕着座标轴O1Z1 顺时针旋转90°,然后沿着原来O1X1 轴的正方向平移10个单位到达O2 ,此时新得到的O1 与O2 座标系完全重合,即完成了O1 到O2 的座标系变换。以上过程可以在MATLAB中用变换矩阵表述为:
T12T′=transl(10,0,0)*trotz(pi/2)=⎡⎣⎢⎢⎢10000100001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥=T12T
你可能会问,两次不同的操作为什么表达式是一样的?原因是这里牵涉到相对变换与绝对变换的区别:
⎧⎩⎨相对变换:每一步都以新得的坐标系为参考,每一步得到的变换矩阵依次右乘;绝对变换:始终以最初的坐标系为参考,通常是先旋转再平移,每一步得到的变换矩阵依次左乘;相对变换与绝对变换不可同时使用!
当然,O1→O2 的相对变换还可以有很多种操作顺序,比如:
T12T′′=trotz(pi/2)*transl(0,-10,0)=⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢1000010000100−1001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥=T12T
等等,这里不再一一列举。
O2→O1 :
相对变换:
T21T=transl(0,10,0)*trotz(-pi/2)=⎡⎣⎢⎢⎢10000100001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥=trotz(-pi/2)*transl(-10,0,0)=⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢100001000010−10001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥
绝对变换:
T21T′=transl(0,10,0)*trotz(-pi/2)=⎡⎣⎢⎢⎢10000100001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥=T21T
相信这些表达式的意义都很容易理解,接下来验证一下T12T 与T21T 是不是互逆:
T12TT21T=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢1000010000100001⎤⎦⎥⎥⎥=I
显然,O1→O2 与O2→O1 互为逆变换,T12T 与T21T 互逆。其实,由O1 到O2 的变换矩阵就是对座标系O2 在座标系O1 中位姿的一种描述,即T12T 描述了O2 在O1 中的位置和姿态。同理,T21T 描述了O1 在O2 中的位置和姿态。那么,我们已经知道了点P 在O1 座标系下的座标为P1P=(5,4,3)T ,座标系O1 在座标系O2 下的位姿为T21T ,顺理成章地,我们就可以求得点P 在O2 座标系下的座标为:
P2P=T21TP1P=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢5431⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
很显然,结果跟事实是一致的。
O2↔O3 :
T23T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥T32T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥T23TT32T=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥2=⎡⎣⎢⎢⎢1000010000100001⎤⎦⎥⎥⎥=IP3P=T32TP2P=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
O1→O3 :
T13T=transl(10,8,6)*trotz(pi/2)*troty(pi)=trotz(-pi/2)*trotx(pi)*transl(-8,-10,-6)=T12TT23T=⎡⎣⎢⎢⎢0−100−100000−1010861⎤⎦⎥⎥⎥P3P=T31TP1P=T13T−1P1P=⎡⎣⎢⎢⎢0−100−100000−1081061⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢5431⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
3、旋转向量与旋转矩阵
旋转向量(或称轴角,Axis-Angle),是一种定义在R3 上的三维向量(对于三维空间的旋转来说),它可以描述刚体在三维空间中绕任意旋转轴发生的旋转。旋转向量的方向代表旋转轴的方向,它的模代表旋转的角度。对于一个旋转轴为n (∥n∥=1 ),转角为θ 的旋转向量θn (θ 单位为弧度),它与旋转矩阵R 的关系为:
旋转向量到旋转矩阵
R=I+sinθn∧+(1−cosθ)n∧2=cosθI+sinθn∧+(1−cosθ)nnT(罗德里格斯公式)
这里的n∧ 为n=[nxnynz]T 所对应的反对称矩阵:
n∧=⎡⎣⎢0nz−ny−nz0nxny−nx0⎤⎦⎥
且n∧2=n∧n∧=nnT−I ,n∧3=−n∧
旋转矩阵到旋转向量
⎧⎩⎨⎪⎪θ=arccos(tr(R)−12)Rn=n
其中,tr(R) 表示旋转矩阵R 的迹。旋转轴n 其实就是矩阵R 特征值1所对应的特征向量。
4、四元数与旋转向量
不得不指出的是,旋转矩阵具有冗余性,而欧拉角和旋转向量都具有奇异性,只有四元数(Quaternions)可以完美地描述一个刚体在三维空间的旋转。
通常,我们用单位四元数q=qw+qxi+qyj+qzk 表示三维空间中任意一个旋转,写成向量的形式:
q=[qwqxqyqz]T或q=[qxqyqzqw]T
单位四元数q 与旋转向量θn 的关系:
θn=θ[nxnynz]T=2arccosqw[qxsinθ2qysinθ2qzsinθ2]T(四元数到旋转向量)
qw=cosθ2,qx=nxsinθ2,qy=nysinθ2,qz=nzsinθ2(旋转向量到四元数)
单位四元数q 与旋转矩阵R 的关系:
R=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥=⎡⎣⎢1−2(q2y+q2z)2(qxqy+qwqz)2(qxqz−qwqy)2(qxqy−qwqz)1−2(q2x+q2z)2(qyqz+qwqx)2(qxqz+qwqy)2(qyqz−qwqx)1−2(q2x+q2y)⎤⎦⎥(四元数到旋转矩阵)
qw=tr(R)+1−−−−−−−−√2,qx=r23−r324qw,qy=r31−r134qw,qz=r12−r214qw(旋转矩阵到四元数)
二、李群与李代数
1、什么是李群
群(Group)是一种集合加上一种运算的代数结构,李群(Lie Group)是指具有连续(光滑)性质的群。三维空间中的旋转矩阵R∈SO(3) 和变换矩阵T∈SE(3) 都属于李群,它们也都有各自的名字:SO(n) 称为特殊正交群(Special Orthogonal Group,或称旋转矩阵群),SE(n) 称为特殊欧式群(Special Euclidean Group,或称欧式变换群),这里的n 不限制为3。
SO(3)={R∈R3×3|RRT=I,det(R)=1}SE(3)={T=[R0Tt1]∈R4×4|R∈SO(3),t∈R3}
重要的是,李群中的旋转矩阵群与欧式变换群对加法是不封闭的,只对乘法封闭,即:
R1+R2∉SO(3),T1+T2∉SE(3)R1R2∈SO(3),T1T2∈SE(3)
所以,刚体之间的位姿变换都是用乘法而不是用加法。
2、什么是李代数
简单地说,李代数(Lie Algebra)就是李群的导数,它描述了李群的局部性质,是定义在李群正切空间(Tangent Space)上的一组向量。旋转矩阵群SO(3) 与欧式变换群SE(3) 对应的李代数分别为:
so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3}se(3)={ξ=[ρϕ]∈R6,ρ∈R3,ϕ∈so(3),Ξ=ξ∧=[ϕ∧0Tρ1]∈R4×4}
这里,ϕ=θn 其实就是定义在R3 上的旋转向量,Φ=ϕ∧ 是其所对应的反对称矩阵。
3、李群与李代数之间的转换
SO(3)⇔so(3)⎧⎩⎨⎪⎪⎪⎪SO(3)−→−−−−对数映射so(3):ϕ=ln(R)∨so(3)−→−−−−指数映射SO(3):R=exp(ϕ∧)=eΦ
SE(3)⇔se(3)⎧⎩⎨⎪⎪⎪⎪SE(3)−→−−−−对数映射se(3):ξ=ln(T)∨se(3)−→−−−−指数映射SE(3):T=exp(ξ∧)=eΞ
参考文献
[1] https://blog.csdn.net/csxiaoshui/article/details/65437633
[2] 高翔, 张涛. 视觉SLAM 十四讲[M]. 电子工业出版社, 2017.
[3] https://blog.csdn.net/tms_li/article/details/78599748?locationNum=4&fps=1