Modern Robotics 3.2:旋转矩阵、角速度与 SO(3) 直觉理解

读《Modern Robotics》第三章 3.2 时:

公式不会推导没关系,只要抓住三件事:姿态怎么表示、转动怎么表示、二者怎么互相转换。

主线如下:

  1. 用旋转矩阵 R ∈ S O ( 3 ) R\in SO(3) RSO(3) 描述三维姿态,也就是“现在朝哪儿”。
  2. 用角速度 ω \omega ω 描述姿态的瞬时变化,也就是“正在绕哪根轴、以多快转”。
  3. 用反对称矩阵 [ ω ] ∈ s o ( 3 ) [\omega]\in so(3) [ω]so(3) 把叉乘写成矩阵乘法,这样才能从“姿态怎么变”读出“正在绕哪根轴、转多快”。
  4. 用矩阵指数 R = e [ ω ^ ] θ R=e^{[\hat{\omega}]\theta} R=e[ω^]θ 把“持续转动一段角度”变成最终姿态。
  5. 用矩阵对数 log ⁡ R \log R logR 从一个姿态反推出等效的旋转轴和旋转角。

一、姿态不是位置:先分清“在哪里”和“朝哪里”

在这里插入图片描述

图 1:原书 Figure 3.6。一个刚体的位形由位置 p p p 和姿态 R R R 一起描述。

一个三维刚体的状态可以拆成两部分:

  • 它在哪里:位置 p p p
  • 它朝哪里:姿态 R R R

位置比较直观。选一个固定参考系 { s } \{s\} {s},从 { s } \{s\} {s} 的原点指向物体参考系 { b } \{b\} {b} 的原点,这个向量就是位置。

姿态更麻烦。三维里只说“转了多少度”不够,因为还必须说明“绕哪根轴转”。“绕某根轴转某个角度”是一种很直观的说法,但书里不会只用这两个量来记录姿态;Modern Robotics 选择用旋转矩阵 R R R 作为统一表示,因为矩阵更方便做参考系变换、连续复合和后续求导。

如果 { b } \{b\} {b} 是物体参考系, { s } \{s\} {s} 是固定参考系,那么:

R s b = [ ∣ ∣ ∣ x ^ b y ^ b z ^ b ∣ ∣ ∣ ] R_{sb} =\begin{bmatrix} | & | & |\\ \hat{x}_b & \hat{y}_b & \hat{z}_b\\ | & | & | \end{bmatrix} Rsb= x^by^bz^b

这里的每一列都是物体参考系的一根单位轴,但这些单位轴的坐标是用固定参考系 { s } \{s\} {s} 表达的。

所以 R s b R_{sb} Rsb 可以读成:

{ b } \{b\} {b} 的姿态,用 { s } \{s\} {s} 的坐标写出来。

下标也可以这样记:

  • 第一个下标 s s s:用哪个参考系表达;
  • 第二个下标 b b b:正在描述哪个参考系。

因此 R s b R_{sb} Rsb 的三列分别是 x ^ b , y ^ b , z ^ b \hat{x}_b,\hat{y}_b,\hat{z}_b x^b,y^b,z^b { s } \{s\} {s} 中的坐标。

二、什么样的矩阵才是旋转矩阵?

R R R 不是任意 3 × 3 3\times3 3×3 矩阵。由于它的三列是一个右手正交单位坐标系,所以必须满足:

R T R = I R^T R=I RTR=I

det ⁡ R = 1 \det R=1 detR=1

第一条说明三根轴都是单位长度,并且两两垂直。第二条说明它保持右手系,排除了镜像翻转。

满足这些条件的所有矩阵组成集合:

S O ( 3 ) = { R ∈ R 3 × 3 ∣ R T R = I , det ⁡ R = 1 } SO(3)=\{R\in\mathbb{R}^{3\times3}\mid R^TR=I,\det R=1\} SO(3)={RR3×3RTR=I,detR=1}

这里的 S O ( 3 ) SO(3) SO(3) 可以先不想得太神秘。它就是:

所有合法三维姿态的集合。

旋转矩阵有 9 个元素,但三维姿态只有 3 个自由度。真正把自由度从 9 压到 3 的,是三列向量必须单位长度、两两垂直,也就是 R T R = I R^TR=I RTR=I 给出的 6 个独立约束。右手系条件对应 det ⁡ R = 1 \det R=1 detR=1,它不是再减少一个连续自由度,而是在正交矩阵中排除镜像翻转,只保留真正的旋转。

几个性质要记住,后面会一直用:

R − 1 = R T R^{-1}=R^T R1=RT

R 1 , R 2 ∈ S O ( 3 ) ⇒ R 1 R 2 ∈ S O ( 3 ) R_1,R_2\in SO(3)\quad\Rightarrow\quad R_1R_2\in SO(3) R1,R2SO(3)R1R2SO(3)

∥ R x ∥ = ∥ x ∥ \|Rx\|=\|x\| Rx=x

也就是说,旋转矩阵的逆就是转置;两个旋转连续做,结果仍然是旋转;旋转不会改变向量长度。

常见的绕固定坐标轴旋转矩阵也可以放在这里统一看:

Rot ( x ^ , θ ) = [ 1 0 0 0 cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ ] \text{Rot}(\hat{x},\theta)= \begin{bmatrix} 1&0&0\\ 0&\cos\theta&-\sin\theta\\ 0&\sin\theta&\cos\theta \end{bmatrix} Rot(x^,θ)= 1000cosθsinθ0sinθcosθ

Rot ( y ^ , θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 1 0 − sin ⁡ θ 0 cos ⁡ θ ] \text{Rot}(\hat{y},\theta)= \begin{bmatrix} \cos\theta&0&\sin\theta\\ 0&1&0\\ -\sin\theta&0&\cos\theta \end{bmatrix} Rot(y^,θ)= cosθ0sinθ010sinθ0cosθ

Rot ( z ^ , θ ) = [ cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ 0 0 0 1 ] \text{Rot}(\hat{z},\theta)= \begin{bmatrix} \cos\theta&-\sin\theta&0\\ \sin\theta&\cos\theta&0\\ 0&0&1 \end{bmatrix} Rot(z^,θ)= cosθsinθ0sinθcosθ0001

它们都符合右手定则,也都属于 S O ( 3 ) SO(3) SO(3)

三、下标消去规则:别让 R a b R_{ab} Rab R b c R_{bc} Rbc 把你绕晕

在这里插入图片描述

图 2:原书 Figure 3.7。同一个空间点 p p p,在不同方向的参考系中会有不同坐标。

假设有三个参考系 { a } , { b } , { c } \{a\},\{b\},\{c\} {a},{b},{c}

  • 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

这就是下标消去规则: R a b R_{ab} Rab 的第二个下标 b b b,和 R b c R_{bc} Rbc 的第一个下标 b b b 接上了,所以中间的 b b b 消掉,剩下 a a a c c c。这不是形式游戏,而是在说:如果 { c } \{c\} {c} 的坐标先用 { b } \{b\} {b} 表达,再把 { b } \{b\} {b} 表达到 { a } \{a\} {a},最终就得到 { c } \{c\} {c} { a } \{a\} {a} 中的表达。

反过来:

R b a = R a b − 1 = R a b T R_{ba}=R_{ab}^{-1}=R_{ab}^T Rba=Rab1=RabT

所以如果你看到 R a b R_{ab} Rab,要立刻想到两件事:

  • 作为姿态,它的三列是 { b } \{b\} {b} 的三根单位轴在 { a } \{a\} {a} 中的坐标;
  • 作为坐标变换,它把同一个向量的坐标从 { b } \{b\} {b} 表达改写成 { a } \{a\} {a} 表达。

反过来, R b a = R a b T R_{ba}=R_{ab}^T Rba=RabT,它把同一个向量的坐标从 { a } \{a\} {a} 表达改写成 { b } \{b\} {b} 表达。

例如同一个几何向量 p \mathbf{p} p,在 { b } \{b\} {b} 中的坐标是 p b p_b pb。要把它改写成 { a } \{a\} {a} 中的坐标:

p a = R a b p b p_a=R_{ab}p_b pa=Rabpb

这里向量本身没有动,动的是“用哪套坐标数字描述它”。

四、同一个 R R R 有三种用法

1. 表示姿态

R s b R_{sb} Rsb

表示 { b } \{b\} {b} 相对于 { s } \{s\} {s} 的姿态。它的列向量就是 { b } \{b\} {b} 的三根轴在 { s } \{s\} {s} 中的坐标。

这是最直接的用法:描述一个参考系朝哪儿。

2. 改变坐标表示

p s = R s b p b p_s=R_{sb}p_b ps=Rsbpb

这里 p \mathbf{p} p 是同一个几何向量。 R s b R_{sb} Rsb 的作用不是把向量真的转动了,而是把同一个向量从 { b } \{b\} {b} 坐标表示改成 { s } \{s\} {s} 坐标表示。

这是第二种用法:改变参考系,而不改变几何对象本身。

3. 主动旋转向量或参考系

在这里插入图片描述

图 3:原书 Figure 3.9。同一个旋转矩阵,左乘和右乘对应不同的旋转语义。

R R R 也可以表示一个主动旋转操作:对象真的被转过去,但仍然用原来的参考系表达。

如果当前姿态是 R s b R_{sb} Rsb,再施加一个旋转 R R R

  • 如果旋转轴用固定参考系 { s } \{s\} {s} 表达,新的姿态是

R s b ′ = R R s b R_{sb'}=RR_{sb} Rsb=RRsb

  • 如果旋转轴用当前物体参考系 { b } \{b\} {b} 表达,新的姿态是

R s b ′ ′ = R s b R R_{sb''}=R_{sb}R Rsb′′=RsbR

三维旋转通常不可交换:

R 1 R 2 ≠ R 2 R 1 R_1R_2\neq R_2R_1 R1R2=R2R1

所以“先绕世界 z z z 轴转,再绕自己当前 x x x 轴转”,和“先绕自己当前 x x x 轴转,再绕世界 z z z 轴转”,结果一般不是同一个姿态。

看到一个旋转矩阵时,先问一句:

它是在表示姿态、改变坐标表示,还是主动旋转对象?

五、角速度:姿态正在怎样变化

旋转矩阵描述的是“现在朝哪儿”。机器人运动时,还要描述“朝向正在怎么变”。最直接的想法是看 R ˙ \dot R R˙,也就是旋转矩阵对时间的导数。但 R ˙ \dot R R˙ 有 9 个元素,而且它本身不是旋转矩阵;我们希望找到一个只有 3 个独立分量、又有清楚物理意义的量。这就是角速度。

在这里插入图片描述

图 4:原书 Figure 3.10。角速度向量的方向是瞬时旋转轴,大小是旋转快慢。

角速度向量可以写成:

ω = ω ^ θ ˙ \omega=\hat{\omega}\dot{\theta} ω=ω^θ˙

其中:

  • ω ^ \hat{\omega} ω^ 是单位旋转轴方向;
  • θ ˙ \dot{\theta} θ˙ 是绕这根轴旋转的角速度大小,单位通常是 rad/s;
  • ω \omega ω 的方向表示绕哪根轴转,长度表示转得多快。

如果你听过 roll、pitch、yaw,可以顺手排一个坑:不要先把角速度理解成这三个角的导数。欧拉角或 roll-pitch-yaw 只是姿态的某种参数化方式,会依赖旋转顺序,也可能遇到奇异性。角速度 ω \omega ω 是刚体瞬时旋转的物理量,它的核心含义是“瞬时绕哪根轴、转得多快”。

六、角速度如何驱动姿态变化

这一节的目的不是发明新的物理量,而是把“叉乘”改写成矩阵乘法。这样角速度就能和旋转矩阵 R R R、旋转矩阵导数 R ˙ \dot R R˙ 放在同一套矩阵语言里。

R ( t ) = [ ∣ ∣ ∣ r 1 ( t ) r 2 ( t ) r 3 ( t ) ∣ ∣ ∣ ] R(t)= \begin{bmatrix} | & | & |\\ r_1(t)&r_2(t)&r_3(t)\\ | & | & | \end{bmatrix} R(t)= r1(t)r2(t)r3(t)

其中 r 1 , r 2 , r 3 r_1,r_2,r_3 r1,r2,r3 分别是物体坐标系三根轴 x ^ b , y ^ b , z ^ b \hat{x}_b,\hat{y}_b,\hat{z}_b x^b,y^b,z^b 在固定参考系 { s } \{s\} {s} 中的坐标。它们是方向向量的坐标,不是物体上三个点的位置。若角速度也用固定参考系表达,记为 ω s \omega_s ωs,那么原书 Figure 3.10 对应的几何关系是:

r ˙ i = ω s × r i , i = 1 , 2 , 3 \dot r_i=\omega_s\times r_i,\qquad i=1,2,3 r˙i=ωs×ri,i=1,2,3

也就是说,如果把 r i r_i ri 看成从原点出发的一根单位箭头,那么刚体旋转时,这根箭头的端点会在单位球面上运动;它的瞬时速度由 ω s × r i \omega_s\times r_i ωs×ri 给出。

把三列合在一起:

R ˙ = [ ∣ ∣ ∣ r ˙ 1 r ˙ 2 r ˙ 3 ∣ ∣ ∣ ] = [ ∣ ∣ ∣ ω s × r 1 ω s × r 2 ω s × r 3 ∣ ∣ ∣ ] \dot R=\begin{bmatrix} | & | & |\\ \dot r_1&\dot r_2&\dot r_3\\ | & | & | \end{bmatrix} =\begin{bmatrix} | & | & |\\ \omega_s\times r_1&\omega_s\times r_2&\omega_s\times r_3\\ | & | & | \end{bmatrix} R˙= r˙1r˙2r˙3 = ωs×r1ωs×r2ωs×r3

这个式子已经说明了 R R R 的变化由角速度决定。但右边还写着三个叉乘,不方便继续做矩阵运算。于是书里引入 bracket notation。

对任意三维向量

x = [ x 1 x 2 x 3 ] x= \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} x= x1x2x3

定义

[ x ] = [ 0 − x 3 x 2 x 3 0 − x 1 − x 2 x 1 0 ] [x]= \begin{bmatrix} 0&-x_3&x_2\\ x_3&0&-x_1\\ -x_2&x_1&0 \end{bmatrix} [x]= 0x3x2x30x1x2x10

这里的方括号是 Modern Robotics 的一个专门记号:它把三维向量 x x x 变成一个 3 × 3 3\times3 3×3 矩阵。这个矩阵满足:

[ x ] T = − [ x ] [x]^T=-[x] [x]T=[x]

主对角线对称位置的元素互为相反数,所以它叫反对称矩阵。它最重要的作用是:

[ x ] y = x × y [x]y=x\times y [x]y=x×y

也就是说, [ x ] [x] [x] 是“拿 x x x 去叉乘别的向量”的矩阵版本。把这个规则用到 ω s \omega_s ωs 上,就有:

[ ω s ] R = [ ∣ ∣ ∣ [ ω s ] r 1 [ ω s ] r 2 [ ω s ] r 3 ∣ ∣ ∣ ] = [ ∣ ∣ ∣ ω s × r 1 ω s × r 2 ω s × r 3 ∣ ∣ ∣ ] [\omega_s]R =\begin{bmatrix} | & | & |\\ [\omega_s]r_1&[\omega_s]r_2&[\omega_s]r_3\\ | & | & | \end{bmatrix} =\begin{bmatrix} | & | & |\\ \omega_s\times r_1&\omega_s\times r_2&\omega_s\times r_3\\ | & | & | \end{bmatrix} [ωs]R= [ωs]r1[ωs]r2[ωs]r3 = ωs×r1ωs×r2ωs×r3

因此:

R ˙ = [ ω s ] R \dot R=[\omega_s]R R˙=[ωs]R

这条公式是本节的核心。它说:

如果角速度用固定参考系表达,那么旋转矩阵的导数等于 [ ω s ] [\omega_s] [ωs] 左乘 R R R。表示角速度如何驱动姿态变化

顺序不能随便换成 R [ ω s ] R[\omega_s] R[ωs]。这里左乘是因为 ω s \omega_s ωs R R R 的列向量 r 1 , r 2 , r 3 r_1,r_2,r_3 r1,r2,r3 都是在固定参考系 { s } \{s\} {s} 中表达的。

因为 R − 1 = R T R^{-1}=R^T R1=RT,所以可以把这条公式右乘 R T R^T RT

R ˙ R T = [ ω s ] R R T \dot R R^T=[\omega_s]RR^T R˙RT=[ωs]RRT

又因为 R R T = I RR^T=I RRT=I,所以:

[ ω s ] = R ˙ R T [\omega_s]=\dot R R^T [ωs]=R˙RT

这就是从 R ˙ \dot R R˙ 中提取空间角速度的方式。到这里,主线已经够了: R ˙ \dot R R˙ 本身有 9 个元素,不是角速度;但 R ˙ R T \dot R R^T R˙RT 会变成一个反对称矩阵,也就是 [ ω s ] [\omega_s] [ωs]

因此 R ˙ R T \dot R R^T R˙RT 只有 3 个独立量,正好对应角速度 ω s \omega_s ωs

举个实际例子:机械臂末端装了一个相机,系统每一小段时间都能估计出相机的姿态 R ( t ) R(t) R(t)。如果只看 R ( t ) R(t) R(t),你知道相机“现在朝哪儿”;算出 R ˙ R T \dot R R^T R˙RT 后,你就知道它“此刻正在绕哪根轴转、转多快”。例如结果算出来是 ω s = ( 1 , 2 , 2 ) \omega_s=(1,2,2) ωs=(1,2,2)

表示瞬时旋转轴沿固定系方向 ( 1 , 2 , 2 ) (1,2,2) (1,2,2)

角速度大小是: ∥ ω s ∥ = 1 2 + 2 2 + 2 2 = 3  rad/s \|\omega_s\|=\sqrt{1^2+2^2+2^2}=3\ \text{rad/s} ωs=12+22+22 =3 rad/s

单位旋转轴是: ω ^ s = 1 3 ( 1 , 2 , 2 ) \hat\omega_s=\frac{1}{3}(1,2,2) ω^s=31(1,2,2)

这就是这个公式的作用:把“姿态随时间的变化”翻译成更直观的“角速度”。

所有这样的 3 × 3 3\times3 3×3 反对称矩阵组成集合 s o ( 3 ) so(3) so(3)。下一节再专门解释它和 S O ( 3 ) SO(3) SO(3) 的关系。

七、 S O ( 3 ) SO(3) SO(3) s o ( 3 ) so(3) so(3) [ ω ] [\omega] [ω]:姿态、速度与矩阵表示

第一, S O ( 3 ) SO(3) SO(3) 放的是姿态。

一个旋转矩阵

R ∈ S O ( 3 ) R\in SO(3) RSO(3)

表示一个已经存在的姿态,也就是“现在朝哪儿”。它不是任意矩阵,而必须满足:

R T R = I , det ⁡ R = 1 R^TR=I,\qquad \det R=1 RTR=I,detR=1

所以可以先把 S O ( 3 ) SO(3) SO(3) 理解成:

所有合法三维姿态组成的集合。

第二, [ ω ] [\omega] [ω] 是把角速度写成矩阵。

[ ω ] [\omega] [ω] 不是新的姿态,也不是新的物理量。它只是同一个角速度向量 ω \omega ω 的矩阵写法。这样写的好处是可以把叉乘写成矩阵乘法:

[ ω ] v = ω × v [\omega]v=\omega\times v [ω]v=ω×v

第三, s o ( 3 ) so(3) so(3) 放的是所有这样的反对称矩阵。

原书紧接着说,所有 3 × 3 3\times3 3×3 实反对称矩阵组成 s o ( 3 ) so(3) so(3)

s o ( 3 ) = { Ω ∈ R 3 × 3 ∣ Ω T = − Ω } so(3)=\{\Omega\in\mathbb{R}^{3\times3}\mid \Omega^T=-\Omega\} so(3)={ΩR3×3ΩT=Ω}

任意三维向量 ω \omega ω 都能写成一个 [ ω ] [\omega] [ω],任意 3 × 3 3\times3 3×3 反对称矩阵也都能反过来读成某个三维向量。因此可以把它们看成一一对应:

ω ∈ R 3 ⟷ [ ω ] ∈ s o ( 3 ) \omega\in\mathbb{R}^3 \quad\longleftrightarrow\quad [\omega]\in so(3) ωR3[ω]so(3)

第四, s o ( 3 ) so(3) so(3) 是单位姿态处的速度空间

R ˙ = [ ω s ] R \dot R=[\omega_s]R R˙=[ωs]R

这个公式的意思是:当前姿态是 R R R,角速度是 ω s \omega_s ωs,那么姿态的瞬时变化 R ˙ \dot R R˙ [ ω s ] [\omega_s] [ωs] 左乘 R R R 得到。

如果当前姿态刚好是单位姿态:

R = I R=I R=I

那么上面的公式变成:

R ˙ = [ ω s ] I = [ ω s ] \dot R=[\omega_s]I=[\omega_s] R˙=[ωs]I=[ωs]

它说明:当姿态在 I I I 这个点时,合法的瞬时姿态变化 R ˙ \dot R R˙ 正好就是一个反对称矩阵 [ ω s ] [\omega_s] [ωs]

反过来,任意一个反对称矩阵 [ ω ] [\omega] [ω],都可以看成“从单位姿态 I I I 出发,以角速度 ω \omega ω 开始转”的瞬时变化。

这就是原书脚注那句话的意思:

s o ( 3 ) so(3) so(3) R = I R=I R=I 时所有可能的 R ˙ \dot R R˙ 组成。

所以:

  • S O ( 3 ) SO(3) SO(3) 里的点是姿态;
  • R ( t ) R(t) R(t) 是一条在 S O ( 3 ) SO(3) SO(3) 里运动的姿态轨迹;
  • R ˙ ( t ) \dot R(t) R˙(t) 是这条轨迹在某一刻的瞬时变化;
  • 当这个点是 I I I 时,所有可能的瞬时变化正好组成 s o ( 3 ) so(3) so(3)

这里的“速度”不是平移速度,不是说物体往三维空间哪个方向移动。它说的是姿态变化的速度:绕哪根轴开始转、转得多快。 ω \omega ω 的方向给出瞬时旋转轴, ∥ ω ∥ \|\omega\| ω 给出角速度大小。

第五,如果当前姿态不是 I I I,怎么办?

[ ω s ] = R ˙ R T [\omega_s]=\dot R R^T [ωs]=R˙RT

如果把角速度改用物体参考系 { b } \{b\} {b} 表达:

ω s = R s b ω b \omega_s=R_{sb}\omega_b ωs=Rsbωb

ω b = R s b T ω s \omega_b=R_{sb}^T\omega_s ωb=RsbTωs

原书 Proposition 3.8 给了一个和这个关系配套的恒等式:

R [ ω ] R T = [ R ω ] R[\omega]R^T=[R\omega] R[ω]RT=[Rω]

代入可得:
[ ω b ] = R T R ˙ = R − 1 R ˙ [\omega_b]=R^T\dot R=R^{-1}\dot R [ωb]=RTR˙=R1R˙

把空间表达和物体表达放在一起:

R ˙ R − 1 = [ ω s ] ∈ s o ( 3 ) \dot R R^{-1}=[\omega_s]\in so(3) R˙R1=[ωs]so(3)

R − 1 R ˙ = [ ω b ] ∈ s o ( 3 ) R^{-1}\dot R=[\omega_b]\in so(3) R1R˙=[ωb]so(3)

这两条式子都在做同一件事:从姿态变化 R ˙ \dot R R˙ 中提取角速度的反对称矩阵表示。区别只是参考系不同:

  • ω s \omega_s ωs:同一个角速度,用固定参考系 { s } \{s\} {s} 表达;
  • ω b \omega_b ωb:同一个角速度,用物体参考系 { b } \{b\} {b} 表达。

这一节最后可以压缩成一句话:

S O ( 3 ) SO(3) SO(3) 放姿态, s o ( 3 ) so(3) so(3) 放单位姿态处的速度, [ ω ] [\omega] [ω] 是把角速度向量放进 s o ( 3 ) so(3) so(3) 的矩阵写法。

八、有限旋转:绕某根轴,转某个角度

角速度讲的是瞬时变化。那一个已经完成的姿态 R R R,能不能理解成“绕某根轴转了某个角度”的结果?

可以。

在这里插入图片描述

图 5:原书 Figure 3.8。三维中的一个姿态可以看成绕某个单位轴 ω ^ \hat{\omega} ω^ 旋转角度 θ \theta θ

三维空间中,任意一个旋转矩阵 R ∈ S O ( 3 ) R\in SO(3) RSO(3),都可以看作:

R = Rot ( ω ^ , θ ) R=\text{Rot}(\hat{\omega},\theta) R=Rot(ω^,θ)

也就是绕单位轴 ω ^ \hat{\omega} ω^ 旋转角度 θ \theta θ

这叫轴角表示。Modern Robotics 进一步把它写成矩阵指数:

R = e [ ω ^ ] θ R=e^{[\hat{\omega}]\theta} R=e[ω^]θ

为什么会出现指数?看微分方程:

p ˙ ( t ) = ω ^ × p ( t ) = [ ω ^ ] p ( t ) \dot{p}(t)=\hat{\omega}\times p(t)=[\hat{\omega}]p(t) p˙(t)=ω^×p(t)=[ω^]p(t)

这和普通线性微分方程 x ˙ = A x \dot{x}=Ax x˙=Ax 的形式一样。解就是:

p ( t ) = e [ ω ^ ] t p ( 0 ) p(t)=e^{[\hat{\omega}]t}p(0) p(t)=e[ω^]tp(0)

如果以大小为 1 1 1 rad/s 的角速度绕 ω ^ \hat{\omega} ω^ 转动,转过角度 θ \theta θ 后,最终旋转矩阵就是:

R = e [ ω ^ ] θ R=e^{[\hat{\omega}]\theta} R=e[ω^]θ

所以矩阵指数不是凭空来的。它是在说:

把常角速度积分一段旋转角度,得到最终姿态。

对于 3 × 3 3\times3 3×3 反对称矩阵,矩阵指数有闭式结果,也就是 Rodrigues 公式:

e [ ω ^ ] θ = I + sin ⁡ θ [ ω ^ ] + ( 1 − cos ⁡ θ ) [ ω ^ ] 2 e^{[\hat{\omega}]\theta} =I+\sin\theta[\hat{\omega}] +(1-\cos\theta)[\hat{\omega}]^2 e[ω^]θ=I+sinθ[ω^]+(1cosθ)[ω^]2

这条公式非常实用:不用真的去算无限级数,就能从旋转轴和旋转角得到旋转矩阵。

九、指数坐标:用一个三维向量表示一次旋转

在这里插入图片描述

图 6:原书 Figure 3.11。绕轴连续旋转可以用矩阵指数来描述。

轴角表示有两个东西:单位轴 ω ^ \hat{\omega} ω^ 和角度 θ \theta θ。Modern Robotics 把它们合成一个三维向量:

r = ω ^ θ r=\hat{\omega}\theta r=ω^θ

这个 r r r 就是旋转的指数坐标。

它的方向表示旋转轴,长度表示旋转角:

∥ r ∥ = θ \|r\|=\theta r=θ

如果 r = 0 r=0 r=0,表示没有旋转。如果 r r r 指向某个方向,表示绕这个方向旋转;如果它更长,表示旋转角更大。

于是:

R = e [ r ] R=e^{[r]} R=e[r]

如果直接用 r r r 而不是单位轴 ω ^ \hat{\omega} ω^,令 θ = ∥ r ∥ \theta=\|r\| θ=r,当 θ ≠ 0 \theta\neq0 θ=0 时:

e [ r ] = I + sin ⁡ θ θ [ r ] + 1 − cos ⁡ θ θ 2 [ r ] 2 e^{[r]} =I+\frac{\sin\theta}{\theta}[r] +\frac{1-\cos\theta}{\theta^2}[r]^2 e[r]=I+θsinθ[r]+θ21cosθ[r]2

这和前面的 Rodrigues 公式是同一件事,只是把 r = ω ^ θ r=\hat{\omega}\theta r=ω^θ 代进去了。

在这里插入图片描述

图 7:原书 Figure 3.13。指数坐标可以想成一个半径为 π \pi π 的实心球。

可以把指数坐标 r = ω ^ θ r=\hat{\omega}\theta r=ω^θ 想成三维空间中的一个点。点的方向是旋转轴,点到原点的距离是旋转角。

为什么通常只画半径为 π \pi π 的球?因为旋转角可以选在 [ 0 , π ] [0,\pi] [0,π] 之间。超过 π \pi π 的旋转,可以换成沿相反方向的轴转一个更小的角度。例如绕某轴转 210 ∘ 210^\circ 210,等价于绕反方向轴转 150 ∘ 150^\circ 150

所以指数坐标很直观,但不是完全唯一。尤其在 θ = π \theta=\pi θ=π 附近,轴的正负会出现等价表示。这不是小问题,写程序计算矩阵对数时必须处理。

十、矩阵对数:从 R R R 找回旋转轴和旋转角

矩阵指数解决的是:

[ ω ^ ] θ ⟶ R [\hat{\omega}]\theta\quad\longrightarrow\quad R [ω^]θR

矩阵对数解决反问题:

R ⟶ [ ω ^ ] θ R\quad\longrightarrow\quad [\hat{\omega}]\theta R[ω^]θ

也就是:

[ ω ^ ] θ = log ⁡ R [\hat{\omega}]\theta=\log R [ω^]θ=logR

对一般情况,也就是 0 < θ < π 0<\theta<\pi 0<θ<π,先用迹求角度:

θ = cos ⁡ − 1 ( tr ( R ) − 1 2 ) \theta=\cos^{-1}\left(\frac{\text{tr}(R)-1}{2}\right) θ=cos1(2tr(R)1)

再求反对称矩阵:

[ ω ^ ] = 1 2 sin ⁡ θ ( R − R T ) [\hat{\omega}] =\frac{1}{2\sin\theta}(R-R^T) [ω^]=2sinθ1(RRT)

因此:

log ⁡ R = θ 2 sin ⁡ θ ( R − R T ) \log R =\frac{\theta}{2\sin\theta}(R-R^T) logR=2sinθθ(RRT)

这就是从一个旋转矩阵中取回轴角表示的核心公式。

但有两个边界情况要单独看。

第一,如果 R = I R=I R=I,说明没有旋转:

θ = 0 , log ⁡ R = 0 \theta=0,\qquad \log R=0 θ=0,logR=0

这时旋转轴没有唯一意义,因为你没转,绕哪根轴都可以说得通。

第二,如果 θ = π \theta=\pi θ=π,上面的公式会除以 sin ⁡ θ = 0 \sin\theta=0 sinθ=0,不能直接用。此时旋转轴仍然存在,但正负方向有等价性。设 R = [ r i j ] R=[r_{ij}] R=[rij],实际计算时要从 R R R 的元素里挑一个数值稳定的轴。例如可以按书里的思路,根据 1 + r 33 1+r_{33} 1+r33 1 + r 22 1+r_{22} 1+r22 1 + r 11 1+r_{11} 1+r11 哪个不为零来选:

ω ^ = 1 2 ( 1 + r 33 ) [ r 13 r 23 1 + r 33 ] \hat{\omega} =\frac{1}{\sqrt{2(1+r_{33})}} \begin{bmatrix} r_{13}\\ r_{23}\\ 1+r_{33} \end{bmatrix} ω^=2(1+r33) 1 r13r231+r33

ω ^ = 1 2 ( 1 + r 22 ) [ r 12 1 + r 22 r 32 ] \hat{\omega} =\frac{1}{\sqrt{2(1+r_{22})}} \begin{bmatrix} r_{12}\\ 1+r_{22}\\ r_{32} \end{bmatrix} ω^=2(1+r22) 1 r121+r22r32

ω ^ = 1 2 ( 1 + r 11 ) [ 1 + r 11 r 21 r 31 ] \hat{\omega} =\frac{1}{\sqrt{2(1+r_{11})}} \begin{bmatrix} 1+r_{11}\\ r_{21}\\ r_{31} \end{bmatrix} ω^=2(1+r11) 1 1+r11r21r31

然后:

log ⁡ R = [ ω ^ ] π \log R=[\hat{\omega}]\pi logR=[ω^]π

第一次读 3.2 时,不必把这个边界算法背下来。更重要的是知道:矩阵对数不是一个简单公式打天下, θ = 0 \theta=0 θ=0 θ = π \theta=\pi θ=π 必须单独处理。

小结

3.2 的核心不是背几个绕轴旋转矩阵,而是建立一条描述旋转的语言链。

第一,三维姿态用旋转矩阵 R ∈ S O ( 3 ) R\in SO(3) RSO(3) 表示。它不是任意矩阵,而是列向量正交、单位长度、保持右手系的矩阵。

第二,旋转矩阵有三种语义:表示姿态、改变坐标表示、主动旋转对象。公式长得相似时,要靠语义判断左乘还是右乘。

第三,角速度 ω \omega ω 描述姿态的瞬时变化,也就是“正在绕哪根轴、以多快转”。它不是欧拉角导数,也不是 R ˙ \dot R R˙ 本身。

第四, [ ω ] ∈ s o ( 3 ) [\omega]\in so(3) [ω]so(3) 的作用是把叉乘矩阵化。这样可以把

r ˙ i = ω s × r i \dot r_i=\omega_s\times r_i r˙i=ωs×ri

合并成矩阵公式:

R ˙ = [ ω s ] R = R [ ω b ] \dot R=[\omega_s]R=R[\omega_b] R˙=[ωs]R=R[ωb]

这一步把角速度和旋转矩阵导数连了起来。

第五,矩阵指数和矩阵对数把 s o ( 3 ) so(3) so(3) S O ( 3 ) SO(3) SO(3) 连起来:

[ ω ^ ] θ ∈ s o ( 3 ) ⟶ R = e [ ω ^ ] θ ∈ S O ( 3 ) [\hat{\omega}]\theta\in so(3) \quad\longrightarrow\quad R=e^{[\hat{\omega}]\theta}\in SO(3) [ω^]θso(3)R=e[ω^]θSO(3)

反过来, log ⁡ R \log R logR 可以从一个姿态中取回等效的旋转轴和旋转角。

通俗地说: S O ( 3 ) \mathbf{SO(3)} SO(3) 管“已经朝哪儿”, ω \boldsymbol{\omega} ω [ ω ] \boldsymbol{[\omega]} [ω] 管“正在怎样转”,矩阵指数管“转一段后到哪儿”,矩阵对数管“这个姿态可以看成怎么转过来的”。

参考资料

  1. Kevin M. Lynch and Frank C. Park, Modern Robotics: Mechanics, Planning, and Control, Chapter 3: Rigid-Body Motions, Cambridge University Press.
  2. Modern Robotics video supplement page: Chapter 3: Rigid-Body Motions.
  3. Modern Robotics video: Rotation Matrices (Part 1 of 2).
  4. Modern Robotics video: Rotation Matrices (Part 2 of 2).
  5. Modern Robotics video: Angular Velocities.
  6. Modern Robotics video: Exponential Coordinates of Rotation (Part 1 of 2).
  7. Modern Robotics video: Exponential Coordinates of Rotation (Part 2 of 2).
  8. Lynch and Park, Modern Robotics 2019 preprint PDF. 文中图片为该 PDF 中 3.2 节相关原书图的局部截图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写个 goodMan

感谢大家的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值