1. 群

群(Group)是一种集合加上一种运算的代数结构。我们把集合记作 A A A,运算记作 ⋅ \cdot , 那么群可以记作 G = ( A , ⋅ ) G = (A, ·) G=(A,)。群要求这个运算满足以下几个条件:

  1. 封闭性: ∀ 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,a2A,a1a2A.
  2. 结合律: ∀ 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,a3A,(a1a2)a3=a1(a2a3).
  3. 幺元: ∃ a 0 ∈ A , s . t . ∀ a ∈ A , a 0 ⋅ a = a ⋅ a 0 = a \exists a_{0} \in A, \quad s.t. \quad \forall a \in A, \quad a_{0} \cdot a=a \cdot a_{0}=a a0A,s.t.aA,a0a=aa0=a
  4. 逆: ∀ a ∈ A , ∃ a − 1 ∈ A , s . t . a ⋅ a − 1 = a 0 \forall a \in A, \exists a^{−1} \in A, \quad s.t. \quad a · a^{−1} = a_0 aA,a1A,s.t.aa1=a0.
2. special orthogonal group

定义参考坐标系(fix frame)为 { S } \{S\} {S},定义body frame为 { b } \{b\} {b} { b } \{b\} {b}在fixed frame { S } \{S\} {S}下经过一定的旋转,对应的旋转矩阵为 R R R

坐标变换(4)—旋转矩阵_坐标变换

坐标系 { b } \{b\} {b}的三个坐标轴,即基, x ^ b , y ^ b , z ^ b \hat{x}_{b},\hat{y}_{b},\hat{z}_{b} x^b,y^b,z^b,同时 R = [ x ^ b , y ^ b , z ^ b ] R=[\hat{x}_{b},\hat{y}_{b},\hat{z}_{b}] R=[x^b,y^b,z^b],满足以下条件,

  1. 单位向量
    r 11 2 + r 21 2 + r 31 2 = 1 r 12 2 + r 22 2 + r 32 2 = 1 r 13 2 + r 23 2 + r 33 2 = 1 \begin{aligned} &r_{11}^{2}+r_{21}^{2}+r_{31}^{2}=1\\ &r_{12}^{2}+r_{22}^{2}+r_{32}^{2}=1\\ &r_{13}^{2}+r_{23}^{2}+r_{33}^{2}=1 \end{aligned} r112+r212+r312=1r122+r222+r322=1r132+r232+r332=1
  2. 正交
    x ^ b ⋅ y ^ b = 0 , x ^ b ⋅ z ^ b = 0 , z ^ b ⋅ y ^ b = 0 \hat{x}_{b}\cdot\hat{y}_{b}=0,\hat{x}_{b}\cdot\hat{z}_{b}=0,\hat{z}_{b}\cdot\hat{y}_{b}=0 x^by^b=0,x^bz^b=0,z^by^b=0,即
    r 11 r 12 + r 21 r 22 + r 31 r 32 = 0 r 12 r 13 + r 22 r 23 + r 32 r 33 = 0 r 11 r 13 + r 21 r 23 + r 31 r 33 = 0 \begin{array}{l} r_{11} r_{12}+r_{21} r_{22}+r_{31} r_{32}=0 \\ r_{12} r_{13}+r_{22} r_{23}+r_{32} r_{33}=0 \\ r_{11} r_{13}+r_{21} r_{23}+r_{31} r_{33}=0 \end{array} r11r12+r21r22+r31r32=0r12r13+r22r23+r32r33=0r11r13+r21r23+r31r33=0
    上面两个性质可以写成矩阵的形势,
    R R T = I RR^T=I RRT=I
    此外,坐标系 { b } \{b\} {b}的三个坐标轴还需要遵守右手坐标系,例如 x ^ b × y ^ b = z ^ b \hat{x}_{b}\times\hat{y}_{b}=\hat{z}_{b} x^b×y^b=z^b,其中 × \times ×表示叉乘。
    在线性代数上有如下的一个公式,当我们知道一个 3 × 3 3\times3 3×3矩阵 M M M的三列为 a , b , c a,b,c a,b,c时,我们可以求得矩阵的行列式值为,

det ⁡ M = a T ( b × c ) = c T ( a × b ) = b T ( c × a ) \operatorname{det} M=a^{\mathrm{T}}(b \times c)=c^{\mathrm{T}}(a \times b)=b^{\mathrm{T}}(c \times a) detM=aT(b×c)=cT(a×b)=bT(c×a)
所以,我们可以得到,
d e t R = 1 det R=1 detR=1
至此,我们推导出了旋转矩阵满足的两个条件。在数学上,将满足上述两个条件的 3 × 3 3\times3 3×3的矩阵统称为special orthogonal group S O ( 3 ) SO(3) SO(3),即3维的特殊正交群,容易验证 R R R符合群的封结幺逆的性质,此外对于任意的3维列向量 x x x y = R x y=Rx y=Rx x x x具有相同的长度(2范数)。

∥ y ∥ 2 = y T y = ( R x ) T R x = x T R T R x = x T x = ∥ x ∥ 2 \|y\|^{2}=y^{\mathrm{T}} y=(R x)^{\mathrm{T}} R x=x^{\mathrm{T}} R^{\mathrm{T}} R x=x^{\mathrm{T}} x=\|x\|^{2} y2=yTy=(Rx)TRx=xTRTRx=xTx=x2

3. 旋转矩阵的使用
  1. 描述一个坐标系
  2. 改变向量或者坐标系的参考坐标系
  3. 旋转一个坐标系或者向量

3.1 描述坐标系

第一种情况下,旋转矩阵的三列分别对应坐标系的三个坐标轴,即基,

坐标变换(4)—旋转矩阵_向量_02

考虑以上三个坐标系,其对应的描述为,
R a = [ 1 0 0 0 1 0 0 0 1 ] , R b = [ 0 − 1 0 1 0 0 0 0 1 ] , R c = [ 0 − 1 0 0 0 − 1 1 0 0 ] R_{a}=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right], \quad R_{b}=\left[\begin{array}{ccc} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right], \quad R_{c}=\left[\begin{array}{ccc} 0 & -1 & 0 \\ 0 & 0 & -1 \\ 1 & 0 & 0 \end{array}\right] Ra=100010001,Rb=010100001,Rc=001100010

而空间中的同一点 P P P,在三个坐标系中的描述分别为,

p a = [ 1 1 0 ] , p b = [ 1 − 1 0 ] , p c = [ 0 − 1 − 1 ] p_{a}=\left[\begin{array}{l} 1 \\ 1 \\ 0 \end{array}\right], \quad p_{b}=\left[\begin{array}{c} 1 \\ -1 \\ 0 \end{array}\right], \quad p_{c}=\left[\begin{array}{c} 0 \\ -1 \\ -1 \end{array}\right] pa=110,pb=110,pc=011

R a p a = R b p b = R c p c = [ 1 1 0 ] R_{a}p_a=R_bp_b=R_cp_c=\left[\begin{array}{l} 1 \\ 1 \\ 0 \end{array}\right] Rapa=Rbpb=Rcpc=110

3.2 改变参考坐标系

假设旋转矩阵 R a b R_{ab} Rab,描述了 { b } \{b\} {b}相对于 { a } \{a\} {a}的旋转, R b c R_{bc} Rbc描述了 { c } \{c\} {c}相对于 { b } \{b\} {b}的旋转,则 R a c R_{ac} Rac { c } \{c\} {c}相对于 { a } \{a\} {a}的旋转,
R a c = R a b R b c R_{ac}=R_{ab}R_{bc} Rac=RabRbc
向量 p p p { b } \{b\} {b}坐标系的向量为 p b p_b pb,则在 { a } \{a\} {a}坐标系下 p a p_a pa为,
R a b p b = p a R_{ab}p_b=p_a Rabpb=pa

3.3 旋转一个坐标系或者向量

在坐标系 { a } \{a\} {a}下旋转一个向量 p a p_a pa(同一坐标系下),会产生另外一个向量 p ′ a p\prime _a pa
p ′ a = R p a p\prime _a=Rp_a pa=Rpa

而对一个坐标系乘以一个旋转矩阵,则有不同的意义,分为左乘右乘,下面分别介绍,其中参考坐标系为 { S } \{S\} {S},body frame为 { b } \{b\} {b} { S } \{S\} {S} Z Z Z轴转90度生成 { b } \{b\} {b} R s b R_{sb} Rsb表示 { b } \{b\} {b} { S } \{S\} {S}下的描述, R R R仅表示某一旋转矩阵(绕着 x x x转30度),下面借助matlab来进行可视化,

3.3.1 左乘

R_sb = rotz(90)
R = rotx(30)
R_1 =  R * R_sb 
tranimate(R_1)
R_sb =

     0    -1     0
     1     0     0
     0     0     1
     
R =

    1.0000         0         0
         0    0.8660   -0.5000
         0    0.5000    0.8660
R_1 =

         0   -1.0000         0
    0.8660         0   -0.5000
    0.5000         0    0.8660

坐标变换(4)—旋转矩阵_坐标变换_03

最终结果,

坐标变换(4)—旋转矩阵_自动驾驶_04

由上面两图可以看到, R R R左乘 R s b R_{sb} Rsb,是顺着原来 { S } \{S\} {S}中的 X X X轴旋转了30度。因此左乘, { R } \{R\} {R}是在 { S } \{S\} {S}坐标系下的描述。

3.3.2 右乘

R_sb = rotz(90)
R = rotx(30)
R_1 =  R_sb * R 
tranimate(R_1)
R_sb =

     0    -1     0
     1     0     0
     0     0     1
R =

    1.0000         0         0
         0    0.8660   -0.5000
         0    0.5000    0.8660
R_1 =

         0   -0.8660    0.5000
    1.0000         0         0
         0    0.5000    0.8660

坐标变换(4)—旋转矩阵_自动驾驶_05

最终结果,

坐标变换(4)—旋转矩阵_坐标变换_06

由上面两图可以看到, R R R右乘 R s b R_{sb} Rsb,是顺着 { b } \{b\} {b}中的 X X X轴旋转了30度。右乘, { R } \{R\} {R}是在 { b } \{b\} {b}坐标系下描述。
其实关于左乘和右乘,在前面的文章中介绍过旋转矩阵的列向量是 { b } \{b\} {b} { S } \{S\} {S}中的描述,右乘相当于,
[ x ^ b , y ^ b , z ^ b ] R = [ r 11 x ^ b + r 21 y ^ b + r 31 z ^ b , r 12 x ^ b + r 22 y ^ b + r 32 z ^ b , r 13 x ^ b + r 23 y ^ b + r 33 z ^ b ] \begin{bmatrix} \hat{x}_{b},\hat{y}_{b},\hat{z}_{b} \end{bmatrix}R=\begin{bmatrix} r_{11}\hat{x}_{b}+r_{21}\hat{y}_{b}+r_{31}\hat{z}_{b},r_{12}\hat{x}_{b}+r_{22}\hat{y}_{b}+r_{32}\hat{z}_{b},r_{13}\hat{x}_{b}+r_{23}\hat{y}_{b}+r_{33}\hat{z}_{b} \end{bmatrix} [x^b,y^b,z^b]R=[r11x^b+r21y^b+r31z^b,r12x^b+r22y^b+r32z^b,r13x^b+r23y^b+r33z^b]
此时,矩阵的乘积的每一列都是 { b } \{b\} {b}所对应基的线性组合,所以 { R } \{R\} {R}此时的意义肯定是在 { b } \{b\} {b}坐标系下描述。
同理,前面文章提到过,旋转矩阵的行向量是 { S } \{S\} {S} { b } \{b\} {b}中的描述,此时 { b } \{b\} {b}是参考坐标系,
R [ x ^ s y ^ s z ^ s ] = [ r 11 x ^ s + r 12 y ^ s + r 13 z ^ s r 21 x ^ s + r 22 y ^ s + r 23 z ^ s r 31 x ^ s + r 32 y ^ s + r 33 z ^ s ] R\begin{bmatrix} \hat{x}_{s} \\ \hat{y}_{s} \\ \hat{z}_{s} \end{bmatrix}=\begin{bmatrix} r_{11}\hat{x}_{s}+r_{12}\hat{y}_{s}+r_{13}\hat{z}_{s}\\ r_{21}\hat{x}_{s}+r_{22}\hat{y}_{s}+r_{23}\hat{z}_{s}\\ r_{31}\hat{x}_{s}+r_{32}\hat{y}_{s}+r_{33}\hat{z}_{s} \end{bmatrix} Rx^sy^sz^s=r11x^s+r12y^s+r13z^sr21x^s+r22y^s+r23z^sr31x^s+r32y^s+r33z^s
此时,矩阵的乘积的每一行都是 { S } \{S\} {S}所对应基的线性组合,所以 { R } \{R\} {R}此时的意义肯定是在 { S } \{S\} {S}坐标系下描述。