详解SLAM中的李群和李代数(上)

1 概述

最近阅读高翔大神的《视觉SLAM十四讲》这本书,感觉整本书写的非常的平实,用非常接地气的语言毫无保留的介绍了视觉SLAM的相关知识,非常值得一读。不过,在第4章出现的李群和李代数的相关概念就有点令人难以费解了。其实这段不是这本书的作者故意写的晦涩难懂,而是这部分知识属于数学或者物理专业才会学习的知识,普通的理工科专业的读者没有接触过这方面的知识。笔者也是在这个地方卡了壳,因此在本文中将李群和李代数相关的知识总结一下。

2 群

在数学中,是一个基础但非常重要的代数结构,它由一个集合和一种满足特定条件的二元运算组成。具体来说,如果一个集合 G G G和其上的一个二元运算 ⋅ \cdot 满足以下四个公理,则称 ( G , ⋅ ) (G, \cdot) (G,)为一个群:

  1. 封闭性(Closure):对于 G G G中任意两个元素 a a a b b b,它们通过运算 ⋅ \cdot 得到的结果也是 G G G的一个元素。即,如果 a , b ∈ G a, b \in G a,bG,那么 a ⋅ b ∈ G a \cdot b \in G abG
  2. 结合律(Associativity):对于 G G G中任意三个元素 a a a b b b c c c,它们之间的运算满足结合律。即, ( a ⋅ b ) ⋅ c = a ⋅ ( b ⋅ c ) (a \cdot b) \cdot c = a \cdot (b \cdot c) (ab)c=a(bc)
  3. 单位元(Identity element):存在一个 G G G中的特殊元素 e e e(称为单位元),使得对于 G G G中的任何元素 a a a都有 e ⋅ a = a ⋅ e = a e \cdot a = a \cdot e = a ea=ae=a
  4. 逆元(Inverse element):对于 G G G中的每一个元素 a a a,都存在一个 G G G中的元素 b b b(记作 a − 1 a^{-1} a1,称为 a a a的逆元),使得 a ⋅ a − 1 = a − 1 ⋅ a = e a \cdot a^{-1} = a^{-1} \cdot a = e aa1=a1a=e,这里 e e e是上述的单位元。

概念说出来都是很抽象的,那么接下来直接举两个具体的例子。

2.1 整数集与加法运算

如果集合 G = Z = { … , − 2 , − 1 , 0 , 1 , 2 , … } G = \mathbb{Z}= \{ \dots, -2, -1, 0, 1, 2, \dots\ \} G=Z={,2,1,0,1,2, },运算 ⋅ = + \cdot = + =+,那么整数集与加法运算 ( Z , + ) (Z,+) (Z,+)就是一个群,因为其符合群的四个公理:

  1. 封闭性
    对于任意两个整数 a , b ∈ Z a, b \in \mathbb{Z} a,bZ a + b a + b a+b仍然是一个整数。例如, 3 + ( − 5 ) = − 2 3 + (-5) = -2 3+(5)=2,结果仍然在 Z \mathbb{Z} Z中。
    因此,封闭性成立。

  2. 结合律
    加法是结合的,即对于任意 a , b , c ∈ Z a, b, c \in \mathbb{Z} a,b,cZ,有

    ( a + b ) + c = a + ( b + c ) (a + b) + c = a + (b + c) (a+b)+c=a+(b+c)

    因此,结合律成立。

  3. 单位元
    单位元是 e = 0 e = 0 e=0,因为对于任意 a ∈ Z a \in \mathbb{Z} aZ,有

    a + 0 = 0 + a = a a + 0 = 0 + a = a a+0=0+a=a

    因此,单位元存在。

  4. 逆元
    对于任意 a ∈ Z a \in \mathbb{Z} aZ,它的逆元是 − a -a a,因为

a + ( − a ) = ( − a ) + a = 0 a + (-a) = (-a) + a = 0 a+(a)=(a)+a=0

因此,每个元素都有逆元。

2.2 非零实数集与乘法运算

如果集合 G = R ∗ = { x ∈ R ∣ x ≠ 0 } G = \mathbb{R}^* = \{ x \in \mathbb{R} \mid x \neq 0 \} G=R={xRx=0},运算 ⋅ = × \cdot = \times =×,那么非零实数集与乘法运算 ( R ∗ , × ) (\mathbb{R}^*,\times) (R,×)就是一个群,因为其符合群的四个公理:

  1. 封闭性
    对于任意两个非零实数 a , b ∈ R ∗ a, b \in \mathbb{R}^* a,bR a × b a \times b a×b仍然是一个非零实数。例如, 3 × ( − 2 ) = − 6 3 \times (-2) = -6 3×(2)=6,结果仍然在 R ∗ \mathbb{R}^* R中。
    因此,封闭性成立。

  2. 结合律
    乘法是结合的,即对于任意 a , b , c ∈ R ∗ a, b, c \in \mathbb{R}^* a,b,cR,有

    ( a × b ) × c = a × ( b × c ) (a \times b) \times c = a \times (b \times c) (a×b)×c=a×(b×c)

    因此,结合律成立。

  3. 单位元
    单位元是 e = 1 e = 1 e=1,因为对于任意 a ∈ R ∗ a \in \mathbb{R}^* aR,有

    a × 1 = 1 × a = a a \times 1 = 1 \times a = a a×1=1×a=a

    因此,单位元存在。

  4. 逆元
    对于任意 a ∈ R ∗ a \in \mathbb{R}^* aR,它的逆元是 1 a \frac{1}{a} a1,因为

    a × 1 a = 1 a × a = 1 a \times \frac{1}{a} = \frac{1}{a} \times a = 1 a×a1=a1×a=1

    因此,每个元素都有逆元。

这样来看的话,群的概念还是很好理解的。数学上的语言都是很抽象很概括的,我们不妨结合具体的例子来理解。那么,为什么会有群这个概念呢,因为数学家发现这种二元运算的集合有非常规律良好的性质,因此将其归纳总结了出来。

3 李群

李群是具有光滑性质的群。群的定义我们刚才论述过,那么这个“光滑”指的是一个怎么样的概念呢?要说清楚这个概念,可能需要更加专业的数学知识(比如《微分几何》),但是我们可以用简单一点的概念进行类比,那就是高数中的可导。

回忆一下高数中关于可导的定义:设 f : D → R f: D \to \mathbb{R} f:DR是一个实值函数,定义在某个区间 D D D上,并且 x 0 ∈ D x_0 \in D x0D是该区间中的一个内点。如果极限

f ′ ( x 0 ) = lim ⁡ h → 0 f ( x 0 + h ) − f ( x 0 ) h f'(x_0) = \lim_{h \to 0} \frac{f(x_0+h) - f(x_0)}{h} f(x0)=h0limhf(x0+h)f(x0)

存在,则称函数 f f f在点 x 0 x_0 x0处是可导的,这个极限称为 f f f x 0 x_0 x0处的导数,记作 f ′ ( x 0 ) f'(x_0) f(x0) d f d x ( x 0 ) \frac{df}{dx}(x_0) dxdf(x0)

直观地说,这个极限衡量了当输入 x x x发生微小变化时,输出 f ( x ) f(x) f(x)的变化率。如果一个函数在某区间内处处可导,那么这个函数在该区间内不仅连续,而且是“光滑”的,没有尖点或间断。这是一个非常优良的性质,它意味着这个函数的每个点都可以用切线方程来近似,从而使得复杂的问题可以通过简单的线性问题来解决,极大地简化了计算。

李群的光滑性质就类似于高数中的可导性。光滑意味着群运算是可以进行微分的,李群上的任何点都可以研究其局部变化率(即导数),并通过这些导数来分析群的性质。函数的导数就是导函数,而李群在单位元附近的局部性质的描述就是李代数,它通过切空间捕捉了李群的局部线性化信息。

SLAM中两个重要的李群是特殊正交群 S O ( n ) SO(n) SO(n)特殊欧式群 S E ( n ) SE(n) SE(n),特殊正交群是旋转变换的集合和运算,特殊欧式群是欧式变换/刚性变换的集合和运算。旋转变换和欧式变换是SLAM中的两个重要的几何变换,要理解这两个概念,需要重点看《视觉SLAM十四讲》第3讲三维空间刚体运动的知识;或者对计算机图形学、计算机视觉中几何变换的知识有所了解。

3.1 特殊正交群 S O ( 3 ) SO(3) SO(3)

如果集合 G G G是所有的三维旋转矩阵,运算 ⋅ \cdot 是矩阵乘法,这样构成的群就是特殊正交群 S O ( 3 ) = { R ∈ R 3 × 3 ∣ R T R = I , det ⁡ ( R ) = 1 } SO(3) = \{ R \in \mathbb{R}^{3\times3} \mid R^T R = I, \det(R) = 1\} SO(3)={RR3×3RTR=I,det(R)=1}

特殊正交群符合群的四个公理:

  • 封闭性:如果 R 1 , R 2 ∈ S O ( 3 ) R_1, R_2 \in SO(3) R1,R2SO(3),则 R 1 R 2 ∈ S O ( 3 ) R_1 R_2 \in SO(3) R1R2SO(3)。两个旋转矩阵的乘积仍然是正交矩阵,且行列式仍为1。从图形学的角度上来说,旋转两次得到的姿态,旋转一次也可以得到。
  • 结合律:矩阵乘法本身是结合的,因此 S O ( 3 ) SO(3) SO(3)满足结合律。
  • 单位元:单位矩阵 I ∈ S O ( 3 ) I \in SO(3) ISO(3),因为 I T I = I I^T I = I ITI=I det ⁡ ( I ) = + 1 \det(I) = +1 det(I)=+1
  • 逆元:对于任意 R ∈ S O ( 3 ) R \in SO(3) RSO(3),其逆元是 R − 1 = R T R^{-1} = R^T R1=RT(正交矩阵的性质),且 det ⁡ ( R − 1 ) = 1 \det(R^{-1}) = 1 det(R1)=1

特殊正交群具有光滑特性,这一点我们可以结合旋转变换本身的特性来理解。设想这样的一个场景:三维空间中有一个魔方,这个魔方以自己的中心点位置进行旋转。无论这个魔方怎么旋转,到任何位置,旋转过程都是平滑的。在计算机图形学中,很容易实现这样的一个任务:给定一个起点旋转矩阵、终点旋转矩阵以及起终点的时间差,很容易线性插值出任意时刻的旋转矩阵。能够平滑地旋转物体,也很符合我们对客观物理现象的认知。

3.2 特殊欧式群 S E ( 3 ) SE(3) SE(3)

如果集合 G G G是所有的欧式变换(刚体变换)矩阵,运算 ⋅ \cdot 是矩阵乘法,这样构成的群就是特殊欧式群 S E ( 3 ) = { T = [ R t 0 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3)=\bigg\{ T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \in \mathbb{R}^{4\times4} \mid R \in SO(3) ,t \in \mathbb{R}^3 \bigg\} SE(3)={T=[R0t1]R4×4RSO(3),tR3}。在这里, R R R表示旋转矩阵, t t t是平移向量。

特殊欧式群符合群的四个公理:

  • 封闭性:如果 T 1 , T 2 ∈ S E ( 3 ) T_1, T_2 \in SE(3) T1,T2SE(3),则 T 1 T 2 ∈ S E ( 3 ) T_1 T_2 \in SE(3) T1T2SE(3)。欧式变换是齐次变换矩阵,相乘后仍然保持旋转矩阵在左上角,平移向量在右上角的形式。从图形学的角度上来说,欧式变换两次得到的位姿,欧式变换一次也可以得到。
  • 结合律:矩阵乘法本身是结合的,因此 S E ( 3 ) SE(3) SE(3)满足结合律。
  • 单位元:单位矩阵 I 4 × 4 I_{4 \times 4} I4×4(包含 3 × 3 3 \times 3 3×3单位矩阵和零平移向量)是 S E ( 3 ) SE(3) SE(3)的单位元。
  • 逆元:对于任意 T ∈ S E ( 3 ) T \in SE(3) TSE(3),其逆元是

T − 1 = [ R T − R T t 0 1 ] . T^{-1} = \begin{bmatrix} R^T & -R^T t \\ 0 & 1 \end{bmatrix}. T1=[RT0RTt1].

特殊欧式群具有光滑特性,这一点同样可以结合欧式变换本身的特性来理解。欧式变换是旋转变换与平移变换的组合,我们可以假设这样一个场景:一个照相机要拍摄一个物体,需要移动到这个物体的前方,并且要调整相机朝向,才能准确生成这张物体的照片。相机无论怎么移动位置,调整朝向,这个过程都是平滑的。在计算机图形学的场景中,经常会有这样的需求,按照一条固定的轨迹飞行,这条飞行轨迹上的任意一点都可以通过插值得到,保证相机操作的平滑性。

4 李代数

4.1 预备

在进行李代数的论述之前,我们需要先学习一些预备知识。

4.1.1 反对称矩阵

一个 n × n n \times n n×n实矩阵 A A A反对称矩阵(或斜对称矩阵),如果它满足:

A T = − A . A^T = -A. AT=A.

也就是说,矩阵的转置等于它的负数,那么这个矩阵就是反对称矩阵。一个反对称矩阵的例子如下:

A = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] . A = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix}. A= 0a3a2a30a1a2a10 .

反对称矩阵有一个很重要的性质:每个三维向量都有唯一的反对称矩阵对应。具体来说,给定一个三维实向量:

a = [ a 1 a 2 a 3 ] ∈ R 3 , \boldsymbol{a} = \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} \in \mathbb{R}^3, a= a1a2a3 R3,

我们可以唯一地构造一个 3 × 3 3\times3 3×3的反对称矩阵,记作:

[ a ] × = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] . [\boldsymbol{a}]_\times = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix}. [a]×= 0a3a2a30a1a2a10 .

这个符号 [ a ] × [\boldsymbol{a}]_\times [a]×中的 × \times ×表示“叉乘”,因为这个矩阵的作用就等价于与 a \boldsymbol{a} a做叉积。

等价于叉积运算是什么意思呢?设 a , b ∈ R 3 \boldsymbol{a}, \boldsymbol{b} \in \mathbb{R}^3 a,bR3,那么:

a × b = [ a ] × b . \boldsymbol{a} \times \boldsymbol{b} = [\boldsymbol{a}]_\times \boldsymbol{b}. a×b=[a]×b.

即: a \boldsymbol{a} a b \boldsymbol{b} b的叉积 等于 反对称矩阵 [ a ] × [\boldsymbol{a}]_\times [a]×作用在 b \boldsymbol{b} b上的结果。

举例说明,设:

a = [ 1 2 3 ] , b = [ 4 5 6 ] , \boldsymbol{a} = \begin{bmatrix}1 \\ 2 \\ 3\end{bmatrix}, \quad \boldsymbol{b} = \begin{bmatrix}4 \\ 5 \\ 6\end{bmatrix}, a= 123 ,b= 456 ,

则:

[ a ] × = [ 0 − 3 2 3 0 − 1 − 2 1 0 ] [\boldsymbol{a}]_\times = \begin{bmatrix} 0 & -3 & 2 \\ 3 & 0 & -1 \\ -2 & 1 & 0 \end{bmatrix} [a]×= 032301210

[ a ] × b = [ 0 − 3 2 3 0 − 1 − 2 1 0 ] [ 4 5 6 ] = [ − 3 6 − 3 ] [\boldsymbol{a}]_\times \boldsymbol{b} = \begin{bmatrix} 0 & -3 & 2 \\ 3 & 0 & -1 \\ -2 & 1 & 0 \end{bmatrix} \begin{bmatrix}4 \\ 5 \\ 6\end{bmatrix} = \begin{bmatrix} -3 \\ 6 \\ -3 \end{bmatrix} [a]×b= 032301210 456 = 363

而直接计算叉积:

a × b = ∣ i j k 1 2 3 4 5 6 ∣ = − 3 i + 6 j − 3 k = [ − 3 6 − 3 ] \boldsymbol{a} \times \boldsymbol{b} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ 1 & 2 & 3 \\ 4 & 5 & 6 \end{vmatrix} = -3\mathbf{i} + 6\mathbf{j} - 3\mathbf{k} = \begin{bmatrix} -3 \\ 6 \\ -3 \end{bmatrix} a×b= i14j25k36 =3i+6j3k= 363

两者的结果一致。

4.1.2 函数求导

1. 乘积法则

f ( t ) , g ( t ) f(t), g(t) f(t),g(t)是两个可导的实函数,那么它们乘积的导数为:

d d t ( f ( t ) g ( t ) ) = f ′ ( t ) g ( t ) + f ( t ) g ′ ( t ) \frac{d}{dt}(f(t)g(t)) = f'(t)g(t) + f(t)g'(t) dtd(f(t)g(t))=f(t)g(t)+f(t)g(t)

例如,设 f ( t ) = t 2 , g ( t ) = sin ⁡ t f(t) = t^2, g(t) = \sin t f(t)=t2,g(t)=sint,则:

( f g ) ′ = ( t 2 sin ⁡ t ) ′ = 2 t sin ⁡ t + t 2 cos ⁡ t (fg)' = (t^2 \sin t)' = 2t \sin t + t^2 \cos t (fg)=(t2sint)=2tsint+t2cost

2. 链式法则

如果 y = f ( g ( t ) ) y = f(g(t)) y=f(g(t)),那么:

d y d t = f ′ ( g ( t ) ) ⋅ g ′ ( t ) . \frac{dy}{dt} = f'(g(t)) \cdot g'(t). dtdy=f(g(t))g(t).

例如,令 f ( u ) = e u f(u) = e^u f(u)=eu u = g ( t ) = a t u = g(t) = at u=g(t)=at,根据链式法则:

d d t e a t = d d u e u ⋅ d d t ( a t ) = e u ⋅ a = e a t ⋅ a = a e a t . \frac{d}{dt} e^{at} = \frac{d}{du} e^u \cdot \frac{d}{dt}(at) = e^u \cdot a = e^{at} \cdot a = a e^{at}. dtdeat=dudeudtd(at)=eua=eata=aeat.

即:

d d t e a t = a e a t \frac{d}{dt} e^{at} = a e^{at} dtdeat=aeat

4.1.3 矩阵求导

对于一个随自变量t变化的矩阵 R ( t ) R(t) R(t),它的导数 d R ( t ) d t \frac{dR(t)}{dt} dtdR(t)是将该矩阵的每个元素分别对自变量 t t t求导得到的新矩阵。例如:

如果:

R ( t ) = [ r 11 ( t ) r 12 ( t ) r 21 ( t ) r 22 ( t ) ] , R(t) = \begin{bmatrix} r_{11}(t) & r_{12}(t) \\ r_{21}(t) & r_{22}(t) \end{bmatrix}, R(t)=[r11(t)r21(t)r12(t)r22(t)],

那么:

d R ( t ) d t = [ d r 11 d t d r 12 d t d r 21 d t d r 22 d t ] . \frac{dR(t)}{dt} = \begin{bmatrix} \frac{dr_{11}}{dt} & \frac{dr_{12}}{dt} \\ \frac{dr_{21}}{dt} & \frac{dr_{22}}{dt} \end{bmatrix}. dtdR(t)=[dtdr11dtdr21dtdr12dtdr22].

所以,矩阵对自变量求导 = 矩阵中每个元素对自变量求导

通过上述概念可看出,矩阵转置运算与微分运算是可交换的。可以理解为:

  • 转置是对矩阵元素做排列;
  • 微分是对每个元素做导数;
  • 所以先转置再导数 = 先导数再转置。

公式描述就是:

d d t R ( t ) T = ( d R ( t ) d t ) T . \frac{d}{dt} R(t)^T = \left(\frac{dR(t)}{dt}\right)^T. dtdR(t)T=(dtdR(t))T.

4.1.4 微分方程

微分方程是数学中的一种方程,它涉及一个或多个未知函数及其导数,目标是找到满足该方程的未知函数。后面会求解一个一阶线性常微分方程如下:

d x ( t ) d t = a x ( t ) , x ( 0 ) = x 0 , \frac{dx(t)}{dt} = a x(t), \quad x(0) = x_0, dtdx(t)=ax(t),x(0)=x0,

其中 a a a是常数。

先说答案,这个方程的通解是:

x ( t ) = x 0 e a t . x(t) = x_0 e^{at}. x(t)=x0eat.

可以把这个解代入原方程验证是否成立。对解的两边进行求导:

d x ( t ) d t = x 0 ⋅ d d t ( e a t ) = x 0 ⋅ a e a t = a x 0 e a t = a x ( t ) . \frac{dx(t)}{dt} = x_0 \cdot \frac{d}{dt}(e^{at}) = x_0 \cdot a e^{at} = a x_0 e^{at} = a x(t). dtdx(t)=x0dtd(eat)=x0aeat=ax0eat=ax(t).

左边是 d x ( t ) d t \frac{dx(t)}{dt} dtdx(t),右边是 a x ( t ) a x(t) ax(t),两者相等,所以解成立。

如果需要严格推导这个解,需要使用分离变量法

从原方程出发:

d x d t = a x . \frac{dx}{dt} = a x. dtdx=ax.

把变量分开:

1 x d x = a d t . \frac{1}{x} dx = a dt. x1dx=adt.

两边积分:

∫ 1 x d x = ∫ a d t ⇒ ln ⁡ ∣ x ∣ = a t + C , \int \frac{1}{x} dx = \int a dt \\ \Rightarrow \ln|x| = at + C, x1dx=adtlnx=at+C,

其中 C C C是积分常数。

两边取指数:

∣ x ∣ = e a t + C = e C e a t . |x| = e^{at + C} = e^C e^{at}. x=eat+C=eCeat.

x 0 = e C x_0 = e^C x0=eC,得:

x ( t ) = x 0 e a t . x(t) = x_0 e^{at}. x(t)=x0eat.

4.2 引出

前面我们介绍过,李群的光滑性质保证了是可以微分的,那我们就尝试对李群 S O ( 3 ) SO(3) SO(3)进行求导。假设一个刚体在三维空间中绕某个轴旋转,其旋转状态可以用一个旋转矩阵 R ( t ) R(t) R(t)来描述,其中 t t t是时间参数。那么我们要求的就是 R ( t ) R(t) R(t)关于时间 t t t的导数:

d d t R ( t ) \frac{d}{dt} R(t) dtdR(t)

由于 R ( t ) R(t) R(t)是正交矩阵,满足 R ( t ) T R ( t ) = I R(t)^T R(t) = I R(t)TR(t)=I,对两边关于 t t t求导:

d d t ( R ( t ) T R ( t ) ) = d d t I \frac{d}{dt} \big( R(t)^T R(t) \big) = \frac{d}{dt} I dtd(R(t)TR(t))=dtdI

根据函数求导的乘积法则,展开左边的导数:

d R ( t ) T d t R ( t ) + R ( t ) T d R ( t ) d t = 0. \frac{dR(t)^T}{dt} R(t) + R(t)^T \frac{dR(t)}{dt} = 0. dtdR(t)TR(t)+R(t)TdtdR(t)=0.

根据预备知识,矩阵转置运算与微分运算可交换,有 d R ( t ) T d t = ( d R ( t ) d t ) T \frac{dR(t)^T}{dt} = \big(\frac{dR(t)}{dt}\big)^T dtdR(t)T=(dtdR(t))T,因此上式可以改写为:

( d R ( t ) d t ) T R ( t ) + R ( t ) T d R ( t ) d t = 0. \bigg(\frac{dR(t)}{dt}\bigg)^T R(t) + R(t)^T \frac{dR(t)}{dt} = 0. (dtdR(t))TR(t)+R(t)TdtdR(t)=0.

继而:

d R ( t ) d t R ( t ) T = − ( d R ( t ) d t ) T R ( t ) \frac{dR(t)}{dt} R(t)^T = -\bigg(\frac{dR(t)}{dt}\bigg)^T R(t) dtdR(t)R(t)T=(dtdR(t))TR(t)

这表明 d R ( t ) d t R ( t ) T \frac{dR(t)}{dt} R(t)^T dtdR(t)R(t)T是一个反对称矩阵,记作 [ ω ( t ) ] × [\boldsymbol{\omega}(t)]_{\times} [ω(t)]×,即:

d R ( t ) d t = [ ω ( t ) ] × R ( t ) , \frac{dR(t)}{dt} = [\boldsymbol{\omega}(t)]_{\times} R(t), dtdR(t)=[ω(t)]×R(t),

上式是一个一阶线性微分方程,有如下条件:

d R ( t ) d t = [ ω ] × R ( t ) , R ( 0 ) = I , \frac{dR(t)}{dt} = [\boldsymbol{\omega}]_\times R(t), \quad R(0) = I, dtdR(t)=[ω]×R(t),R(0)=I,

这个方程我们在预备知识中求解过,它的解是:

R ( t ) = exp ⁡ ( [ ω ] × t ) . R(t) = \exp([\boldsymbol{\omega}]_\times t). R(t)=exp([ω]×t).

其中 exp ⁡ \exp exp表示矩阵指数运算。 ω ( t ) \boldsymbol{\omega}(t) ω(t)描述了刚体在时刻 t t t的瞬时旋转轴和旋转速率,其实也就是表达旋转矩阵的旋转向量, [ ω ( t ) ] × [\boldsymbol{\omega}(t)]_{\times} [ω(t)]×是其对应的反对称矩阵。这个公式给出了从旋转向量到旋转矩阵(李群)的映射,也就是指数映射。而这个旋转向量,就是我们要论述的李代数。

如果读者熟悉计算机图形学,就会对旋转向量并不陌生,它描述了一个旋转操作的方向(旋转轴)和大小(旋转角度)。四元数就是一个与旋转向量密切相关的参数,通过罗德里格斯公式也可以将旋转向量转换成旋转矩阵。

5 结语

本篇由群引申到李群,再引出到李代数,不得不说SLAM中李群和李代数相关的知识还是很多,其中很多知识都是第一次接触到。另外,很多更基础的知识(比如高数、线代)也都忘记了,不得不一边学习新的知识一边复习旧的知识。在下一篇文章中,笔者会继续总结论述一下李代数相关的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/79243.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/79243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libevent库详解:高性能异步IO的利器

目录 一、libevent 简介 主要特点: 二、事件模型原理 1. event_base 2. event 3. evconnlistener(TCP监听器) 4. bufferevent 简化流程如下: 三、libevent 使用示例 1. 创建事件主循环 2. 创建监听器(TCP&a…

从 “零” 做个开源音乐软件“SteadyBeat”吧!<1> 准备

换换脑子,做个音乐软件,根据调性、和弦走向(情感)、节拍、速度等需求,结合AI和一众工具,自动生成伴奏、Solo等,有点像库乐队!自己平时也用得着,暂时取名叫《SteadyBeat》…

npm error code CERT_HAS_EXPIRED

npm error code CERT_HAS_EXPIRED 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 擅长.net、C、python开发, 如果遇到技术问题,即可私…

数字世界的“私人车道“:网络切片如何用Python搭建专属通信高速路?

数字世界的"私人车道":网络切片如何用Python搭建专属通信高速路? 2024年6月,中国移动宣布在浙江某智能工厂完成全球首个"5G工业网络切片"规模商用——这条为生产线定制的"数字专属车道",将设备控制…

VSCode Verilog编辑仿真环境搭建

VSCode Verilog环境搭建 下载Iverilog安装Iverilog验证安装VS Code安装插件 下载Iverilog 官网下载Iverilog 安装Iverilog 一定要勾选这两项 建议勾选这两项 验证安装 运行Windows PowerShell输入命令:iverilog输入命令:Get-Command gtkwave …

C++ - 数据容器之 list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)

一、创建与初始化 引入 <list> 并使用 std 命名空间 #include <list>using namespace std;创建一个空 list list<int> my_list;创建一个包含 5 个元素&#xff0c;每个元素初始化为 0 的 list list<int> my_list(5);创建一个包含 5 个元素&#xf…

自动化测试项目1 --- 唠嗑星球 [软件测试实战 Java 篇]

目录 项目介绍 项目源码库地址 项目功能测试 1.自动化实施步骤 1.1 编写测试用例 1.2 自动化测试脚本开发 1.2.1 配置相关环境, 添加相关依赖 1.2.2 相关代码编写 2. 自动化功能测试总结 2.1 弹窗的解决相关问题 2.2 断言的使用和说明 2.3 重新登录问题 项目性能…

Codeforces Round 1022 (Div. 2)(ABC)

A. Permutation Warm-Up 翻译&#xff1a; 对于长度为 n 的排列 p&#xff0c;我们定义函数&#xff1a; 给你一个数 n。你需要计算函数 f(p) 在考虑从 1 到 n 的所有可能的数字排列时&#xff0c;可以取多少个不同的值。 思路&#xff1a; 按序排列时和为0&…

数据结构------C语言经典题目(6)

1.数据结构都学了些什么&#xff1f; 1.基本数据类型 算数类型&#xff1a; char&#xff08;字符&#xff09;、int&#xff08;整数&#xff09;、float&#xff08;单精度浮点数&#xff09;、double&#xff08;双精度浮点数&#xff09;等。 枚举类型&#xff1a; enum…

如何封装一个线程安全、可复用的 HBase 查询模板

目录 一、前言&#xff1a;原生 HBase 查询的痛点 &#xff08;一&#xff09;连接管理混乱&#xff0c;容易造成资源泄露 &#xff08;二&#xff09;查询逻辑重复&#xff0c;缺乏统一的模板 &#xff08;三&#xff09;多线程/高并发下的线程安全性隐患 &#xff08;四…

【中间件】bthread_基础_TaskControl

TaskControl 1 Definition2 Introduce**核心职责** 3 成员解析**3.1 数据结构与线程管理****3.2 任务调度与负载均衡****3.3 线程停放与唤醒&#xff08;ParkingLot&#xff09;****3.4 统计与监控** 4 **工作流程**5 **设计亮点**6 **使用场景示例**7 **总结**8 学习过程中的疑…

win11 终端 安装ffmpeg 使用终端Scoop

1、安装scoop (Windows 包管理器) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iwr -useb get.scoop.sh | iex 2、使用scoop来安装ffmpeg scoop install ffmpeg 3、测试一下ffmpeg&#xff0c;将Mp3文件转为Wav文件 ffmpeg -i A.mp3 A.wav 然后我们就看到A.wav生成…

力扣838.推多米诺随笔

“生活就像海洋&#xff0c;只有意志坚强的人&#xff0c;才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行&#xff0c;将每张多米诺骨牌垂直竖立。在开始时&#xff0c;同时把一些多米诺骨牌向左或向右推。 每过一秒&#xff0c;倒向左边的多米诺骨牌会推动其左侧…

超级好用的​​参数化3D CAD 建模​​图形库 (CadQuery库介绍)

CadQuery 库详细介绍​​ ​​CadQuery​​ 是一个基于 ​​Python​​ 的 ​​参数化 3D CAD 建模​​ 库&#xff0c;允许用户通过编写代码&#xff08;而不是传统 GUI&#xff09;来创建精确的 ​​3D 模型​​。它特别适用于 ​​自动化设计、机械工程、3D 打印​​ 等场景…

HBM的哪些事

命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈&#xff0c;关于HBM的奇淫技巧&#xff0c;随后出专题介绍。

Python基于深度学习的网络舆情分析系统(附源码,部署)

大家好&#xff0c;我是Python徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕…

滑动窗口leetcode 209和76

一、leetcode 209. 长度最小的子数组 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int left 0;int sum 0;int res 100001;for(int right 0;right <n;right){sum nums[right];while(s…

node.js 实战——mongoDB 续一

mongoDB的基本指令 进入mongodb mongo显示当前的所有数据库 show dbs # 或者 show databases切换数据库/进入指定数据库 使用这个命令的时候&#xff0c;是不要求这个数据库是否创建 use 数据库名显示当前数据库 db显示数据库中所有集合 show collections数据库的CRUD的…

SVMSPro平台获取Websocket视频流规则

SVMSPro平台获取Websocket视频流规则 Websocket 的服务端口为&#xff1a;53372&#xff0c;如需要公网访问需要开启这个端口 这里讲的是如何获取长效URL&#xff0c;短效&#xff08;时效性&#xff09;URL也支持&#xff0c;下回讲 一、如何获取Websocket实时流视频 ws:/…

Arduino按键开关编程详解

一、按键开关的基本原理与硬件连接 1.1 按键开关的工作原理 按键开关是一种常见的输入设备&#xff0c;其核心原理基于机械触点的闭合与断开。当用户按下按键时&#xff0c;内部的金属片会连接电路两端&#xff0c;形成通路&#xff1b;松开按键后&#xff0c;金属片在弹簧作…