一、逐点比较法插补:偏差函数从哪来?
各位同学,今天咱们来聊聊插补算法里最经典的一个——逐点比较法。
说实话,我刚入行那会儿,第一次看到这个算法的名字,还以为是某种「走一步看一步」的笨办法。后来在机床上调了两年参数,才真正体会到:这玩意儿,简单,但极其可靠。很多高端数控系统里,底层还在用它做精插补。
好,咱们直接进入正题。今天要解决的核心问题就一个:偏差函数是怎么推导出来的?
核心思想一句话:每走一步,算一下当前位置偏离理想轨迹有多远,然后决定下一步往哪走。
1.1 直线插补的偏差函数
先看最简单的——直线插补。
假设我们要从起点 O(0,0) 走到终点 A(xe, ye)。理想轨迹就是一条直线。现在,刀具在某个点 P(xi, yi)。
怎么判断 P 点在直线的哪一侧?
我个人的习惯是,用向量叉积来理解。你看,直线 OA 的方向向量是 (xe, ye),点 P 相对于 O 的向量是 (xi, yi)。
这两个向量的叉积,就是:
F = x_e * y_i - y_e * x_i
这就是直线插补的偏差函数。
为什么是这个形式?
- 如果 F = 0,P 点在直线上
- 如果 F > 0,P 点在直线上方(或左侧,取决于坐标系定义)
- 如果 F < 0,P 点在直线下方(或右侧)
我在项目中遇到过一个问题:有同事直接用斜率比较,结果在 xe = 0 时直接除零报错。用叉积形式,完美避开了这个坑。
小技巧:实际编程时,偏差函数 F 的符号决定了进给方向。一般约定 F ≥ 0 时走 +X,F < 0 时走 +Y。但具体要看象限,后面我们会细讲。
1.2 圆弧插补的偏差函数
圆弧插补比直线稍微绕一点,但原理相通。
假设我们要插补一段圆弧,圆心在原点 O(0,0),半径为 R,起点为 S,终点为 E。当前刀具在 P(xi, yi)。
判断 P 点相对于圆弧的位置,说白了就是比较 P 到圆心的距离和半径 R 的大小。
偏差函数定义为:
F = x_i² + y_i² - R²
嗯,这里要注意:
- F = 0,点在圆弧上
- F > 0,点在圆弧外侧
- F < 0,点在圆弧内侧
你想想看,这个公式是不是很直观?就是勾股定理的变体。
我记得有一次调试一个异形螺纹加工,圆弧插补的偏差一直算不对。查了半天,发现是半径 R 的平方算错了——用的单精度浮点,累加误差太大。后来改成双精度,问题解决。
避坑指南:我曾经在圆弧插补里直接用 R² 做比较,结果因为浮点精度问题,在 F=0 附近反复震荡。建议加一个很小的阈值 ε(比如 1e-6),当 |F| < ε 时视为在圆弧上。
1.3 递推公式:为什么能省掉乘法?
好,现在偏差函数有了。但每次走一步都要重新算一遍 F,是不是太慢了?
尤其是圆弧插补,每次都要算 x² + y²,CPU 吃不消啊。
所以,我们需要递推公式。
说白了,就是利用上一步的偏差值,加上一个增量,得到下一步的偏差值。这样就把乘法变成了加法。
直线插补的递推
假设当前在 P(xi, yi),偏差为 Fi。
情况1:沿 +X 方向走一步
新位置:P'(xi+1, yi)
新偏差:
F' = x_e * y_i - y_e * (x_i + 1)
= (x_e * y_i - y_e * x_i) - y_e
= F_i - y_e
情况2:沿 +Y 方向走一步
新位置:P'(xi, yi+1)
新偏差:
F' = x_e * (y_i + 1) - y_e * x_i
= (x_e * y_i - y_e * x_i) + x_e
= F_i + x_e
看到了吗?递推公式里只有加减法,没有乘法。这就是逐点比较法能在老式数控系统上跑得飞快的原因。
圆弧插补的递推
圆弧稍微复杂一点,因为走一步后,坐标变了,偏差函数里的平方项也要更新。
情况1:沿 -X 方向走一步(逆圆,内侧)
新位置:P'(xi-1, yi)
新偏差:
F' = (x_i - 1)² + y_i² - R²
= (x_i² + y_i² - R²) - 2*x_i + 1
= F_i - 2*x_i + 1
情况2:沿 +Y 方向走一步(逆圆,外侧)
新位置:P'(xi, yi+1)
新偏差:
F' = x_i² + (y_i + 1)² - R²
= (x_i² + y_i² - R²) + 2*y_i + 1
= F_i + 2*y_i + 1
注意,这里虽然还有乘法(2*xi),但乘2在计算机里就是左移一位,比浮点乘法快得多。
核心结论:递推公式把每次插补的计算量从 O(1) 的乘法降到了 O(1) 的加减法。对于每秒要执行几万次插补的数控系统来说,这个优化是决定性的。
1.4 知识体系总览
为了让你对整个章节的逻辑有个整体印象,我画了一张图:
1.5 小结
今天咱们把逐点比较法的偏差函数推导了一遍。总结下来就三句话:
- 直线插补用叉积判断点在线的哪一侧——F = xe·yi - ye·xi
- 圆弧插补用距离平方差判断点在圆的内外——F = xi² + yi² - R²
- 递推公式把乘法变成加减法,是逐点比较法能在低性能硬件上跑起来的关键
说实话,这些公式看起来简单,但真正在机床上跑起来,要考虑的细节很多。比如象限切换、终点判断、速度控制……这些我们后面会一一展开。
好,今天就到这儿。下次咱们聊进给方向的选择逻辑——也就是「什么时候走X,什么时候走Y」这个决策树是怎么构建的。