罗德里格斯旋转公式 Rodrigues' Rotation Formula 完整推导
- [Bilibili 同步视频](#Bilibili 同步视频)
- [1. 设定与向量正交分解](#1. 设定与向量正交分解)
- [2. 构造旋转平面内的正交基](#2. 构造旋转平面内的正交基)
- [3. 对垂直分量执行平面旋转](#3. 对垂直分量执行平面旋转)
- [4. 合并分量并整理公式](#4. 合并分量并整理公式)
- [5. 矩阵形式(工程常用)](#5. 矩阵形式(工程常用))
- 补充推导:从旋转矩阵到四元数
- [实例验证:绕 Z 轴旋转 90°](#实例验证:绕 Z 轴旋转 90°)
Bilibili 同步视频
罗德里格斯公式是三维空间刚体运动学的核心,它巧妙地利用向量叉乘与点乘 ,将"绕任意单位向量 u \boldsymbol{u} u 旋转 θ \theta θ 角"的复杂空间操作降维求解。其最终的向量表达式为:
v ′ = cos θ ⋅ v + ( 1 − cos θ ) ( u ⋅ v ) u + sin θ ⋅ ( u × v ) \boldsymbol{v}' = \cos\theta \cdot \boldsymbol{v} + (1-\cos\theta)(\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} + \sin\theta \cdot (\boldsymbol{u}\times\boldsymbol{v}) v′=cosθ⋅v+(1−cosθ)(u⋅v)u+sinθ⋅(u×v)
1. 设定与向量正交分解
设待旋转向量为 v \boldsymbol{v} v,旋转轴为单位向量 u \boldsymbol{u} u,旋转角为 θ \theta θ(遵循右手定则)。
为了简化计算,我们将 v \boldsymbol{v} v 沿着旋转轴 u \boldsymbol{u} u 进行正交分解:
v = v ∥ + v ⊥ \boldsymbol{v} = \boldsymbol{v}\parallel + \boldsymbol{v}\perp v=v∥+v⊥
- 平行分量 v ∥ = ( u ⋅ v ) u \boldsymbol{v}_\parallel = (\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} v∥=(u⋅v)u:该分量与旋转轴平行,旋转过程中保持不变。
- 垂直分量 v ⊥ = v − v ∥ \boldsymbol{v}\perp = \boldsymbol{v}-\boldsymbol{v}\parallel v⊥=v−v∥:该分量垂直于旋转轴,旋转时将在垂直平面内绕轴转动。
2. 构造旋转平面内的正交基
在垂直于 u \boldsymbol{u} u 的平面内,我们可以选取一组正交基来描述 v ⊥ \boldsymbol{v}_\perp v⊥ 的旋转轨迹:
e 1 = v ⊥ , e 2 = u × v ⊥ \boldsymbol{e}1 = \boldsymbol{v}\perp, \quad \boldsymbol{e}2 = \boldsymbol{u}\times\boldsymbol{v}\perp e1=v⊥,e2=u×v⊥
根据叉乘的右手定则与正交性质,容易验证以下关系:
u × e 1 = e 2 , u × e 2 = − e 1 \boldsymbol{u}\times\boldsymbol{e}_1 = \boldsymbol{e}_2, \quad \boldsymbol{u}\times\boldsymbol{e}_2 = -\boldsymbol{e}_1 u×e1=e2,u×e2=−e1
3. 对垂直分量执行平面旋转
垂直分量 v ⊥ \boldsymbol{v}\perp v⊥ 在平面内旋转 θ \theta θ 角后的新向量 v ⊥ ′ \boldsymbol{v}\perp' v⊥′ 可以表示为:
v ⊥ ′ = cos θ ⋅ e 1 + sin θ ⋅ e 2 = cos θ ⋅ v ⊥ + sin θ ⋅ ( u × v ⊥ ) \boldsymbol{v}_\perp' = \cos\theta \cdot \boldsymbol{e}1 + \sin\theta \cdot \boldsymbol{e}2 = \cos\theta \cdot \boldsymbol{v}\perp + \sin\theta \cdot (\boldsymbol{u}\times\boldsymbol{v}\perp) v⊥′=cosθ⋅e1+sinθ⋅e2=cosθ⋅v⊥+sinθ⋅(u×v⊥)
由于 u \boldsymbol{u} u 与平行分量 v ∥ \boldsymbol{v}\parallel v∥ 平行,其叉乘为零向量( u × v ∥ = 0 \boldsymbol{u}\times\boldsymbol{v}\parallel=0 u×v∥=0),因此我们可以将叉乘项简化:
u × v ⊥ = u × ( v − v ∥ ) = u × v \boldsymbol{u}\times\boldsymbol{v}\perp = \boldsymbol{u}\times(\boldsymbol{v} - \boldsymbol{v}\parallel) = \boldsymbol{u}\times\boldsymbol{v} u×v⊥=u×(v−v∥)=u×v
4. 合并分量并整理公式
旋转后的最终向量 v ′ \boldsymbol{v}' v′ 等于"不变的平行分量"加上"旋转后的垂直分量":
v ′ = v ∥ + v ⊥ ′ \boldsymbol{v}' = \boldsymbol{v}\parallel + \boldsymbol{v}\perp' v′=v∥+v⊥′
将前述推导代入:
v ′ = ( u ⋅ v ) u + cos θ ( v − ( u ⋅ v ) u ) + sin θ ( u × v ) \boldsymbol{v}' = (\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} + \cos\theta(\boldsymbol{v}-(\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u}) + \sin\theta(\boldsymbol{u}\times\boldsymbol{v}) v′=(u⋅v)u+cosθ(v−(u⋅v)u)+sinθ(u×v)
合并同类项,即可得到罗德里格斯旋转公式 的向量形式:
v ′ = cos θ ⋅ v + ( 1 − cos θ ) ( u ⋅ v ) u + sin θ ⋅ ( u × v ) \boldsymbol{v}' = \cos\theta \cdot \boldsymbol{v} + (1-\cos\theta)(\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} + \sin\theta \cdot (\boldsymbol{u}\times\boldsymbol{v}) v′=cosθ⋅v+(1−cosθ)(u⋅v)u+sinθ⋅(u×v)
5. 矩阵形式(工程常用)
在计算机图形学和机器人学中,为了便于批量计算,常将叉乘转换为反对称矩阵运算。定义向量 u = u x , u y , u z T \boldsymbol{u}=u_x, u_y, u_z^T u=ux,uy,uzT 的反对称矩阵 u × \\boldsymbol{u}_\times u× 为:
u × = 0 − u z u y u z 0 − u x − u y u x 0 \\boldsymbol{u}_\times = \begin{bmatrix} 0 & -u_z & u_y \\ u_z & 0 & -u_x \\ -u_y & u_x & 0 \end{bmatrix} u×= 0uz−uy−uz0uxuy−ux0
利用关系式 ( u ⋅ v ) u = u u T v (\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} = \boldsymbol{u}\boldsymbol{u}^T\boldsymbol{v} (u⋅v)u=uuTv 和 u × v = u × v \boldsymbol{u}\times\boldsymbol{v} = \\boldsymbol{u}_\times\boldsymbol{v} u×v=u×v,可推导出对应的旋转矩阵 R R R:
R = I + sin θ ⋅ u × + ( 1 − cos θ ) ⋅ u × 2 R = I + \sin\theta \cdot \\boldsymbol{u}\times + (1-\cos\theta) \cdot \\boldsymbol{u}\times^2 R=I+sinθ⋅u×+(1−cosθ)⋅u×2
补充推导:从旋转矩阵到四元数
四元数 q = w , x , y , z q = w, x, y, z q=w,x,y,z( w w w 为实部)在姿态解算中能完美避开"万向节死锁"。假设已知旋转矩阵 R R R,我们可以通过矩阵的迹(Trace)反推四元数。
单位四元数对应的旋转矩阵 R R R 为:
R = 1 − 2 y 2 − 2 z 2 2 x y − 2 w z 2 x z + 2 w y 2 x y + 2 w z 1 − 2 x 2 − 2 z 2 2 y z − 2 w x 2 x z − 2 w y 2 y z + 2 w x 1 − 2 x 2 − 2 y 2 R = \begin{bmatrix} 1-2y^2-2z^2 & 2xy-2wz & 2xz+2wy \\ 2xy+2wz & 1-2x^2-2z^2 & 2yz-2wx \\ 2xz-2wy & 2yz+2wx & 1-2x^2-2y^2 \end{bmatrix} R= 1−2y2−2z22xy+2wz2xz−2wy2xy−2wz1−2x2−2z22yz+2wx2xz+2wy2yz−2wx1−2x2−2y2
1. 求实部 w w w:
计算矩阵的迹 tr ( R ) = R 11 + R 22 + R 33 \text{tr}(R) = R_{11} + R_{22} + R_{33} tr(R)=R11+R22+R33:
tr ( R ) = 3 − 4 ( x 2 + y 2 + z 2 ) \text{tr}(R) = 3 - 4(x^2 + y^2 + z^2) tr(R)=3−4(x2+y2+z2)
利用单位四元数性质 x 2 + y 2 + z 2 = 1 − w 2 x^2 + y^2 + z^2 = 1 - w^2 x2+y2+z2=1−w2,代入得:
tr ( R ) = 3 − 4 ( 1 − w 2 ) = 4 w 2 − 1 \text{tr}(R) = 3 - 4(1 - w^2) = 4w^2 - 1 tr(R)=3−4(1−w2)=4w2−1
解得实部:
w = tr ( R ) + 1 2 w = \frac{\sqrt{\text{tr}(R) + 1}}{2} w=2tr(R)+1
2. 求虚部 x , y , z x, y, z x,y,z:
通过矩阵非对角线元素的差值求解。例如计算 R 32 − R 23 R_{32} - R_{23} R32−R23:
R 32 − R 23 = ( 2 y z + 2 w x ) − ( 2 y z − 2 w x ) = 4 w x ⟹ x = R 32 − R 23 4 w R_{32} - R_{23} = (2yz+2wx) - (2yz-2wx) = 4wx \implies x = \frac{R_{32} - R_{23}}{4w} R32−R23=(2yz+2wx)−(2yz−2wx)=4wx⟹x=4wR32−R23
同理可得:
y = R 13 − R 31 4 w , z = R 21 − R 12 4 w y = \frac{R_{13} - R_{31}}{4w}, \quad z = \frac{R_{21} - R_{12}}{4w} y=4wR13−R31,z=4wR21−R12
(注:在实际代码实现中,为防止 w → 0 w \to 0 w→0 导致除零溢出,通常会根据 R R R 对角线元素的大小,选择数值最稳定的路径进行计算。)
实例验证:绕 Z 轴旋转 90°
我们用罗德里格斯公式验证一个经典场景:将 X 轴上的向量 v = 1 , 0 , 0 T \boldsymbol{v}=1, 0, 0^T v=1,0,0T 绕 Z 轴旋转 90°。
-
输入条件 : v = 1 , 0 , 0 T \boldsymbol{v} = 1, 0, 0^T v=1,0,0T,旋转轴 u = 0 , 0 , 1 T \boldsymbol{u} = 0, 0, 1^T u=0,0,1T,角度 θ = 90 ∘ \theta = 90^\circ θ=90∘(即 cos θ = 0 , sin θ = 1 \cos\theta=0, \sin\theta=1 cosθ=0,sinθ=1)。
-
代入公式 :
v ′ = 0 ⋅ v + ( 1 − 0 ) ( u ⋅ v ) u + 1 ⋅ ( u × v ) \boldsymbol{v}' = 0 \cdot \boldsymbol{v} + (1-0)(\boldsymbol{u}\cdot\boldsymbol{v})\boldsymbol{u} + 1 \cdot (\boldsymbol{u}\times\boldsymbol{v}) v′=0⋅v+(1−0)(u⋅v)u+1⋅(u×v) -
分步计算:
- 点积项 : u ⋅ v = 0 \boldsymbol{u}\cdot\boldsymbol{v} = 0 u⋅v=0(X轴与Z轴垂直),故第二项为 0 \boldsymbol{0} 0。
- 叉乘项 : u × v = 0 , 0 , 1 T × 1 , 0 , 0 T = 0 , 1 , 0 T \boldsymbol{u}\times\boldsymbol{v} = 0, 0, 1^T \times 1, 0, 0^T = 0, 1, 0^T u×v=0,0,1T×1,0,0T=0,1,0T(根据右手定则指向Y轴)。
-
最终结果 :
v ′ = 0 , 0 , 0 T + 0 , 0 , 0 T + 0 , 1 , 0 T = 0 , 1 , 0 T \boldsymbol{v}' = 0, 0, 0^T + 0, 0, 0^T + 0, 1, 0^T = 0, 1, 0^T v′=0,0,0T+0,0,0T+0,1,0T=0,1,0T

结论 :向量 1 , 0 , 0 1, 0, 0 1,0,0 绕 Z 轴旋转 90° 后变为 0 , 1 , 0 0, 1, 0 0,1,0,与理论预期完全一致,验证了公式的正确性。