在数控加工、机器人路径跟踪或动画插值等实时系统中,B样条曲线的插补(interpolation)是指:以固定时间周期 T(如 1 ms)生成一系列参数 uk,使得对应的曲线点 C(uk) 满足给定的速度/加速度约束,并保证轨迹平滑。
由于 B 样条曲线的参数 u 与弧长之间没有解析关系,不能直接用匀速映射 u=u0+vT/L,因此需要数值方法逐周期计算 uk。
下面系统介绍B样条曲线在各个插补周期中计算参数 u 的主流方法:
一、泰勒展开法(二阶)
参数更新公式:
uₖ₊₁ = uₖ + T·ūₖ + (T²/2)·üₖ
其中:
ūₖ = vₖ / ‖C′(uₖ)‖
üₖ = aₖ / ‖C′(uₖ)‖ − [ (C″(uₖ) · C′(uₖ)) · vₖ² ] / ‖C′(uₖ)‖⁴
符号说明:
- T:插补周期(时间步长)
- vₖ:第 k 周期的指令速率(标量)
- aₖ:切向加速度(aₖ = dv/dt)
- C′(uₖ):B 样条曲线对参数 u 的一阶导数(向量)
- C″(uₖ):二阶导数(向量)
- ‖·‖:向量的欧几里得范数(模长)
- · :向量点积
二、牛顿迭代法(用于校正或初始反求)
目标:给定点 P,求 u 使 ‖C(u) − P‖ 最小。
迭代公式:
uₙₑw = u − f′(u) / f″(u)
其中:
f′(u) = (C(u) − P) · C′(u)
f″(u) = C′(u) · C′(u) + (C(u) − P) · C″(u)
收敛条件:|f′(u)| < ε 或 |uₙₑw − u| < ε
三、预查表法(离线+在线)
离线阶段:
- 对 u ∈ [u₀, uₘₐₓ] 均匀采样 N 点:uᵢ = u₀ + i·Δu
- 计算累积弧长 sᵢ = Σⱼ₌₀ⁱ⁻¹ ‖C(uⱼ₊₁) − C(uⱼ)‖
- 构建映射表:s → u(可存储为数组)
在线插补:
- 当前弧长:sₖ = sₖ₋₁ + v·T
- 在表中查找 sₖ 所在区间 [sᵢ, sᵢ₊₁]
- 线性插值得到 uₖ: uₖ = uᵢ + (uᵢ₊₁ − uᵢ) · (sₖ − sᵢ) / (sᵢ₊₁ − sᵢ)
四、自适应步长法(保证弦高误差)
若要求相邻插补点间的弦高误差≤ δ,则最大步长 Δu 满足:
δ ≥ ‖C(u+Δu) − C(u) − Δu·C′(u)‖ ≈ (Δu²/2) · ‖C″(u)‖
近似解出:
Δu ≤ √(2δ / ‖C″(u)‖)
因此,每个周期可动态调整:
uₖ₊₁ = uₖ + min(Δuₘₐₓ, √(2δ / ‖C″(uₖ)‖))