插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程。数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。根据加工曲线的类型,可以分为直线插补,圆弧插补,抛物线插补,样条线插补等。
传统的 CNC 只提供直线和圆弧插补,对于非直线和圆弧曲线则采用直线和圆弧分段拟合的方法进行插补。这种方法在处理复杂曲线时会导致数据量大、精度差、进给速度不均、编程复杂等一系列问题,必然对加工质量和加工成本造成较大的影响。近年来,国内外的学者对此进行了大量的深入研究,由此也产生了很多新的插补方法。如A(AKIMA)样条曲线插补、C(CUBIC)样条曲线插补、贝塞尔(Bezier)曲线插补、PH(Pythagorean-Hodograph)曲线插补、B 样条曲线插补等。由于B样条类曲线的诸多优点,尤其是在表示和设计自由型曲线曲面形状时显示出的强大功能,使得人们关于自由空间曲线曲面的直接插补算法的研究多集中在它身上。下面先介绍最简单常用的直线插补,接下来细说圆弧及其它复杂曲线的插补
直线插补
在一个给定平面内,给定两点P1, P2, 以及脉冲当量pulse。对两点之间的空间数密化。这就叫直线插补
核心代码
QPointF startPoint; //起始点
QPointF endPoint; //结束点
QPointF curPoint; //当前点
qreal pulseEqu; //脉冲当量
void Interpolation::LineInterpolation()
{
curPoint.setX(startPoint.rx());
curPoint.setY(startPoint.ry());
qreal dev_fi = endPoint.ry() * curPoint.rx() - endPoint.rx()*curPoint.ry();
qreal endJudge = qAbs(endPoint.rx() - curPoint.rx()) + qAbs(endPoint.ry() - curPoint.ry());
while (endJudge>0) {
if(dev_fi>=0){
if(endPoint.rx()>=0)
curPoint.rx() += pulseEqu;
else
curPoint.rx() -= pulseEqu;
dev_fi -= qAbs(endPoint.ry());
}
else{
if(endPoint.ry()>=0)
curPoint.ry() += pulseEqu;
else
curPoint.ry() -= pulseEqu;
dev_fi += qAbs(endPoint.rx());
}
endJudge -= pulseEqu;
v_points.append(curPoint);
}
}
效果展示
完整代码见
https://onedrive.live.com/view.aspx?resid=D4978143B447D52A!23270&id=documents&wd=target(插补.one|A5970854-D3AE-41CF-9A58-8EDD59297D96%2F直线插补|501C3D5D-0D09-40E8-AB75-F32124D334DE%2F) onenote:https://d.docs.live.net/d4978143b447d52a/文档/数控技术/插补.one#直线插补§ion-id={A5970854-D3AE-41CF-9A58-8EDD59297D96}&page-id={501C3D5D-0D09-40E8-AB75-F32124D334DE}&end