詳解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 a?bG
  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) (a?b)?c=a?(b?c)
  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 e?a=a?e=a
  4. 逆元(Inverse element):對于 G G G中的每一個元素 a a a,都存在一個 G G G中的元素 b b b(記作 a ? 1 a^{-1} a?1,稱為 a a a的逆元),使得 a ? a ? 1 = a ? 1 ? a = e a \cdot a^{-1} = a^{-1} \cdot a = e a?a?1=a?1?a=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 x0?D是該區間中的一個內點。如果極限

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?)=h0lim?hf(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?,R2?SO(3),則 R 1 R 2 ∈ S O ( 3 ) R_1 R_2 \in SO(3) R1?R2?SO(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 R?1=RT(正交矩陣的性質),且 det ? ( R ? 1 ) = 1 \det(R^{-1}) = 1 det(R?1)=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=[R0?t1?]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?,T2?SE(3),則 T 1 T 2 ∈ S E ( 3 ) T_1 T_2 \in SE(3) T1?T2?SE(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}. T?1=[RT0??RTt1?].

特殊歐式群具有光滑特性,這一點同樣可以結合歐式變換本身的特性來理解。歐式變換是旋轉變換與平移變換的組合,我們可以假設這樣一個場景:一個照相機要拍攝一個物體,需要移動到這個物體的前方,并且要調整相機朝向,才能準確生成這張物體的照片。相機無論怎么移動位置,調整朝向,這個過程都是平滑的。在計算機圖形學的場景中,經常會有這樣的需求,按照一條固定的軌跡飛行,這條飛行軌跡上的任意一點都可以通過插值得到,保證相機操作的平滑性。

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= ?0a3??a2???a3?0a1??a2??a1?0? ?.

反對稱矩陣有一個很重要的性質:每個三維向量都有唯一的反對稱矩陣對應。具體來說,給定一個三維實向量:

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= ?a1?a2?a3?? ?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]×?= ?0a3??a2???a3?0a1??a2??a1?0? ?.

這個符號 [ 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]×?= ?03?2??301?2?10? ?

[ 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= ?03?2??301?2?10? ? ?456? ?= ??36?3? ?

而直接計算叉積:

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= ?i14?j25?k36? ?=?3i+6j?3k= ??36?3? ?

兩者的結果一致。

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}. dtd?eat=dud?eu?dtd?(at)=eu?a=eat?a=aeat.

即:

d d t e a t = a e a t \frac{d}{dt} e^{at} = a e^{at} dtd?eat=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)?=[dtdr11??dtdr21???dtdr12??dtdr22???].

所以,矩陣對自變量求導 = 矩陣中每個元素對自變量求導

通過上述概念可看出,矩陣轉置運算與微分運算是可交換的。可以理解為:

  • 轉置是對矩陣元素做排列;
  • 微分是對每個元素做導數;
  • 所以先轉置再導數 = 先導數再轉置。

公式描述就是:

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. dtd?R(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)=x0?eat.

可以把這個解代入原方程驗證是否成立。對解的兩邊進行求導:

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)?=x0??dtd?(eat)=x0??aeat=ax0?eat=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. x1?dx=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, x1?dx=adt?lnx=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)=x0?eat.

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) dtd?R(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))=dtd?I

根據函數求導的乘積法則,展開左邊的導數:

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)T?R(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
英文地址,請注明出處:http://en.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;金屬片在彈簧作…