逐点比较法就是刀具每走一步都要和给定轨迹上的坐标值做比较,从而决定下一步的进给方向。一般有直线插补和圆弧插补。简单的说就是,如果起始位置在给定轨迹的下方,下一步就向轨迹的上方走。如果起始位置在给定轨迹的内部,下一步就向轨迹的外面走。每走一次比较一次,根据比较再决定下一步的走向,以便在整体的轮廓上逼近给定的轨迹。
逐点比较法的插补过程即:
偏差判别 | 坐标进给 | 偏差计算 | 终点判别 |
对于直线插补,从初始坐标(0,0)开始,终点判别(总步数)为终点坐标(xe,ye)的横坐标与纵坐标的绝对值之和,偏差计算与判别的原则为:
|动点的斜率|-|终点的斜率|>=0,Fm>=0;
|动点的斜率|-|终点的斜率|<0,Fm<0;
Fm>=0 | Fm<0 | ||||
所在象限 | 进给方向 | 偏差计算 | 所在象限 | 进给方向 | 偏差计算 |
一、四 | +x | Fm+1=Fm-ye | 一、二 | +y | Fm+1=Fm+xe |
二、三 | -x | 三、四 | -y |
根据这个原理,下面给出第一象限的逐点比较法直线插补的代码:
Fm=0; %偏差定义
Xe = input('请输入终点横坐标 X\n Xe = '); %终点坐标
Ye = input('请输入终点纵坐标 Y\n Ye = ');
X0=0; %起点坐标
Y0=0;
h=1; %步长
NXY= (abs(Xe)+abs(Ye))/h; %步数
XOY = 1; %第1象限的直线插补
x=[X0,Xe];
y=[Y0,Ye];
%作图相关,显示范围的图像
area=max(abs(Xe),abs(Ye));
set(gca,'XTick',[-1:1:area]);
set(gca,'YTick',[-1:1:area]);
set(gca,'XTickLabel',abs([-1:1:area]));
set(gca,'YTickLabel',abs([-1:1:area]));
grid on;
hold on;
plot([area,-1],[0,0],'k','LineWidth',1);
plot([0,0],[-1,area],'k','LineWidth',1);
plot(x,y,'b'); %期望轨迹
Xm=X0;
Ym=Y0;
step=0
%插补程序
while (step<NXY)
if(Fm>=0)
x1=[Xm,Xm+h];
y1=[Ym,Ym];
Fm=Fm-Ye;
else
x1=[Xm,Xm];
y1=[Ym,Ym+h];
Fm=Fm+Xe;
end
step=step+1;
plot(x1,y1,'r-'); %由此点和前一点坐标组成的2个向量画
Xm=x1(2); %保存此点坐标供下次作图和比较时使用
Ym=y1(2);
hold on;
text((x1(1)+x1(2))/2,(y1(1)+y1(2))/2,[num2str(step)])
pause(0.5); %延时程序形参为每走一步所用时间
end
xlabel('X')
ylabel('Y')
title(['第一象限直线插补'])
hold off;
运行后需在命令行键入终点的横纵坐标,例如输入终点坐标(xe,ye)=(7,3),运行结果会逐步动态显示插补过程,最终插补后的结果为:
同样的,根据逐点比较法的原理,只在第一象限逐点比较法直线插补程序的基础上稍作更改,即可得到其他三个象限的代码。此处可使用一个简单的switch函数,将四个象限的插补程统一到一个代码中:
clear all;
clc;
Fm=0; %偏差定义
Xin = input('请输入终点横坐标 X\n Xe = '); %终点坐标
Yin = input('请输入终点纵坐标 Y\n Ye = ');
Xe = abs(Xin);
Ye = abs(Yin);
X0=0; %起点坐标
Y0=0;
h=1; %步长
NXY= (abs(Xin)+abs(Yin))/h; %步数
x=[X0,Xe];
y=[Y0,Ye];
if Xin>0
if Yin>0
XOY = 1;
else
XOY = 4;
end
else
if Yin>0
XOY = 2;
else
XOY = 3;
end
end
switch XOY
case 1
area=max(abs(Xe),abs(Ye));
set(gca,'XTick',[-1:1:area]);
set(gca,'YTick',[-1:1:area]);
set(gca,'XTickLabel',abs([-1:1:area]));
set(gca,'YTickLabel',abs([-1:1:area]));
grid on;
hold on;
plot([area,-1],[0,0],'k','LineWidth',1);
plot([0,0],[-1,area],'k','LineWidth',1);
plot(x,y,'b'); %期望轨迹
Xm=X0;
Ym=Y0;
step=0
%插补程序
while (step<NXY)
if(Fm>=0)
x1=[Xm,Xm+h];
y1=[Ym,Ym];
Fm=Fm-Ye;
else
x1=[Xm,Xm];
y1=[Ym,Ym+h];
Fm=Fm+Xe;
end
step=step+1;
plot(x1,y1,'r-'); %由此点和前一点坐标组成的2个向量画
Xm=x1(2); %保存此点坐标供下次作图和比较时使用
Ym=y1(2);
hold on;
text((x1(1)+x1(2))/2,(y1(1)+y1(2))/2,[num2str(step)])
pause(0.5); %延时程序形参为每走一步所用时间
end
case 2
area=max(abs(Xe),abs(Ye));
set(gca,'XTick',[-area:1:1]);
set(gca,'YTick',[-1:1:area]);
set(gca,'XTickLabel',abs([-area:1:1]));
set(gca,'YTickLabel',abs([-1:1:area]));
grid on;
hold on;
plot([-area,1],[0,0],'k','LineWidth',1);
plot([0,0],[-1,area],'k','LineWidth',1);
plot(-x,y,'b'); %期望轨迹
Xm=X0;
Ym=Y0;
step=0
%插补程序
while (step<NXY)
if(Fm>=0)
x1=[Xm,Xm-h];
y1=[Ym,Ym];
Fm=Fm-Ye;
else
x1=[Xm,Xm];
y1=[Ym,Ym+h];
Fm=Fm+Xe;
end
step=step+1;
plot(x1,y1,'r-'); %由此点和前一点坐标组成的2个向量画
Xm=x1(2); %保存此点坐标供下次作图和比较时使用
Ym=y1(2);
hold on;
text((x1(1)+x1(2))/2,(y1(1)+y1(2))/2,[num2str(step)])
pause(0.5); %延时程序形参为每走一步所用时间
end
case 3
area=max(abs(Xe),abs(Ye));
set(gca,'XTick',[-area:1:1]);
set(gca,'YTick',[-area:1:1]);
set(gca,'XTickLabel',abs([-area:1:1]));
set(gca,'YTickLabel',abs([-area:1:1]));
grid on;
hold on;
plot([-area,1],[0,0],'k','LineWidth',1);
plot([0,0],[1,-area],'k','LineWidth',1);
plot(-x,-y,'b'); %期望轨迹
Xm=X0;
Ym=Y0;
step=0
%插补程序
while (step<NXY)
if(Fm>=0)
x1=[Xm,Xm-h];
y1=[Ym,Ym];
Fm=Fm-Ye;
else
x1=[Xm,Xm];
y1=[Ym,Ym-h];
Fm=Fm+Xe;
end
step=step+1;
plot(x1,y1,'r-'); %由此点和前一点坐标组成的2个向量画
Xm=x1(2); %保存此点坐标供下次作图和比较时使用
Ym=y1(2);
hold on;
text((x1(1)+x1(2))/2,(y1(1)+y1(2))/2,[num2str(step)])
pause(0.5); %延时程序形参为每走一步所用时间
end
case 4
area=max(abs(Xe),abs(Ye));
set(gca,'XTick',[-1:1:area]);
set(gca,'YTick',[-area:1:1]);
set(gca,'XTickLabel',abs([-1:1:area]));
set(gca,'YTickLabel',abs([-area:1:1]));
grid on;
hold on;
plot([area,-1],[0,0],'k','LineWidth',1);
plot([0,0],[1,-area],'k','LineWidth',1);
plot(x,-y,'b'); %期望轨迹
Xm=X0;
Ym=Y0;
step=0
%插补程序
while (step<NXY)
if(Fm>=0)
x1=[Xm,Xm+h];
y1=[Ym,Ym];
Fm=Fm-Ye;
else
x1=[Xm,Xm];
y1=[Ym,Ym-h];
Fm=Fm+Xe;
end
step=step+1;
plot(x1,y1,'r-'); %由此点和前一点坐标组成的2个向量画
Xm=x1(2); %保存此点坐标供下次作图和比较时使用
Ym=y1(2);
hold on;
text((x1(1)+x1(2))/2,(y1(1)+y1(2))/2,[num2str(step)])
pause(0.5); %延时程序形参为每走一步所用时间
end
end
xlabel('X')
ylabel('Y')
title(['第四象限直线插补'])
hold off;