机器人中的李代数是什么
目的
很多机器人的初学者在第一次接触到李群和李代数时通常会感到困惑,它们到底有什么物理意义?有没有通俗易懂的、直观的解释。本文尝试从几个角度对李代数进行解读。
1 “角速度”解释
我们先考虑简单的直线运动。已知一个物体在当前时刻的位置是 ppp ,而速度是 vvv。如果我们想知道经过一个很小的时间间隔 dtdtdt 之后物体到达的位置,应该如何计算呢?我们可以用当前时刻的速度进行估计,dtdtdt 之后物体到达的位置(我们用p′p^\primep′表示)是:
p′=p+v⋅dt(1)
\begin{aligned}\tag{1}
p^\prime=p+v \cdot dt\\
\end{aligned}
p′=p+v⋅dt(1)

现在考虑物体做旋转运动。同样的,已知物体在当前时刻的姿态是 III ,而旋转速度是 XXX。如果我们想知道经过一个很小的时间间隔 dtdtdt 之后物体的姿态,应该如何计算呢?思路是一样的,我们利用当前时刻的旋转速度进行估计(我们用R′R^\primeR′表示),计算方式如下式。
R′=I+X⋅dt(2) \begin{aligned}\tag{2} R^\prime=I+X \cdot dt\\ \end{aligned} R′=I+X⋅dt(2)

在数学中,一般用大写字母表示矩阵,小写字母表示矢量。位置是一个矢量,所以一般用小写字母来表示(例如前面的ppp)。在机器人领域,通常用一个被称为旋转矩阵的东西表示物体的姿态,所以用大写字母表示物体的姿态(例如前面的III和R′R^\primeR′)。
这个旋转速度XXX就是一个李代数,它也是一个矩阵。
李代数经常被描述为李群的切空间,这是为什么呢?通过上面的例子就容易猜到了。物体在做直线运动时,速度就是位置曲线的切线斜率,这个切线所在的空间就是位置的切空间。旋转运动类似,旋转速度也位于切空间。由于李群SO(3)SO(3)SO(3)是一个四维空间中的三维弯曲球面,我们无法在三维空间中展示出来,因此这里使用三维空间中的二维弯曲球面进行示意。

2 “无穷小旋转矩阵”解释
李群的创立者索菲斯·李为了研究无穷小变换发明了李代数这个概念,所以李代数就是无穷小旋转矩阵。对于一个很小的李代数XXX,我们想用它构造一个很小的旋转RRR,可以这样做(III是个单位矩阵):
R=I+X(3) \begin{aligned}\tag{3} R=I+X\\ \end{aligned} R=I+X(3)
在使用旋转矩阵的时候,我们很少看到矩阵之间的加法。旋转矩阵之间不能相加,因为没有意义。但是这里确实可以,因为这里李代数是个无穷小量。而无穷小量的计算似乎遵守另一套逻辑。暂时不管这么多了,往下算就是了。
举个具体的例子,对于很小的李代数XXX
X=[0−0.030.020.030−0.01−0.020.010](4) \begin{aligned}\tag{4}
X= \begin{bmatrix}
0 & -0.03 &0.02 \\
0.03 & 0 & -0.01\\
-0.02 &0.01 & 0
\end{bmatrix}\\ \end{aligned} X=00.03−0.02−0.0300.010.02−0.010(4)
我们计算乘积RRTRR^\textup{T}RRT,结果如下。可以发现,乘积RRTRR^\textup{T}RRT很接近单位矩阵。所以,RRR确实可以近似看成是一个旋转矩阵。
RRT=(I+X)(I+X)T=[1−0.030.020.031−0.01−0.020.011]⋅[1−0.030.020.031−0.01−0.020.011]T=[1.0013−0.0002−0.0003−0.00021.001−0.0006−0.0003−0.00061.0005]≈[100010001](5) \begin{aligned}\tag{5} & RR^{\mathrm{T}}\\ = & (I+X)(I+X)^{\mathrm{T}} \\ = &\left[\begin{array}{ccc} 1 & -0.03 &0.02 \\ 0.03 & 1 & -0.01\\ -0.02 &0.01 & 1 \end{array}\right] \cdot \left[\begin{array}{ccc} 1 & -0.03 &0.02 \\ 0.03 & 1 & -0.01\\ -0.02 &0.01 & 1 \end{array}\right]^\textup{T} \\ =& \left[\begin{array}{ccc} 1.0013 & -0.0002&-0.0003 \\ -0.0002&1.001&-0.0006\\ -0.0003&-0.0006&1.0005 \end{array}\right] \\ \approx &\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] \end{aligned} ===≈RRT(I+X)(I+X)T10.03−0.02−0.0310.010.02−0.011⋅10.03−0.02−0.0310.010.02−0.011T1.0013−0.0002−0.0003−0.00021.001−0.0006−0.0003−0.00061.0005100010001(5)
我们说“近似”是,那什么时候才真正是呢?这就要用到指数映射了。假如我们再加一项,用I+X+X22I+X+\frac{X^2}{2}I+X+2X2表示RRR,会发现得到结果比上面的更接近单位矩阵 III 了。所以下面有请好朋友——指数映射登场。
RRT=(I+X+X22)(I+X+X22)T=[10.000000070.0000001050.0000000710.000000210.0000001050.000000211](6) \begin{aligned}\tag{6} & RR^{\mathrm{T}}\\ = &\left(I+X+\frac{X^2}{2}\right)\left(I+X+\frac{X^2}{2}\right)^{\mathrm{T}} \\ =& \left[\begin{array}{ccc} 1 &0.00000007&0.000000105 \\ 0.00000007&1&0.00000021\\ 0.000000105&0.00000021&1 \end{array}\right] \\ \end{aligned} ==RRT(I+X+2X2)(I+X+2X2)T10.000000070.0000001050.0000000710.000000210.0000001050.000000211(6)
指数映射就是指数函数exe^xex,其中的xxx就是个实数。如果把实数xxx换成一个矩阵也是有意义的,为了便于区分就叫eXe^XeX指数映射了。学过一点高等数学的同学可能还记得,指数函数有两种定义方法:
(1)(1)(1) 一种是无穷级数:
ex=1+x1!+x22!+x33!+x44!+⋯(7)\tag{7} e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots ex=1+1!x+2!x2+3!x3+4!x4+⋯(7)
(2)(2)(2) 另一种是二项式的极限:
ex=limn→∞(1+xn)n(8)\tag{8} e^{x} = \lim_{n \rightarrow \infty} \left(1 + \frac{x}{n}\right)^{n} ex=n→∞lim(1+nx)n(8)
这两种方式都可以逼近指数函数,但是级数形式更快(实际上级数形式比极限形式要快得多)。下图左侧是级数形式,右侧是极限形式。红色点表示指数函数上实际的点,蓝色的点是取有限项计算得到的近似点。


欧拉发现,如果把实数扩展到复数,也就是把复数带入指数函数的定义,可以得到下面的公式(9)(9)(9),这就是大名鼎鼎的欧拉公式。上面的动画就是将iθi \thetaiθ带入指数函数的定义式后,把结果的实部和虚部分别作为(x,y)(x,y)(x,y)坐标画在坐标系中的图像。其中,nnn表示级数或者二项式中的项数,θ\thetaθ是一个实数。
eiθ=cos(θ)+isin(θ)(9)\tag{9} e^{i\theta} = \cos(\theta) + i \sin(\theta) eiθ=cos(θ)+isin(θ)(9)
3 “轴-角度”解释
可以看到,欧拉公式描述了二维平面中的旋转。那么三维空间如何表示旋转呢?可能是受到欧拉公式的启发,一个名为罗德里格斯的年轻人得到了三维旋转的表达形式(10)(10)(10),这个公式没有欧拉公式那么家喻户晓,但是搞不好可能会偶尔用到,它被称为罗德里格斯公式。罗德里格斯公式的推导过程非常有趣,可以参考相关文献。将李代数XXX写成向量的形式,X=θu^X=\theta \widehat{u}X=θu,其中uuu是一个单位向量,θ\thetaθ是李代数向量的“长度”(范数)。
eX=∑n=0∞(θu^)nn!=I+θu^1!+θ2u^22!+θ3u^33!+θ4u^44!+θ5u^55!+⋯=(uuT−u^u^)+θu^+12!θ2u^2+13!θ3(−u^)+14!θ4(−u^u^)+15!θ5u^+⋯=uuT+(θ−13!θ3+15!θ5−⋯ )⏟sin(θ)u^−(1−12!θ2+14!θ4−⋯ )⏟cos(θ)u^u^=(u^u^+I)+sin(θ)u^−cos(θ)u^u^=I+sin(θ)u^+(1−cos(θ))u^u^(10) \begin{aligned} & e^{X}\tag{10} \\ = &\sum_{n=0}^{\infty}\frac{(\theta \widehat{u})^{n}}{n!} \\ = &I + \frac{\theta \widehat{u}}{1!} + \frac{\theta^{2} \widehat{u}^{2}}{2!} + \frac{\theta^{3} \widehat{u}^{3}}{3!} + \frac{\theta^{4} \widehat{u}^{4}}{4!} + \frac{\theta^{5} \widehat{u}^{5}}{5!} + \cdots \\ = &(uu^{\mathrm{T}} - \widehat{u}\widehat{u}) + \theta \widehat{u} + \frac{1}{2!}\theta^{2} \widehat{u}^{2} + \frac{1}{3!}\theta^{3} (-\widehat{u}) + \frac{1}{4!}\theta^{4} (-\widehat{u}\widehat{u}) + \frac{1}{5!}\theta^{5} \widehat{u} + \cdots \\ = &uu^{\mathrm{T}} + \underbrace{\left(\theta - \frac{1}{3!}\theta^{3} + \frac{1}{5!}\theta^{5} - \cdots\right)}_{\sin(\theta)} \widehat{u} - \underbrace{\left(1 - \frac{1}{2!}\theta^{2} + \frac{1}{4!}\theta^{4} - \cdots\right)}_{\cos(\theta)} \widehat{u}\widehat{u} \\ = &(\widehat{u}\widehat{u} + I) + \sin(\theta)\widehat{u} - \cos(\theta)\widehat{u}\widehat{u} \\ = &I + \sin(\theta)\widehat{u} + (1 - \cos(\theta))\widehat{u}\widehat{u} \end{aligned} ======eXn=0∑∞n!(θu)nI+1!θu+2!θ2u2+3!θ3u3+4!θ4u4+5!θ5u5+⋯(uuT−uu)+θu+2!1θ2u2+3!1θ3(−u)+4!1θ4(−uu)+5!1θ5u+⋯uuT+sin(θ)(θ−3!1θ3+5!1θ5−⋯)u−cos(θ)(1−2!1θ2+4!1θ4−⋯)uu(uu+I)+sin(θ)u−cos(θ)uuI+sin(θ)u+(1−cos(θ))uu(10)
向量uuu可以视为旋转轴,θ\thetaθ是绕这根轴旋转的角度,所以李代数是不是可以视为绕某根轴旋转一个角度呢?
李代数XXX作用到向量的结果可以用叉积表示,例如我们将XXX记为:
X=[0−zyz0−x−yx0](11)X=\left[\begin{array}{ccc}\tag{11} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{array}\right] X=0z−y−z0xy−x0(11)
那么,将李代数XXX作用到一个三维向量v=(a,b,c)v=(a,b,c)v=(a,b,c)(也就是矩阵向量相乘)将得到:
Xv=[0−zyz0−x−yx0]⋅[abc]=[cy−bzaz−cxbx−ay](12)Xv=\left[\begin{array}{ccc}\tag{12} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{array}\right] \cdot \left[\begin{array}{ccc} a\\ b\\c \end{array}\right] = \left[\begin{array}{ccc} c y - b z\\ a z-c x \\ b x-a y \end{array}\right] Xv=0z−y−z0xy−x0⋅abc=cy−bzaz−cxbx−ay(12)
而两个三维向量的叉积定义如下式(13)(13)(13),可以看到(12)(12)(12)与(13)(13)(13)完全相同。
(x,y,z)×(a,b,c)=(cy−bz,az−cx,bx−ay)(13)\tag{13}(x,y,z)\times(a,b,c) = (c y - b z, a z-c x,b x - a y)(x,y,z)×(a,b,c)=(cy−bz,az−cx,bx−ay)(13)
两个三维向量做叉积的结果也是一个三维向量,这个向量与前两个向量都垂直。我们可以想象,如果把一个李代数作用到空间中的每一个点,都可以得到一个新的向量,也就是说这个李代数生成了一个向量场。假如我们把这个向量场画出来会是什么样的呢?下图中的蓝色小箭头所示的就是李代数产生的向量场,当然我们不可能真的把每个点处的向量都画出来,这样太密集了,只能画出一些向量进行示意。如果我们改变李代数(对应向量的大小、方向),相应的所生成的向量场也会发生变化。由于生成的向量场中的向量总是与李代数(对应的向量)垂直,所以看上去这个向量场就是在围绕李代数旋转,李代数自然就是那个旋转轴。当然,旋转轴只需要单位向量就能确定,那向量的长度表示什么呢?向量的长度表示了旋转的程度(即旋转角度)。

旋转轴这个解释可比什么无穷小旋转矩阵、切空间那些解释直观多了。沿着这个方向思考,我们是否可以用李代数干点什么呢,比如插值?

给定两个位置点,我们可以在二者中间连一条线段,这条线段上的点就是二者之间的一系列点。那么对于旋转来说,给定任意两个姿态,如何表示它们之间的一系列姿态或者旋转呢?
一种思路是:
(1)(1)(1) 计算差值旋转矩阵:假设从R1R_1R1经过旋转∆R∆R∆R到达R2R_2R2,如图所示。∆R∆R∆R可以由R1R_1R1和R2R_2R2得到:∆R=R1−1R2∆R=R_1^{-1} R_2∆R=R1−1R2。
(2)(2)(2) 计算旋转轴和旋转角:旋转∆R∈SO(3)∆R∈SO(3)∆R∈SO(3)对应的旋转轴和旋转角可以由其李代数得到。我们知道从李代数得到李群可以借助指数映射。反之,从李群得到李代数需要使用对数映射(Logarithmic Map),即矩阵指数映射的逆运算。使用对数映射,我们可以将旋转矩阵变换为李代数空间中的元素(当然也就是个李代数了),即log:eX→Xlog:e^X→Xlog:eX→X。将李代数的向量表示记为θuθuθu。其中,单位向量uuu表示从R1R_1R1到R2R_2R2的旋转轴。而实数θθθ表示从R1R_1R1到R2R_2R2旋转的角度。
(3)(3)(3) 改变旋转角:使用指数映射,我们只需要让角度从000变化到θθθ即可得到一系列的中间旋转(期间并不改变旋转轴的朝向),如下图所示。
Rt=etu^,t∈(0,θ) R_t=e^{t\hat{u}}, t∈(0,θ) Rt=etu^,t∈(0,θ)


除了以上插值方法外,还有一种更简单、直接的方法,步骤如下。
(1)(1)(1) 转换为李代数:我们可以将每个旋转矩阵R1R_1R1、R2R_2R2都视为李代数的指数映射。反过来,从旋转矩阵RRR也可以得到李代数,即:
X1=log(R1)X2=log(R2)X_1=log(R_1) \\
X_2=log(R_2)X1=log(R1)X2=log(R2)
(2)(2)(2) 线性插值:既然李代数是一个线性空间,我们就在李代数这个线性空间中进行线性插值,再借助指数映射将中间结果(李代数)转换为李群中的旋转:
Rt=e(1−t)X1+tX2,t∈(0,1)R_t=e^{(1-t) X_1+tX_2}, t∈(0,1)Rt=e(1−t)X1+tX2,t∈(0,1)

参考
[1] 封闭场景无人驾驶技术与应用.