读《Modern Robotics》第三章 3.2 时:
公式不会推导没关系,只要抓住三件事:姿态怎么表示、转动怎么表示、二者怎么互相转换。
主线如下:
- 用旋转矩阵 R ∈ S O ( 3 ) R\in SO(3) R∈SO(3) 描述三维姿态,也就是“现在朝哪儿”。
- 用角速度 ω \omega ω 描述姿态的瞬时变化,也就是“正在绕哪根轴、以多快转”。
- 用反对称矩阵 [ ω ] ∈ s o ( 3 ) [\omega]\in so(3) [ω]∈so(3) 把叉乘写成矩阵乘法,这样才能从“姿态怎么变”读出“正在绕哪根轴、转多快”。
- 用矩阵指数 R = e [ ω ^ ] θ R=e^{[\hat{\omega}]\theta} R=e[ω^]θ 把“持续转动一段角度”变成最终姿态。
- 用矩阵对数 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^b∣∣y^b∣∣z^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)={R∈R3×3∣RTR=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 R−1=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,R2∈SO(3)⇒R1R2∈SO(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θ0−sinθ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θ0−sinθ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θ0−sinθ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=Rab−1=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˙1∣∣r˙2∣∣r˙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]= 0x3−x2−x30x1x2−x10
这里的方括号是 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 R−1=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) R∈SO(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˙=R−1R˙
把空间表达和物体表达放在一起:
R ˙ R − 1 = [ ω s ] ∈ s o ( 3 ) \dot R R^{-1}=[\omega_s]\in so(3) R˙R−1=[ωs]∈so(3)
R − 1 R ˙ = [ ω b ] ∈ s o ( 3 ) R^{-1}\dot R=[\omega_b]\in so(3) R−1R˙=[ω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) R∈SO(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θ[ω^]+(1−cosθ)[ω^]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]+θ21−cosθ[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) θ=cos−1(2tr(R)−1)
再求反对称矩阵:
[ ω ^ ] = 1 2 sin θ ( R − R T ) [\hat{\omega}] =\frac{1}{2\sin\theta}(R-R^T) [ω^]=2sinθ1(R−RT)
因此:
log R = θ 2 sin θ ( R − R T ) \log R =\frac{\theta}{2\sin\theta}(R-R^T) logR=2sinθθ(R−RT)
这就是从一个旋转矩阵中取回轴角表示的核心公式。
但有两个边界情况要单独看。
第一,如果 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) R∈SO(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]} [ω] 管“正在怎样转”,矩阵指数管“转一段后到哪儿”,矩阵对数管“这个姿态可以看成怎么转过来的”。
参考资料
- Kevin M. Lynch and Frank C. Park, Modern Robotics: Mechanics, Planning, and Control, Chapter 3: Rigid-Body Motions, Cambridge University Press.
- Modern Robotics video supplement page: Chapter 3: Rigid-Body Motions.
- Modern Robotics video: Rotation Matrices (Part 1 of 2).
- Modern Robotics video: Rotation Matrices (Part 2 of 2).
- Modern Robotics video: Angular Velocities.
- Modern Robotics video: Exponential Coordinates of Rotation (Part 1 of 2).
- Modern Robotics video: Exponential Coordinates of Rotation (Part 2 of 2).
- Lynch and Park, Modern Robotics 2019 preprint PDF. 文中图片为该 PDF 中 3.2 节相关原书图的局部截图。

9172

被折叠的 条评论
为什么被折叠?



