一、李群与李代数
1、群
定义:群是一种集合加上一种运算的代数结构。我们把集合记作 A A A,运算记作·,那么群可以记作 G = ( A , ⋅ ) G=(A,\cdot) G=(A,⋅)。群要求这个运算满足以下几个条件:
- 封闭性: ∀ a 1 , a 2 ∈ A , a 1 ⋅ a 2 ∈ A \forall a_1,a_2 \in A, a_1\cdot a_2 \in A ∀a1,a2∈A,a1⋅a2∈A
- 结合律: ∀ a 1 , a 2 , a 3 ∈ A , ( a 1 ⋅ a 2 ) ⋅ a 3 = a 1 ⋅ ( a 2 ⋅ a 3 ) \forall a_1,a_2,a_3 \in A, (a_1\cdot a_2) \cdot a_3 = a_1\cdot(a_2\cdot a_3) ∀a1,a2,a3∈A,(a1⋅a2)⋅a3=a1⋅(a2⋅a3)
- 幺元: ∃ a 0 ∈ A , ∀ a ∈ A , a 0 ⋅ a = a ⋅ a 0 = a \exists a_0\in A, \forall a \in A, a_0\cdot a=a\cdot a_0=a ∃a0∈A,∀a∈A,a0⋅a=a⋅a0=a
- 逆: ∀ a ∈ A , ∃ a − 1 ∈ A , ∀ a ⋅ a − 1 = a \forall a \in A, \exists a^{-1} \in A, \forall a \cdot a^{-1}=a ∀a∈A,∃a−1∈A,∀a⋅a−1=a
例如:整数和加法就可以组成一个群
2、李群与李代数
李群:具有连续(光滑)性质的群
李代数:由集合
V
\mathbb V
V和数域
F
\Bbb F
F以及二元运算
[
,
]
[,]
[,]组成,且满足以下条件
- 封闭性: ∀ X , Y ∈ V , [ X , Y ] ∈ V \forall X,Y \in \mathbb V, [X,Y] \in \mathbb V ∀X,Y∈V,[X,Y]∈V
- 双线性: ∀ X , Y , Z ∈ V , a , b ∈ F , [ a X + b Y , Z ] = a [ X , Z ] + b [ Y , Z ] , [ Z , a X + b Y ] = a [ Z , X ] + b [ Z , Y ] \forall X,Y,Z\in \mathbb V, a,b \in F, [aX+bY,Z]=a[X,Z]+b[Y,Z], [Z,aX+bY]=a[Z,X]+b[Z,Y] ∀X,Y,Z∈V,a,b∈F,[aX+bY,Z]=a[X,Z]+b[Y,Z],[Z,aX+bY]=a[Z,X]+b[Z,Y]
- 自反性: ∀ X ∈ V , [ X , X ] = 0 \forall X\in \mathbb V, [X,X]=0 ∀X∈V,[X,X]=0
- 雅可比等价: ∀ X , Y , Z ∈ V , [ X , [ Y , Z ] ] + [ Z , [ X , Y ] ] + [ Y , [ Z , X ] ] = 0 \forall X,Y,Z\in \mathbb V, [X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0 ∀X,Y,Z∈V,[X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0
李群和李代数在刚体运动中应用
对于任意的旋转矩阵
R
R
R,有如下性质,
R
R
T
=
1
(1)
RR^T=1 \tag1
RRT=1(1)
。认为刚体在空间中是连续运动的,则可以认为旋转矩阵
R
R
R是一个随着时间t变化的函数,即
R
(
t
)
R
(
t
)
T
=
I
(2)
R(t)R(t)^T=I\tag2
R(t)R(t)T=I(2)
,同时对其两边进行求导可得,
R
˙
(
t
)
R
T
(
t
)
+
R
T
(
t
)
R
˙
(
t
)
=
0
(3)
\dot R(t)R^T(t)+R^T(t)\dot R(t)=0\tag3
R˙(t)RT(t)+RT(t)R˙(t)=0(3)
即(等式3由矩阵乘法
A
B
=
(
B
T
A
T
)
T
AB=(B^TA^T)^T
AB=(BTAT)T得到)
R
˙
(
t
)
R
T
(
t
)
=
−
(
R
T
(
t
)
R
˙
(
t
)
)
=
−
(
R
R
˙
T
(
t
)
)
T
\dot R(t)R^T(t)=-(R^T(t)\dot R(t))=-(R\dot R^T(t))^T
R˙(t)RT(t)=−(RT(t)R˙(t))=−(RR˙T(t))T
由之前的反对称矩阵性值的知识可以看出
R
˙
(
t
)
R
T
(
t
)
\dot R(t)R^T(t)
R˙(t)RT(t)就是一个反对称矩阵,则此时等式两边同时右乘
R
(
t
)
R(t)
R(t)可得到,
R
˙
(
t
)
=
ϕ
^
(
t
)
R
(
t
)
\dot R(t)=\phi\hat{}(t)R(t)
R˙(t)=ϕ^(t)R(t)
设有随时间变化的旋转矩阵函数
R
(
t
)
R(t)
R(t),
t
=
t
0
t=t_0
t=t0时刻
R
(
0
)
=
I
R(0)=I
R(0)=I,则在
t
=
0
t=0
t=0附近将此函数进行泰勒展开
R
(
t
)
≈
R
(
t
0
)
(
t
−
t
0
)
=
I
+
ϕ
^
(
t
0
)
(
t
)
R(t)\approx R(t_0)(t-t_0)=I+\phi\hat{}(t_0)(t)
R(t)≈R(t0)(t−t0)=I+ϕ^(t0)(t)
设
ϕ
^
(
t
0
)
\phi\hat{}(t_0)
ϕ^(t0)在0时刻为常量
ϕ
^
0
\phi\hat{}_0
ϕ^0则
R
˙
(
t
)
=
ϕ
^
0
R
(
t
)
\dot R(t)=\phi\hat{}_0R(t)
R˙(t)=ϕ^0R(t)
可以解得该微分方程
R
(
t
)
=
exp
(
ϕ
^
0
t
)
R(t)=\exp(\phi\hat{}_0t)
R(t)=exp(ϕ^0t)
由上述推导可以说明:只要给定一个时刻的
R
R
R,就可以求出对应的向量
ϕ
\phi
ϕ,且向
ϕ
\phi
ϕ量就是R对应的李代数
李代数so(3)
SO(3)对应的李代数是定义在
R
3
\Bbb R^3
R3上的向量,我们记作
ϕ
\phi
ϕ。根据前面的推倒,每一个
ϕ
\phi
ϕ都可以写成一个反对称矩阵:
Φ
=
ϕ
^
=
(
0
−
ϕ
3
ϕ
2
ϕ
3
0
−
ϕ
1
−
ϕ
2
ϕ
1
0
)
∈
R
3
x
3
\Phi=\phi\hat{}=\left(\begin{matrix} 0 & -\phi_3&\phi_2\\ \phi_3&0&-\phi_1\\ -\phi_2&\phi_1&0 \end{matrix}\right) \in \Bbb R^{3x3}
Φ=ϕ^=⎝⎛0ϕ3−ϕ2−ϕ30ϕ1ϕ2−ϕ10⎠⎞∈R3x3
在此定义下,两个向量
ϕ
1
\phi_1
ϕ1,
ϕ
2
\phi_2
ϕ2的李括号为
[
ϕ
1
,
ϕ
2
]
=
(
Φ
1
Φ
2
−
Φ
2
Φ
1
)
∨
[\phi_1,\phi_2]=(\Phi_1\Phi_2-\Phi_2\Phi_1)^\lor
[ϕ1,ϕ2]=(Φ1Φ2−Φ2Φ1)∨
( ∨ ^\lor ∨为 ∧ ^\land ∧的逆运算)
由于向量
ϕ
\phi
ϕ和反对称矩阵一一对应,就说
s
o
(
3
)
so(3)
so(3)的元素是三为向量或者三为向量的反对称矩阵不加区别:
s
o
(
3
)
=
{
ϕ
∈
R
3
,
Φ
=
ϕ
∧
∈
R
3
×
3
}
so(3)=\{\phi\in\mathbb R^3, \Phi=\phi^\land\in\Bbb R^{3\times3}\}
so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3}
每个向量对应反对称矩阵,可以用表达旋转矩阵的导数,它与
S
O
(
3
)
SO(3)
SO(3)的关系由指数映射给定
R
=
exp
(
ϕ
∧
)
R=\exp(\phi^\land)
R=exp(ϕ∧)
python实现
比如以下的demo
from liepack.liepack import so
so3 = so(3)
so3.set_vector([1,2,3])
print(so3)
print(so(3, [[ 0.,-3.,2.],
[ 3.,0.,-1.],
[-2.,1.,0.]]).get_vector())
由于这个so(3)基于继承了np.ndarray, 直接可以进行矩阵运算,十分好用。