插补原理:直线插补、圆弧插补、样条插补的基本原理与数学描述
插补(Interpolation)是运动控制系统的核心计算环节,其本质是在已知的起点与终点之间,按照某种数学规律实时计算出中间点的坐标序列,并将这些坐标点转化为各轴的位置指令。在多轴联动场景中,插补算法的质量直接决定了加工轮廓的精度、表面粗糙度以及机床运行的平稳性。本章将深入剖析直线插补、圆弧插补与样条插补的数学本质、工程实现路径及适用边界,帮助读者建立从几何描述到代码落地的完整认知。
4.1 直线插补:从几何方程到脉冲分配
4.1.1 核心原理与数学描述
直线插补解决的是在二维或三维空间中,从起点 \(P_0(x_0,y_0)\) 到终点 \(P_1(x_1,y_1)\) 之间生成一系列中间点的问题。其数学基础是直线的参数方程:
P(t) = P0 + t·(P1 - P0), t ∈ [0, 1]
在实际数控系统中,插补周期 \(T_s\) 固定(通常为 1~8ms),进给速度 \(F\) 已知,则每个插补周期的步长 \(\Delta L = F \cdot T_s\)。将总位移 \(L = \sqrt{(x_1-x_0)^2 + (y_1-y_0)^2}\) 按步长分割,得到插补点序列。然而,工程实现中更常用的是逐点比较法和数字积分法(DDA),它们不依赖浮点三角函数,仅通过整数加减和符号判断即可完成插补。
4.1.2 逐点比较法的工作流程
逐点比较法的核心思想是:每走一步,比较当前点与理想直线的偏差,根据偏差符号决定下一步的进给方向。以第一象限直线为例,偏差函数定义为:
F = x_e·y - y_e·x
其中 \((x_e, y_e)\) 为终点坐标。若 \(F \ge 0\),说明当前点在直线上方,应向 +X 方向进给一步;若 \(F < 0\),说明当前点在直线下方,应向 +Y 方向进给一步。每走一步后,偏差函数通过递推公式更新,避免重复乘法运算:
向+X走一步: F_new = F_old - y_e
向+Y走一步: F_new = F_old + x_e
这种递推方式将计算量压缩到每次仅一次整数加减法,非常适合 FPGA 或低端 MCU 实现。
| 特性 | 逐点比较法 | DDA(数字积分法) | 最小偏差法 |
|---|---|---|---|
| 计算复杂度 | 每次1次加减 | 每次2次累加+1次比较 | 每次2次加减+2次比较 |
| 最大误差 | ≤1个脉冲当量 | ≤1个脉冲当量 | ≤0.5个脉冲当量 |
| 适用轴数 | 2轴为主 | 2~3轴 | 2轴 |
| 速度均匀性 | 一般 | 较好 | 较好 |
| 硬件资源占用 | 极低 | 低 | 低 |
4.1.3 案例拆解:三轴直线插补的象限处理
假设某龙门式点胶机需要在 XY 平面内从 (0,0) 移动到 (-30, 20),进给速度 100mm/min,脉冲当量 0.01mm,插补周期 2ms。由于终点在第二象限,直接套用第一象限公式会导致方向错误。工程处理方法是坐标变换:将终点坐标取值,按第一象限算法计算步数分配,再根据实际象限决定脉冲方向。
// 伪代码:象限映射
int x_abs = abs(x_e), y_abs = abs(y_e);
int steps = max(x_abs, y_abs) / pulse_per_step;
for (int i = 0; i < steps; i++) {
if (F >= 0) {
move_x(x_e > 0 ? 1 : -1); // 根据符号决定方向
F -= y_abs;
} else {
move_y(y_e > 0 ? 1 : -1);
F += x_abs;
}
}
该案例中,总步数约为 \(\sqrt{30^2+20^2}/0.01 \approx 3605\) 步,耗时约 7.2 秒。实际运行中需注意:当 \(x_e=0\) 或 \(y_e=0\) 时,算法退化为单轴运动,需单独处理以避免除零。
4.2 圆弧插补:角度参数化与误差控制
4.2.1 基本原理与数学描述
圆弧插补的数学基础是圆的参数方程:
x = x_c + r·cos(θ)
y = y_c + r·sin(θ)
其中 \((x_c, y_c)\) 为圆心坐标,\(r\) 为半径,\(\theta\) 从起始角 \(\theta_s\) 变化到终止角 \(\theta_e\)。工程实现中,逐点比较法的圆弧偏差函数定义为:
F = x² + y² - r²
以第一象限逆圆为例:若 \(F \ge 0\),点在圆外,应向 -X 方向进给;若 \(F < 0\),点在圆内,应向 +Y 方向进给。递推公式为:
向-X走一步: F_new = F_old - 2x + 1; x = x - 1
向+Y走一步: F_new = F_old + 2y + 1; y = y + 1
4.2.2 象限切换与过象限处理
圆弧插补的难点在于象限切换。当圆弧跨越象限边界时,进给方向会突变,若处理不当会产生尖角。标准做法是将圆弧按象限分段,每段独立计算终点坐标,段间平滑过渡。例如从 30° 到 210° 的圆弧,应拆分为 30°→90°(第一象限)、90°→180°(第二象限)、180°→210°(第三象限)三段。
| 象限 | 圆弧方向 | 偏差≥0时进给 | 偏差<0时进给 |
|---|---|---|---|
| 第一象限 | 逆圆 | -X | +Y |
| 第一象限 | 顺圆 | -Y | +X |
| 第二象限 | 逆圆 | +Y | -X |
| 第二象限 | 顺圆 | +X | -Y |
| 第三象限 | 逆圆 | +X | -Y |
| 第三象限 | 顺圆 | +Y | +X |
| 第四象限 | 逆圆 | -Y | +X |
| 第四象限 | 顺圆 | -X | -Y |
4.2.3 实战场景:圆弧逼近的弓高误差
在 CNC 加工中,圆弧插补的轮廓误差主要来源于弓高误差。当用直线段逼近圆弧时,最大弓高误差 \(h\) 与步距角 \(\Delta\theta\) 的关系为:
h = r·(1 - cos(Δθ/2)) ≈ r·Δθ²/8
若要求 \(h \le 0.005mm\),半径 \(r=50mm\),则 \(\Delta\theta \le \sqrt{8h/r} \approx 0.028rad\),即约 1.6°。这意味着整圆需要约 225 个插补点。实际系统中,插补周期固定,进给速度越高,每个周期的角位移越大,弓高误差随之增大。因此,高速圆弧加工必须降低进给速度或采用样条插补。
4.3 样条插补:参数曲线与前瞻控制
4.3.1 数学描述与优势
样条插补使用参数曲线(如三次样条、B样条、NURBS)描述轨迹,其通用形式为:
C(u) = Σ_{i=0}^{n} N_{i,p}(u) · P_i, u ∈ [0, 1]
其中 \(N_{i,p}(u)\) 为 p 次 B 样条基函数,\(P_i\) 为控制点。相比直线和圆弧,样条插补的核心优势在于:
- 曲率连续:避免直线-圆弧连接处的切向突变,减少机械冲击;
- 压缩代码量:一条复杂曲线可用少量控制点描述,而非成千上万条 G01 指令;
- 弓高误差可控:通过调整参数增量 \(\Delta u\) 控制逼近精度。
4.3.2 参数插补的实时计算流程
样条插补的实时计算分为三步:
- 参数更新:根据进给速度 \(F\) 和当前曲率半径 \(\rho(u)\),计算参数增量 \(\Delta u = F \cdot T_s / \|\frac{dC}{du}\|\)。由于弧长与参数不成线性关系,需采用二阶泰勒展开:
u_{k+1} = u_k + (F·T_s)/|C'(u_k)| - (F²·T_s²·C'(u_k)·C''(u_k))/(2·|C'(u_k)|⁴)
- 坐标计算:将 \(u_{k+1}\) 代入 B 样条基函数,计算坐标 \(C(u_{k+1})\);
- 速度规划:根据弓高误差约束和机床加速度限制,实时调整 \(F\)。
4.3.3 案例拆解:NURBS 曲线的高速加工
某模具加工场景中,原程序使用 5000 条 G01 直线逼近自由曲面,加工时间 45 分钟,表面存在明显接刀痕。改用 NURBS 插补后,控制点压缩至 120 个,加工时间降至 28 分钟,表面粗糙度从 Ra 1.6μm 提升至 Ra 0.8μm。关键参数设置如下:
| 参数 | 数值 | 说明 |
|---|---|---|
| 插补周期 | 1ms | 保证速度环更新频率 |
| 最大弓高误差 | 0.003mm | 根据精加工要求设定 |
| 最大加速度 | 0.5g | 防止过切 |
| 前瞻段数 | 200 | 提前减速,避免急停 |
实现中需注意:NURBS 基函数的递归计算(de Boor 算法)在每周期内需执行约 30 次浮点乘加,对 200MHz 级 MCU 占用约 15% CPU 负载,可接受。但若控制点超过 500 个,建议预计算基函数表以降低实时开销。
① 轮廓复杂度(直线/圆弧能否覆盖);
② 精度要求(弓高误差 vs 脉冲当量);
③ 硬件算力(整数运算 vs 浮点运算);
④ 实时性约束(插补周期内能否完成计算)。
实际工程中,多数系统采用混合策略:直线/圆弧用逐点比较法,样条用参数插补,通过软件切换实现无缝衔接。