逐点比较法:圆弧插补的“老司机”思路

各位同学,今天我们来聊聊圆弧插补里最经典、也最直观的一种方法——逐点比较法

说实话,我刚入行那会儿,第一次接触插补算法,看到一堆数学公式就头大。后来带我的老师傅跟我说了一句话,我到现在还记得:“别想那么复杂,插补就是走一步看一步,错了就纠偏。” 嗯,逐点比较法的核心思想,说白了就是这么回事。

为什么需要逐点比较?

你想想看,数控系统要加工一个圆弧,但电机只能走直线(X轴、Y轴联动)。那怎么走出圆弧呢?

答案就是:用无数段微小的直线段去逼近圆弧

但问题来了——怎么保证每一步都走在圆弧上?或者说,走偏了怎么办?

逐点比较法就是来解决这个问题的。它每走一步,就比较一下当前位置和理想圆弧的位置关系,然后决定下一步往哪个方向走。

核心思想: 每走一步,算一次偏差;根据偏差方向,决定下一步走向。

说白了就是:“走一步,看一步,偏了就调头”

偏差函数的推导

我们先从数学上把这个问题说清楚。

假设我们要加工一个第一象限的逆圆弧,圆心在原点(0,0),半径为R。圆弧起点为A,终点为B。

设当前刀具所在位置为P(xi, yi)。那么,P点到圆心的距离平方为:

F = xi² + yi² - R²

这个F,就是我们说的偏差函数

它的物理意义很直观:

  • F = 0:点在圆弧上,完美!
  • F > 0:点在圆弧外侧,离圆心远了。
  • F < 0:点在圆弧内侧,离圆心近了。

我在项目中遇到过一个问题:有同事直接用F的正负来判断方向,结果在圆弧起点附近老是振荡。后来发现,是因为起点不一定在圆弧上(比如对刀误差),导致初始偏差不为零。所以,我建议你们在实际代码里,先强制把起点偏差归零,或者做一次预判。

进给方向的决定规则

有了偏差,下一步怎么走?规则其实很简单:

偏差状态 当前位置 下一步进给方向
F ≥ 0 在圆弧上或外侧 -X方向走一步(靠近圆心)
F < 0 在圆弧内侧 +Y方向走一步(远离圆心)

你可能会问:为什么F≥0时走-X,F<0时走+Y?

嗯,这里有个小窍门。你想想看,对于第一象限逆圆弧,圆弧的切线方向是左上方向。当你在外侧时,你需要往圆心方向(-X)拉回来;当你在内侧时,你需要往外推(+Y)出去。这样走出来的轨迹,才是逼近圆弧的。

个人经验: 我习惯在调试时,把每一步的偏差值和进给方向打印出来。这样一眼就能看出算法有没有跑偏。曾经有一次,我发现偏差值一直为正,但刀具却往+Y方向走——查了半天,原来是象限判断写反了。

偏差的递推计算

每次计算F = x² + y² - R²,虽然准确,但计算量太大。实时系统里,乘法运算很费时间。

所以,我们改用递推公式。也就是说,根据上一步的偏差,直接算出下一步的偏差。

推导过程如下:

情况1:从P(xi, yi)向-X方向走一步

新位置:xi+1 = xi - 1, yi+1 = yi

新偏差:

Fi+1 = (xi - 1)² + yi² - R²
         = (xi² + yi² - R²) - 2xi + 1
         = Fi - 2xi + 1

情况2:从P(xi, yi)向+Y方向走一步

新位置:xi+1 = xi, yi+1 = yi + 1

新偏差:

Fi+1 = xi² + (yi + 1)² - R²
         = (xi² + yi² - R²) + 2yi + 1
         = Fi + 2yi + 1

你看,现在只需要加减法和移位操作,连乘法都省了。这就是逐点比较法能在老式单片机(比如8位8051)上跑起来的原因。

注意: 递推公式里用到了当前坐标xi和yi。所以,每走一步,必须更新坐标值。我曾经见过有人只更新偏差,忘了更新坐标,结果下一步的递推全错了。

完整的插补流程

好了,我们把上面这些串起来,看看一个完整的插补周期长什么样:

  1. 判断终点:检查是否到达终点。到了就停。
  2. 计算偏差:根据当前F值,判断在圆弧内侧还是外侧。
  3. 决定进给:F≥0走-X,F<0走+Y。
  4. 更新坐标:x = x - 1 或 y = y + 1。
  5. 递推偏差:用公式算出新的F值。
  6. 循环:回到第1步。

这个流程,说白了就是一个状态机。每一步都是确定性的,没有复杂的数学运算。

流程图:逐点比较法核心逻辑

下面我用SVG画了一张流程图,把整个逻辑串起来。你看一眼就能明白:

开始插补 是否到达终点? 插补结束 计算当前偏差F F ≥ 0 ? 向 -X 走一步 向 +Y 走一步 更新坐标 & 递推偏差

这张图里,判断终点是循环的出口,判断F是决策的核心,更新坐标和偏差是递推的关键。整个流程没有分支嵌套,非常清晰。

一个简单的例子

假设我们要加工一个半径为5的圆弧,起点在(5,0),终点在(0,5)。我们手动跑几步看看:

步数 当前位置 偏差F 进给方向
0(5, 0)0(起点)
1(4, 0)-9-X (F≥0)
2(4, 1)-8+Y (F<0)
3(4, 2)-5+Y (F<0)
4(4, 3)0+Y (F<0)
5(3, 3)-7-X (F≥0)
............

你看,第4步时偏差正好为0,说明回到了圆弧上。然后继续走,直到到达(0,5)。

避坑指南: 我曾经在调试时发现,圆弧走到终点附近时,偏差会反复在0附近振荡,导致刀具在终点处来回抖动。后来我加了一个终点判断的容差范围——只要当前位置与终点的距离小于半个步长,就强制结束。这个小改动,让加工表面光洁度提升了一个等级。

小结

逐点比较法,说白了就是用最简单的加减法,实现高精度的圆弧逼近。它不需要三角函数,不需要浮点运算,甚至不需要乘法器。在资源受限的嵌入式系统里,它依然是很多工程师的首选。

嗯,这一章的内容就到这里。下一章我们会聊聊数字积分法(DDA),那又是另一种完全不同的思路了。


公众号:蓝海资料掘金营,微信deep3321