文章目录
2. 旋转和互相关
2.1 3D向量旋转公式
图 1 : 向 量 x 绕 轴 u 旋 转 ϕ 角 度 。 详 情 见 文 本 。 图1:向量\mathbf{x}绕轴\mathbf{u}旋转\phi角度。详情见文本。 图1:向量x绕轴u旋转ϕ角度。详情见文本。
我们在图1中说明了遵循右手法则,一般的3D向量 x \mathbf{x} x绕定义的单位矢量 u \mathbf{u} u旋转角度 ϕ \phi ϕ。通过将向量 x \mathbf{x} x分解成与 u \mathbf{u} u平行的部分 x ∣ ∣ \mathbf{x}_{||} x∣∣和正交的部分 x ⊥ \mathbf{x}_\bot x⊥,即
x = x ∣ ∣ + x ⊥ . \mathbf{x = x_{||} + x_{\bot}}~. x=x∣∣+x⊥ .
这些部分可以被容易地计算出来( α \alpha α是向量 x \mathbf{x} x和轴 u \mathbf{u} u之间的夹角),
x ∣ ∣ = u ( ∣ ∣ x ∣ ∣ cos α ) = u u ⊤ x x ⊥ = x − x ∣ ∣ = x − u u ⊤ x . \mathbf{x}_{||} = \mathbf{u}(||\mathbf{x}||\cos \alpha) = \mathbf{uu}^\top \mathbf{x} \\ \mathbf{x}_\bot = \mathbf{x} - \mathbf{x}_{||} = \mathbf{x} - \mathbf{uu}^\top \mathbf{x}~. x∣∣=u(∣∣x∣∣cosα)=uu⊤xx⊥=x−x∣∣=x−uu⊤x .
【 注, ∣ ∣ x ∣ ∣ cos α = ∣ ∣ u ∣ ∣ ⋅ ∣ ∣ x ∣ ∣ cos α = u ⋅ x = u ⊤ x ||\mathbf{x}||\cos \alpha = ||\mathbf{u}|| \cdot ||\mathbf{x}||\cos \alpha = \mathbf{u \cdot x} = \mathbf{u}^\top \mathbf{x} ∣∣x∣∣cosα=∣∣u∣∣⋅∣∣x∣∣cosα=u⋅x=u⊤x 】
在旋转时,平行部分不旋转,
x ∣ ∣ ′ = x ∣ ∣ , \mathbf{x}'_{||} = \mathbf{x}_{||}~, x∣∣′=x∣∣ ,
而正交部分在垂直于 u \mathbf{u} u的平面中经过平面旋转。即,如果我们创建一个该平面的正交基 { e 1 , e 2 } \{\mathbf{e}_1, \mathbf{e}_2\} {
e1,e2}
e 1 = x ⊥ e 2 = u × x ⊥ = u × x , \mathbf{e}_1 = \mathbf{x}_\bot \\ \mathbf{e}_2 = \mathbf{u \times x}_\bot = \mathbf{u \times x}~, e1=x⊥e2=u×x⊥=u×x ,
【注,这里 e 1 \mathbf{e}_1 e1和 e 2 \mathbf{e}_2 e2应该不是单位的; ∣ ∣ e 2 ∣ ∣ = ∣ ∣ u × x ∣ ∣ = ∣ ∣ u ∣ ∣ ⋅ ∣ ∣ x ⊥ ∣ ∣ ⋅ sin ( π / 2 ) = ∣ ∣ x ⊥ ∣ ∣ = ∣ ∣ e 1 ∣ ∣ ||\mathbf{e}_2|| = ||\mathbf{u \times x}|| = ||\mathbf{u}||\cdot ||\mathbf{x}_\bot||\cdot \sin(\pi/2) = ||\mathbf{x}_\bot|| = ||\mathbf{e}_1|| ∣∣e2∣∣=∣∣u×x∣∣=∣∣u∣∣⋅∣∣x⊥∣∣⋅sin(π/2)=∣∣x⊥∣∣=∣∣e1∣∣,向量 u \mathbf{u} u和 x ⊥ \mathbf{x}_\bot x⊥垂直,夹角为 π / 2 \pi/2 π/2】
满足 ∣ ∣ e 1 ∣ ∣ = ∣ ∣ e 2 ∣ ∣ ||\mathbf{e}_1|| = ||\mathbf{e}_2|| ∣∣e1∣∣=∣∣e2∣∣,那么 x ⊥ = e 1 ⋅ 1 + e 2 ⋅ 0 \mathbf{x}_\bot = \mathbf{e}_1 \cdot 1 + \mathbf{e}_2 \cdot 0 x⊥=e1⋅1+e2⋅0 。对于一个在该平面的 ϕ \phi ϕ弧度的旋转有,
x ⊥ ′ = e 1 cos ϕ + e 2 sin ϕ , \mathbf{x}'_\bot = \mathbf{e}_1 \cos\phi + \mathbf{e}_2 \sin\phi~, x⊥′=e1cosϕ+e2sinϕ ,
进一步的,
x ⊥ ′ = x ⊥ cos ϕ + ( u × x ) sin ϕ . \mathbf{x}'_\bot = \mathbf{x}_\bot \cos\phi + (\mathbf{u \times x}) \sin\phi~. x⊥′=x⊥cosϕ+(u×x)sinϕ .
加上平行部分可得出旋转矢量的表达式, x ′ = x ∣ ∣ ′ + x ⊥ ′ \mathbf{x}' = \mathbf{x}'_{||} + \mathbf{x}'_\bot x′=x∣∣′+x⊥′,这就是所谓的vector rotation formula(向量旋转公式),
x ′ = x ∣ ∣ + x ⊥ cos ϕ + ( u × x ) sin ϕ . (54) {\color{red} \mathbf{x}' = \mathbf{x}_{||} + \mathbf{x}_\bot \cos\phi + (\mathbf{u \times x})\sin\phi}~.\tag{54} x′=x∣∣+x⊥cosϕ+(u×x)sinϕ .(54)
2.2 旋转群 S O ( 3 ) SO(3) SO(3)
在 R 3 \mathbb{R}^3 R3中,旋转群 S O ( 3 ) SO(3) SO(3)是在复合作用下绕原点旋转的群。旋转是保持向量长度和相对向量方向(即旋向性)的线性变换。它在机器人学中的重要性在于表达刚体在3D空间中的旋转:一个rigid motion(刚体运动) 精确地要求刚体在运动时必须保持距离,角度和相对方向。否则,如果不能保持模长,角度或相对方向,则不能认为物体是刚性的。
然后让我们通过满足如下属性的操作来定义旋转。可以根据欧几里得空间的度量,来定义一个作用在向量 v ∈ R 3 \mathbf{v} \in \mathbb{R}^3 v∈R3上的旋转操作 r : R 3 → R 3 ; v ↦ r ( v ) r~: \mathbb{R}^3 \to \mathbb{R}^3;~\mathbf{v} \mapsto r(\mathbf{v}) r :R3→R3; v↦r(v) ,由如下的点乘和叉乘组成。
-
旋转保持向量的范数,
∣ ∣ r ( v ) ∣ ∣ = ⟨ r ( v ) , r ( v ) ⟩ = ⟨ v , v ⟩ ≜ ∣ ∣ v ∣ ∣ , ∀ v ∈ R 3 . (55a) ||r(\mathbf{v})|| = \sqrt{\langle r(\mathbf{v}), r(\mathbf{v}) \rangle} = \sqrt{\langle \mathbf{v, v} \rangle} \triangleq ||\mathbf{v}||~, ~~~\forall \mathbf{v} \in \mathbb{R}^3~.\tag{55a} ∣∣r(v)∣∣=⟨r(v),r(v)⟩=⟨v,v⟩≜∣∣v∣∣ , ∀v∈R3 .(55a) -
旋转保持向量间的角度,
⟨ r ( v ) , r ( w ) ⟩ = ⟨ v , w ⟩ = ∣ ∣ v ∣ ∣ ∣ ∣ w ∣ ∣ cos α , ∀ v , w ∈ R 3 . (55b) \langle r(\mathbf{v}), r(\mathbf{w}) \rangle = \langle \mathbf{v, w} \rangle = ||\mathbf{v}||||\mathbf{w}||\cos\alpha~, ~~~\forall \mathbf{v,~w} \in \mathbb{R}^3~.\tag{55b} ⟨r(v),r(w)⟩=⟨v,w⟩=∣∣v∣∣∣∣w∣∣cosα , ∀v, w∈R3 .(55b) -
旋转保持向量的相对旋转,
u × v = w ⟺ r ( u ) × r ( v ) = r ( w ) . (56) \mathbf{u \times v = w} \Longleftrightarrow r(\mathbf{u}) \times r(\mathbf{v}) = r(\mathbf{w})~.\tag{56} u×v=w⟺r(u)×r(v)=r(w) .(56)
很容易证明,前面2个条件恒成立。因此我们可以定义如下旋转群 S O ( 3 ) SO(3) SO(3),
S O ( 3 ) : { r : R 3 → R 3 / ∀ v , w ∈ R 3 , ∣ ∣ r ( v ) ∣ ∣ = ∣ ∣ v ∣ ∣ , r ( v ) × r ( w ) = r ( v × w ) } . (57) SO(3)~:~\{r~: \mathbb{R}^3 \to \mathbb{R}^3 ~/ ~~\forall \mathbf{v,~w} \in \mathbb{R}^3,~~||r(\mathbf{v})||=||\mathbf{v}||,~~r(\mathbf{v}) \times r(\mathbf{w}) = r(\mathbf{v \times w} ) \}~.\tag{57} SO(3) : {
r :R3→R3 / ∀v, w∈R3, ∣∣r(v)∣∣=∣∣v∣∣, r(v)×r(w)=r(v×w)} .(57)
旋转群通常由一组旋转矩阵表示。但是,四元数也组成了旋转群的一个很好表达。本节的旨在表明这两种表达同样有效。正如读者在表1中看到的那样,它们在概念上和代数上展现了很多的相似性。可能,最重要的不同是,单位四元数群组成了 S O ( 3 ) SO(3) SO(3)(因此,从技术上讲 S O ( 3 ) SO(3) SO(3)本身并不是这样的)的双覆盖,有时这在我们的大多数应用中并不重要【5】。该表是为了快速比较和评估而预先插入的。 S O ( 3 ) SO(3) SO(3)的旋转矩阵和四元数的表达将在下一节进行探究。
【注5,当在旋转空间进行插值时,需要考虑双覆盖的效果。这如如2.7节那样很容易。】
2.3 旋转群和旋转矩阵
操作 r ( ) r() r()是线性的,因为它是从在标量和向量的乘积中定义的。因此它可以通过矩阵 R ∈ R 3 × 3 \mathbf{R} \in \mathbb{R}^{3 \times 3} R∈R3×3来表达,它通过矩阵乘法产生对向量 v ∈ R 3 \mathbf{v} \in \mathbb{R}^3 v∈R3的旋转,
r ( v ) = R v . (58) r(\mathbb{v}) = \mathbf{Rv}~. \tag{58} r(v)=Rv .(58)
将其插入到式(55a)中,使用点乘 ⟨ a , b ⟩ = a ⊤ b \mathbf{\langle a, b\rangle=a^\top b} ⟨a,b⟩=a⊤b,并将其应用到所有的 v \mathbf{v} v,
( R v ) ⊤ R v = v ⊤ R ⊤ R v = v ⊤ v , (59) (\mathbf{Rv})^\top \mathbf{Rv} = \mathbf{v^\top R^\top R v} = \mathbf{v}^\top \mathbf{v}~,\tag{59} (Rv)⊤Rv=v⊤R⊤Rv=v⊤v ,(59)
得到 R \mathbf{R} R的orthogonality(正交性) 条件,
R ⊤ R = I = R R ⊤ . (60) {\color{red} \mathbf{R^\top R = I = R R^\top}}~. \tag{60} R⊤R=I=RR⊤ .(60)
上面的条件确实是正交的条件,因为我们可以从中观察到,用 R = [ r 1 , r 2 , r 3 ] \mathbf{R} = [\mathbf{r}_1, \mathbf{r}_2, \mathbf{r}_3] R=[r1,r2,r3]代替上式, R \mathbf{R} R的列向量 r i , i ∈ { 1 , 2 , 3 } \mathbf{r}_i,~i \in \{1,2,3\} ri, i∈{
1,2,3}是单位长度且相互正交,
⟨ r i , r i ⟩ = r i ⊤ r i = 1 ⟨ r i , r j ⟩ = r i ⊤ r j = 0 , i ≠ j . \langle \mathbf{r}_i, \mathbf{r}_i \rangle = \mathbf{r}_i^{\top} \mathbf{r}_i = 1 ~~~~~~~~~~~~~~~~\\ \langle \mathbf{r}_i, \mathbf{r}_j \rangle = \mathbf{r}_i^{\top} \mathbf{r}_j = 0~,~~i \neq j ~. ⟨ri,ri⟩=ri⊤ri=1 ⟨ri,rj⟩=ri⊤rj=0 , i=j .
因此,保持向量模长和角度的一组变换称为Orthogonal group(正交群),用 O ( 3 ) O(3) O(3)表示。该正交群包括旋转(对于刚体运动)和投影(对于非刚体)。这里 group(群) 的概念本质上意味着两个正交矩阵的乘积总是正交的【6】,并且每个正交矩阵都有一个逆矩阵。事实上,正交性条件(60)意味着逆旋转可通过转置的矩阵实现,
R − 1 = R ⊤ . (61) \mathbf{R}^{-1} = \mathbf{R}^\top~.\tag{61} R−1=R⊤ .(61)
【注6:令 Q 1 \mathbf{Q}_1 Q1和 Q 2 \mathbf{Q}_2 Q2正交,并创建 Q = Q 1 Q 2 \mathbf{Q} = \mathbf{Q}_1 \mathbf{Q}_2 Q=Q1Q2。那么 Q ⊤ Q = Q 2 ⊤ Q 1 ⊤ Q 1 Q 2 = Q 2 ⊤ I Q 2 = I \mathbf{Q}^\top \mathbf{Q} = \mathbf{Q}_2^\top \mathbf{Q}_1^\top \mathbf{Q}_1 \mathbf{Q}_2 = \mathbf{Q}_2^\top \mathbf{I} \mathbf{Q}_2 = \mathbf{I} Q⊤Q=Q2⊤Q1⊤Q1Q2=Q2⊤IQ2=I。】
添加相对方向条件(56)可确保刚体运动(因此抛弃投影),从而导致 R \mathbf{R} R上的一个额外的约束【7】,
det ( R ) = 1 . (62) {\color{red} \det(\mathbf{R} )= 1}~.\tag{62} det(R)=1 .(62)
单位行列式大于零的正交矩阵通常称为proper(适当,合适)或special(特殊)。该特殊正交矩阵的集合是 O ( 3 ) O(3) O(3)的一个子群,即Special Orthogonal group(特殊正交群) S O ( 3 ) SO(3) SO(3)。作为一个群,两个旋转矩阵的乘积总是旋转矩阵【8】。
【注7,注意,满足 ∣ R ∣ = det ( R ) = − 1 |\mathbf{R}| = \det(\mathbf{R}) = -1 ∣R∣=det(R)=−1的映射,不形成一个群,因为 ∣ R 1 R 2 ∣ = 1 ≠ − 1 |\mathbf{R}_1 \mathbf{R}_2| = 1 \neq -1 ∣R1R2∣=1=−1)
【注8,在脚注【6】中,对于 O ( 3 ) O(3) O(3),将 ∣ R 1 ∣ = ∣ R 2 ∣ = 1 |\mathbf{R}_1| = |\mathbf{R}_2| = 1 ∣R1∣=∣R2∣=1将加入 S O ( 3 ) SO(3) SO(3),那么有 ∣ R 1 R 2 ∣ = ∣ R 1 ∣ ∣ R 2 ∣ = 1 |\mathbf{R}_1 \mathbf{R}_2| = |\mathbf{R}_1||\mathbf{R}_2| = 1 ∣R1R2∣=∣R1∣∣R2∣=1。】
2.3.1 指数映射
指数映射(以及下一节中提到的对数映射)是一个强大的数学工具,用于在旋转的3D空间中轻松而严谨地工作。它代表了适合旋转空间的无穷微积分的入口。指数映射允许我们合适地定义微分,扰动和速度,并操作它们。因此,在估计旋转或方向空间中的问题时是必不可少。
旋转构成刚性运动。这种刚性意味着可以在 S O ( 3 ) SO(3) SO(3)中定义一条连续的轨迹或路径 r ( t ) r(t) r(t),以使刚体从其初始方向 r ( 0 ) r(0) r(0)连续旋转到当前方向 r ( t ) r(t) r(t)。由于是连续的,因此研究此类转换的时间导数是合理的。对此,我们通过推导刚刚提到的属性(60)和(62)来实现。
首先,我们注意到在满足(60)的同时不可能持续地逃避单位行列式条件(62),因为这将意味着行列式从+1跳到-1【9】。因此我们只需要探讨正交条件(60)的时间微分,即
d d t ( R ⊤ R ) = R ˙ ⊤ R + R ⊤ R ˙ = 0 , (63) \frac{d}{dt}(\mathbf{R}^\top \mathbf{R}) = \dot {\mathbf{R}}^\top \mathbf{R} + \mathbf{R}^\top \dot \mathbf{R} = 0~, \tag{63} dtd(R⊤R)=R˙⊤R+R⊤R˙=0 ,(63)
【注9,换句话说,一个旋转不能通过一个持续的变换来变成一个映射。】
可以推出
R ⊤ R ˙ = − ( R ⊤ R ˙ ) ⊤ , (64) \mathbf{R}^\top \dot \mathbf{R} = -(\mathbf{R}^\top \dot \mathbf{R})^\top~, \tag{64} R⊤R˙=−(R⊤R˙)⊤ ,(64)
这意味着矩阵 R ⊤ R ˙ \mathbf{R}^\top \dot \mathbf{R} R⊤R˙是反对称的(即等于其转置的负数)。反对称的 3 × 3 3 \times 3 3×3矩阵可以用符号 s o ( 3 ) \mathfrak{so}(3) so(3)表示,名为 S O ( 3 ) SO(3) SO(3)的李代数。反对称 3 × 3 3 \times 3 3×3矩阵有如下形式,
[ ω ] × ≜ [ 0 − ω z ω y ω z 0 − ω x − ω y ω x 0 ] ; (65) [\boldsymbol{\omega}]_\times \triangleq \left[\begin{matrix}0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{matrix}\right]~;\tag{65} [ω]×≜⎣⎡0ωz−ωy−ωz0ωxωy−ωx0⎦⎤ ;(65)
它们有3个自由度,与我们在(20)中已经引入的叉乘矩阵相对应。这建立了一个一对一的映射 ω ∈ R 3 ↔ [ ω ] × ∈ s o ( 3 ) \boldsymbol{\omega} \in \mathbb{R}^3 \leftrightarrow [\boldsymbol\omega]_\times \in \mathcal{so}(3) ω∈R3↔[ω]×∈so(3)。然后让我们取一个向量 ω = ( ω x , ω y , ω z ) ∈ R 3 \boldsymbol\omega = (\omega_x, \omega_y, \omega_z) \in R^3 ω=(ωx,ωy,ωz)∈R3,并写成
R ⊤ R ˙ = [ ω ] × . (66) \mathbf{R}^\top \dot \mathbf{R} = [\boldsymbol\omega]_\times~.\tag{66} R⊤R˙=[ω]× .(66)
这就得到了常微分方程(ODE),
R ˙ = R [ ω ] × . (67) \dot \mathbf{R} = \mathbf{R}[\boldsymbol\omega]_\times~.\tag{67} R˙=R[ω]× .(67)
在单位元附近,我们有 R = I \mathbf{R = I} R=I,然后上述等式可以简化成 R ˙ = [ ω ] × \dot \mathbf{R} = [\boldsymbol\omega]_\times~ R˙=[ω]× 。因此,我们可以将李代数 s o ( 3 ) \mathfrak{so}(3) so(3)解释为 r ( t ) r(t) r(t)在原点的微分空间;它构造了 S O ( 3 ) SO(3) SO(3)的正切空间,或者速度空间。基于这些事实,我们可以很好地称 ω \boldsymbol\omega ω为即时的角速度向量。
如果 ω \boldsymbol\omega ω是常量,上面的差分方程可以变为时间积分的形式
R ( t ) = R ( 0 ) e [ ω ] × t = R ( 0 ) e [ ω t ] × (68) \mathbf{R}(t) = \mathbf{R}(0)e^{[\boldsymbol\omega]_\times t} = \mathbf{R}(0)e^{[\boldsymbol\omega t]_\times} \tag{68} R(t)=R(0)e[ω]×t=R(0)e[ωt]×(68)
其中指数 e [ x ] × e^{[x]_\times} e[x]×由泰勒级数定义,我们将在下一节提到。因为 R ( 0 ) \mathbf{R}(0) R(0)和 R ( t ) \mathbf{R}(t) R(t)是旋转矩阵,那么很明显 e [ ω t ] × = R ( 0 ) ⊤ R ( t ) e^{[\omega t]_\times} = \mathbf{R}(0)^\top \mathbf{R}(t) e[ωt]×=R(0)⊤R(t)是一个旋转矩阵。定义向量 v ≜ ω Δ t \mathbf{v} \triangleq \boldsymbol\omega \Delta t v≜ωΔt作为编码了时间间隔 Δ t \Delta t Δt内全部旋转的旋转向量,我们有,
R = e [ v ] × . (69) {\color{red}\mathbf{R} = e^{[\mathbf{v}]_\times}}~.\tag{69} R=e[v]× .(69)
这就是所谓的指数映射,一个从 s o ( 3 ) \mathfrak{so}(3) so(3)到 S O ( 3 ) SO(3) SO(3)的应用,
exp : s o ( 3 ) → S O ( 3 ) ; [ v ] × ↦ exp ( [ v ] × ) = e [ v ] × . (70) \exp: \mathfrak{so}(3) \to SO(3);~~[\mathbf{v}]_\times \mapsto \exp([\mathbf{v}]_\times) = e^{[\mathbf{v}]_\times}~. \tag{70} exp:so(3)→SO(3); [v]×↦exp([v]×)=e[v]