一、二维轮廓的半径补偿算法:直线-直线、直线-圆弧、圆弧-圆弧转接

各位同行,今天我们来聊聊刀具半径补偿里最核心的转接计算。说实话,我刚入行那会儿,最头疼的就是这个。明明看着挺简单的直线圆弧,一加上补偿方向,脑子就转不过弯来。后来做多了才发现,其实就三种情况:直线接直线、直线接圆弧、圆弧接圆弧。把这三种吃透了,整个补偿算法就通了八成。

1.1 转接类型与向量基础

先说说为什么要分这三种。你想想看,CNC加工轮廓无非就是直线段和圆弧段拼起来的。相邻两段之间怎么过渡?补偿后的刀具中心轨迹怎么算?这就是转接要解决的问题。

我个人习惯把转接分成三类:

  • 直线-直线转接:最常见,也最容易理解
  • 直线-圆弧转接:稍微复杂一点,要注意切点
  • 圆弧-圆弧转接:最麻烦,但掌握了向量法也不难

不管哪种转接,核心都是向量计算。说白了,就是求两个轮廓段在交点处的法向量,然后根据补偿方向和半径算出偏移后的交点。

核心公式:补偿后的刀具中心位置 = 原始轮廓点 + 补偿方向 × 刀具半径

其中补偿方向由轮廓的法向量和加工方向(左补偿/右补偿)共同决定。

1.2 直线-直线转接的向量计算

直线-直线转接是最基础的。假设我们有两条直线段L1和L2,交点为P。L1的方向向量为V1,L2的方向向量为V2。

计算步骤其实就三步:

  1. 求L1在P点的单位法向量N1(指向轮廓外侧)
  2. 求L2在P点的单位法向量N2
  3. 根据补偿方向(左补G41/右补G42),确定偏移后的交点P'

这里有个关键点:法向量的方向。我见过不少新手在这里栽跟头。法向量不是随便取的,它必须指向轮廓外侧。怎么判断?用右手定则:拇指指向加工方向,四指弯曲的方向就是外侧法向。

我的经验:实际编程时,我习惯把法向量和加工方向绑定在一起算。这样不容易出错。具体做法是:先算切向量,然后逆时针旋转90度得到外侧法向量。

偏移后的交点P'怎么算?其实就是两条偏移直线的交点。L1偏移后的直线方程是:P + r × N1 + t × V1,L2偏移后的是:P + r × N2 + s × V2。联立解出t和s,就得到P'了。

// 直线-直线转接计算伪代码
function computeLineLineOffset(P, V1, V2, r, side) {
    // P: 交点, V1: L1方向, V2: L2方向, r: 刀具半径, side: 1左补/-1右补
    N1 = getOuterNormal(V1);  // 外侧法向量
    N2 = getOuterNormal(V2);
    
    // 补偿方向调整
    offsetDir1 = side * N1;
    offsetDir2 = side * N2;
    
    // 解偏移直线交点
    P1 = P + r * offsetDir1;
    P2 = P + r * offsetDir2;
    
    // 求直线P1 + t*V1 和 P2 + s*V2 的交点
    P_prime = solveIntersection(P1, V1, P2, V2);
    return P_prime;
}

1.3 直线-圆弧转接的向量计算

直线接圆弧,情况就复杂一些了。因为圆弧上每个点的法向量都在变。不过别怕,我们只关心切点处的法向量。

假设直线L与圆弧A在点P处相切。L的方向向量为V,圆弧在P点的切向量为T(与V同向或反向,取决于加工方向)。

计算步骤:

  1. 求直线在P点的法向量N_line
  2. 求圆弧在P点的法向量N_arc(指向圆心方向或背离圆心方向,取决于内外轮廓)
  3. 分别偏移直线和圆弧,求偏移后的交点

这里有个坑:圆弧的法向量方向。对于外轮廓,圆弧的法向量指向圆心外侧;对于内轮廓,指向圆心内侧。我曾经在一个模具项目里搞反了,结果刀具直接过切,工件报废了。嗯,从那以后我每次都会再三确认轮廓类型。

避坑指南:直线-圆弧转接时,如果圆弧半径小于刀具半径,会出现"过切"现象。这是物理限制,算法上要加保护判断。我一般会在预处理阶段检查所有圆弧半径,如果小于刀具半径就报错。

偏移后的交点计算,本质上是求偏移直线和偏移圆弧的交点。偏移直线好算,偏移圆弧就是半径加减刀具半径。然后联立求解即可。

// 直线-圆弧转接计算
function computeLineArcOffset(P, V, arcCenter, arcRadius, r, side, isOuter) {
    // 直线偏移
    N_line = getOuterNormal(V);
    P_line = P + r * side * N_line;
    
    // 圆弧偏移
    N_arc = (P - arcCenter) / arcRadius;  // 指向圆心外侧
    if (!isOuter) N_arc = -N_arc;  // 内轮廓反向
    newRadius = isOuter ? arcRadius + r : arcRadius - r;
    
    // 求偏移直线与偏移圆弧的交点
    P_prime = solveLineArcIntersection(P_line, V, arcCenter, newRadius);
    return P_prime;
}

1.4 圆弧-圆弧转接的向量计算

圆弧接圆弧,这是最复杂的情况。两个圆弧在交点处相切,但各自的圆心、半径可能不同。

假设圆弧A1和圆弧A2在点P处相切。A1的圆心为O1,半径为R1;A2的圆心为O2,半径为R2。

计算要点:

  • 两个圆弧在P点的法向量方向可能不同
  • 偏移后的圆弧半径分别为R1±r和R2±r
  • 偏移后的交点需要解两个圆的交点方程

具体步骤:

  1. 分别计算两个圆弧在P点的法向量N1和N2
  2. 根据补偿方向和内外轮廓,确定偏移后的圆心和半径
  3. 求两个偏移圆的交点,取正确的一个

关键技巧:圆弧-圆弧转接时,偏移后的两个圆可能有0个、1个或2个交点。实际加工中,正确的交点只有一个。怎么选?看加工方向!交点必须同时满足两个圆弧的加工方向约束。

我记得有一次做五轴联动加工,圆弧-圆弧转接算出来的交点总是不对。折腾了半天才发现,是圆弧的顺逆方向搞反了。G02和G03的方向直接影响法向量的计算,千万不能搞错。

// 圆弧-圆弧转接计算
function computeArcArcOffset(P, O1, R1, O2, R2, r, side, dir1, dir2) {
    // dir1, dir2: 1表示顺时针(G02), -1表示逆时针(G03)
    
    // 计算法向量
    N1 = (P - O1) / R1;
    N2 = (P - O2) / R2;
    
    // 偏移后的圆心和半径
    O1_new = O1;
    R1_new = R1 + side * r;  // 外轮廓
    O2_new = O2;
    R2_new = R2 + side * r;
    
    // 求两个圆的交点
    intersections = solveCircleIntersection(O1_new, R1_new, O2_new, R2_new);
    
    // 根据加工方向筛选正确交点
    P_prime = selectCorrectIntersection(intersections, dir1, dir2);
    return P_prime;
}

1.5 三种转接的对比与选择

说了这么多,我们来总结一下。三种转接各有特点,实际加工中要根据情况选择:

转接类型 计算复杂度 常见问题 我的建议
直线-直线 法向量方向容易搞反 用右手定则确认
直线-圆弧 圆弧半径小于刀具半径 预处理阶段检查
圆弧-圆弧 顺逆方向、交点选择 画图验证最稳妥

个人经验:不管哪种转接,我写完算法后都会用CAD软件画图验证一遍。把原始轮廓和补偿后的轨迹叠在一起看,一眼就能看出对不对。这个方法虽然土,但特别管用。

最后说一句,刀具半径补偿算法看着复杂,其实核心就是向量运算。把法向量、切向量、偏移方向这几个概念理清楚,剩下的就是数学计算了。多练几次,你也能写出稳定的补偿算法。

刀具半径补偿转接算法知识体系 转接算法核心 直线-直线转接 法向量 + 偏移直线交点 直线-圆弧转接 切点法向量 + 偏移圆交点 圆弧-圆弧转接 双圆交点 + 方向筛选 关键技术点 法向量方向判断 补偿方向(G41/G42) 过切检测与保护 核心思想:将轮廓偏移转化为向量运算 统一框架:法向量 → 偏移 → 求交点

专注资料整理