CRISP源码阅读——SLERP+LERP 匀速插值均匀在哪里
1. 引言:人类直觉中的"匀速"
在工业机器人、动画和航天领域,我们对"匀速运动"的直觉包含两个独立的诉求:
- 平移要直:末端在世界坐标系中沿直线运动,速度恒定。
- 旋转要匀:姿态绕固定轴以恒定角速度旋转,不忽快忽慢。
SLERP(旋转)+ LERP(平移) 正是同时满足这两个诉求的标准方案。本文用严格的公式说明它为什么"符合直觉",并对比其他方案的差异。
2. SLERP + LERP 的完整公式
2.1 问题设定
给定初始位姿 T0=(R0,p0)T_0 = (R_0, p_0)T0=(R0,p0) 和末位姿 T1=(R1,p1)T_1 = (R_1, p_1)T1=(R1,p1),插值参数 t∈[0,1]t \in [0, 1]t∈[0,1]。
2.2 旋转部分:四元数 SLERP
将旋转矩阵转为单位四元数 q0,q1∈S3q_0, q_1 \in S^3q0,q1∈S3。定义相对旋转:
qrel=q0−1⊗q1q_{\text{rel}} = q_0^{-1} \otimes q_1qrel=q0−1⊗q1
将其写成指数形式:
qrel=exp(ωb2),ωb∈R3q_{\text{rel}} = \exp\left(\frac{\omega_b}{2}\right), \quad \omega_b \in \mathbb{R}^3qrel=exp(2ωb),ωb∈R3
其中 ωb\omega_bωb 是相对旋转的轴角向量(体坐标系下)。
SLERP 插值公式:
q(t)=q0⊗exp(t⋅ωb2)\boxed{q(t) = q_0 \otimes \exp\left(t \cdot \frac{\omega_b}{2}\right)}q(t)=q0⊗exp(t⋅2ωb)
展开指数:
q(t)=q0⊗(cos∥ωb∥t2+ω^bsin∥ωb∥t2)q(t) = q_0 \otimes \left(\cos\frac{\|\omega_b\| t}{2} + \hat{\omega}_b \sin\frac{\|\omega_b\| t}{2}\right)q(t)=q0⊗(cos2∥ωb∥t+ω^bsin2∥ωb∥t)
其中 ω^b=ωb/∥ωb∥\hat{\omega}_b = \omega_b / \|\omega_b\|ω^b=ωb/∥ωb∥ 是单位旋转轴。
2.3 平移部分:线性插值 LERP
p(t)=(1−t) p0+t p1\boxed{p(t) = (1-t)\,p_0 + t\,p_1}p(t)=(1−t)p0+tp1
2.4 完整位姿
T(t)=[R(t)p(t)01]T(t) = \begin{bmatrix} R(t) & p(t) \\ 0 & 1 \end{bmatrix}T(t)=[R(t)0p(t)1]
其中 R(t)R(t)R(t) 由 q(t)q(t)q(t) 转换得到。
3. 为什么 p˙\dot{p}p˙、ωb\omega_bωb、ωs\omega_sωs 恒定?
3.1 末端点速度 p˙\dot{p}p˙ 恒定
对 LERP 求导:
p˙(t)=ddt[(1−t)p0+tp1]=p1−p0=常数\dot{p}(t) = \frac{d}{dt}\left[(1-t)p_0 + tp_1\right] = p_1 - p_0 = \text{常数}p˙(t)=dtd[(1−t)p0+tp1]=p1−p0=常数
结论:p˙\dot{p}p˙ 是常向量,末端在世界坐标系中沿直线匀速运动。
3.2 体角速度 ωb\omega_bωb 恒定
四元数运动学方程:
q˙=12q⊗ωb\dot{q} = \frac{1}{2} q \otimes \omega_bq˙=21q⊗ωb
对 q(t)=q0⊗exp(tωb/2)q(t) = q_0 \otimes \exp(t\omega_b/2)q(t)=q0⊗exp(tωb/2) 求导:
q˙(t)=q0⊗exp(tωb2)⊗ωb2\dot{q}(t) = q_0 \otimes \exp\left(t\frac{\omega_b}{2}\right) \otimes \frac{\omega_b}{2}q˙(t)=q0⊗exp(t2ωb)⊗2ωb
于是:
q(t)−1q˙(t)=exp(−tωb2)⊗q0−1⊗q0⊗exp(tωb2)⊗ωb2=ωb2q(t)^{-1} \dot{q}(t) = \exp\left(-t\frac{\omega_b}{2}\right) \otimes q_0^{-1} \otimes q_0 \otimes \exp\left(t\frac{\omega_b}{2}\right) \otimes \frac{\omega_b}{2} = \frac{\omega_b}{2}q(t)−1q˙(t)=exp(−t2ωb)⊗q0−1⊗q0⊗exp(t2ωb)⊗2ωb=2ωb
所以:
ωb(t)=2 q(t)−1q˙(t)=ωb=常数\boxed{\omega_b(t) = 2\,q(t)^{-1}\dot{q}(t) = \omega_b = \text{常数}}ωb(t)=2q(t)−1q˙(t)=ωb=常数
3.3 空间角速度 ωs\omega_sωs 恒定
空间角速度的定义:
ωs(t)=2 q˙(t) q(t)−1\omega_s(t) = 2\,\dot{q}(t)\,q(t)^{-1}ωs(t)=2q˙(t)q(t)−1
计算:
q˙(t)q(t)−1=q0⊗exp(tωb2)⊗ωb2⊗exp(−tωb2)⊗q0−1\dot{q}(t)q(t)^{-1} = q_0 \otimes \exp\left(t\frac{\omega_b}{2}\right) \otimes \frac{\omega_b}{2} \otimes \exp\left(-t\frac{\omega_b}{2}\right) \otimes q_0^{-1}q˙(t)q(t)−1=q0⊗exp(t2ωb)⊗2ωb⊗exp(−t2ωb)⊗q0−1
因为 ωb\omega_bωb 与 exp(tωb/2)\exp(t\omega_b/2)exp(tωb/2) 可交换:
=q0⊗ωb2⊗q0−1= q_0 \otimes \frac{\omega_b}{2} \otimes q_0^{-1}=q0⊗2ωb⊗q0−1
所以:
ωs(t)=q0 ωb q0−1=R0 ωb=常数\boxed{\omega_s(t) = q_0\,\omega_b\,q_0^{-1} = R_0\,\omega_b = \text{常数}}ωs(t)=q0ωbq0−1=R0ωb=常数
几何解释:ωb\omega_bωb 是旋转轴方向。绕轴旋转不改变轴本身,因此 ωs=R(t)ωb=R0ωb\omega_s = R(t)\omega_b = R_0\omega_bωs=R(t)ωb=R0ωb 恒定。
3.4 恒定性总结
| 量 | 是否恒定 | 数学原因 |
|---|---|---|
| p˙\dot{p}p˙ | ✅ | LERP 是线性函数 |
| ωb\omega_bωb | ✅ | 指数映射保持生成元不变 |
| ωs\omega_sωs | ✅ | 绕固定轴旋转不改变轴方向 |
4. 对比:若要求空间或体线速度恒定
4.1 空间线速度 vsv_svs 恒定 → ScLERP
空间旋量的线速度分量为:
vs=p˙−ωs×pv_s = \dot{p} - \omega_s \times pvs=p˙−ωs×p
若要求 vsv_svs 恒定,则 p(t)p(t)p(t) 不能再是直线插值。真实的运动为螺旋运动:
T(t)=T0exp(t ξ∧),ξ=(ω,v)T(t) = T_0 \exp(t\,\xi^\wedge), \quad \xi = (\omega, v)T(t)=T0exp(tξ∧),ξ=(ω,v)
此时末端轨迹为螺旋线,不再走直线。
4.2 体线速度 vbv_bvb 恒定 → 同上
体线速度与空间线速度通过伴随变换关联:
vb=R(t)T(vs−ωs×p)=R(t)Tp˙v_b = R(t)^T (v_s - \omega_s \times p) = R(t)^T \dot{p}vb=R(t)T(vs−ωs×p)=R(t)Tp˙
若 vbv_bvb 恒定,则 p˙\dot{p}p˙ 必须随 R(t)R(t)R(t) 旋转,末端同样走螺旋线。
4.3 对比表
| 方案 | p˙\dot{p}p˙ | ωb\omega_bωb | ωs\omega_sωs | vsv_svs | vbv_bvb | 末端轨迹 |
|---|---|---|---|---|---|---|
| SLERP+LERP | ✅ | ✅ | ✅ | ❌ | ❌ | 直线 |
| ScLERP | ❌ | ✅ | ✅ | ✅ | ✅ | 螺旋线 |
核心权衡:末端走直线(满足工艺)与旋量线速度恒定(满足数学优美)不可兼得。
5. 为什么 SLERP 用四元数而不是旋转矩阵?
5.1 旋转矩阵插值的困难
若直接对 R0R_0R0 和 R1R_1R1 做线性插值:
Rlin(t)=(1−t)R0+tR1R_{\text{lin}}(t) = (1-t)R_0 + tR_1Rlin(t)=(1−t)R0+tR1
结果不是旋转矩阵,因为:
- 正交性破坏:RlinTRlin≠IR_{\text{lin}}^T R_{\text{lin}} \neq IRlinTRlin=I
- 行列式不等于 1
必须做正交化(如 SVD),成本极高。
5.2 四元数 SLERP 的优势
| 维度 | 四元数 SLERP | 旋转矩阵插值 |
|---|---|---|
| 存储 | 4 个浮点数 | 9 个浮点数 |
| 插值公式 | 闭式解析 | 需要矩阵对数/指数 |
| 归一化 | 除以模长 | SVD 或 Gram-Schmidt |
| 每步运算 | ~16 次乘法 | ~27 次乘法 + 正交化 |
| 奇异性 | 无 | 无 |
| 角速度均匀性 | ✅ 天然保证 | 需额外计算 |
5.3 数学本质
四元数 SLERP 的核心是:
q(t)=q0⊗exp(tωb2)q(t) = q_0 \otimes \exp\left(t\frac{\omega_b}{2}\right)q(t)=q0⊗exp(t2ωb)
这是 S3S^3S3 超球面上的测地线,天然对应等角速度旋转。而矩阵插值无法直接表达这种指数结构。
6. 如果直接对 RRR 或 RPY 插值,角速度均匀吗?
6.1 对旋转矩阵直接插值
若对 R0R_0R0 和 R1R_1R1 的每个元素做线性插值:
Rnaive(t)=(1−t)R0+tR1R_{\text{naive}}(t) = (1-t)R_0 + tR_1Rnaive(t)=(1−t)R0+tR1
结果:
- 不是旋转矩阵(正交性破坏)。
- 即使事后正交化,得到的角速度不均匀。
- 因为正交化过程是非线性的,会引入额外的角速度变化。
结论:角速度不均匀 ❌。
6.2 对欧拉角(RPY)插值
若将 R0,R1R_0, R_1R0,R1 转为欧拉角 (ϕ0,θ0,ψ0)(\phi_0, \theta_0, \psi_0)(ϕ0,θ0,ψ0) 和 (ϕ1,θ1,ψ1)(\phi_1, \theta_1, \psi_1)(ϕ1,θ1,ψ1),然后线性插值:
ϕ(t)=(1−t)ϕ0+tϕ1,类似地 θ(t),ψ(t)\phi(t) = (1-t)\phi_0 + t\phi_1, \quad \text{类似地 } \theta(t), \psi(t)ϕ(t)=(1−t)ϕ0+tϕ1,类似地 θ(t),ψ(t)
问题:
- 万向节锁:当 θ=±π/2\theta = \pm\pi/2θ=±π/2 时,ϕ\phiϕ 和 ψ\psiψ 耦合,插值结果不可预测。
- 角速度不均匀:三个欧拉角的线性变化不对应刚体的恒定角速度旋转。因为欧拉角速度与体角速度的关系为:
ωb=E(ϕ,θ,ψ)[ϕ˙θ˙ψ˙]\omega_b = E(\phi, \theta, \psi) \begin{bmatrix} \dot{\phi} \\ \dot{\theta} \\ \dot{\psi} \end{bmatrix}ωb=E(ϕ,θ,ψ)ϕ˙θ˙ψ˙
其中 EEE 是与角度相关的矩阵。即使 ϕ˙,θ˙,ψ˙\dot{\phi}, \dot{\theta}, \dot{\psi}ϕ˙,θ˙,ψ˙ 是常数,ωb\omega_bωb 也会随姿态变化。
- 路径非测地线:欧拉角空间的直线在 SO(3)SO(3)SO(3) 流形上不是测地线。
结论:角速度不均匀 ❌。
6.3 对比总结
| 插值方式 | 角速度均匀? | 无奇异性? | 结果合法? |
|---|---|---|---|
| 四元数 SLERP | ✅ | ✅ | ✅ |
| 旋转矩阵线性插值 | ❌ | ✅ | ❌(需正交化) |
| 欧拉角线性插值 | ❌ | ❌(万向锁) | ⚠️(一般情况合法) |
7. 总结
SLERP+LERP 之所以符合人类认知的"匀速",是因为它同时保证了三个量的恒定:
p˙=常数,ωb=常数,ωs=常数\boxed{\dot{p} = \text{常数}, \quad \omega_b = \text{常数}, \quad \omega_s = \text{常数}}p˙=常数,ωb=常数,ωs=常数
- p˙\dot{p}p˙ 恒定 → 末端走直线(视觉直观)。
- ωb\omega_bωb 恒定 → 绕体坐标系固定轴匀速旋转(体感直观)。
- ωs\omega_sωs 恒定 → 绕世界坐标系固定轴匀速旋转(空间直观)。
代价:两个旋量线速度 vs,vbv_s, v_bvs,vb 不恒定。若追求旋量层面的均匀,则必须用 ScLERP,但末端将走螺旋线而非直线。
工程选择:工业机器人优先满足"末端走直线"(工艺需求),因此 SLERP+LERP 成为标准方案。它牺牲了 SE(3)SE(3)SE(3) 流形上的测地线最优性,换来了物理空间中的路径可控性。
四元数的不可替代性:SLERP 必须用四元数实现,因为只有四元数(和旋转矩阵)能表示姿态,而四元数提供了最简洁、高效、无奇异的指数映射结构。欧拉角插值虽然直观,但角速度不均匀且存在万向锁;旋转矩阵插值需要昂贵的正交化,且角速度同样不均匀。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)