MATLAB实现数控加工中的逐点比较法直线插补(四个象限,动态显示)

        逐点比较法就是刀具每走一步都要和给定轨迹上的坐标值做比较,从而决定下一步的进给方向。一般有直线插补和圆弧插补。简单的说就是,如果起始位置在给定轨迹的下方,下一步就向轨迹的上方走。如果起始位置在给定轨迹的内部,下一步就向轨迹的外面走。每走一次比较一次,根据比较再决定下一步的走向,以便在整体的轮廓上逼近给定的轨迹。

逐点比较法的插补过程即:

偏差判别坐标进给偏差计算终点判别

对于直线插补,从初始坐标(0,0)开始,终点判别(总步数)为终点坐标(xe,ye)的横坐标与纵坐标的绝对值之和,偏差计算与判别的原则为:

|动点的斜率|-|终点的斜率|>=0,Fm>=0;

|动点的斜率|-|终点的斜率|<0,Fm<0;

Fm>=0Fm<0
所在象限进给方向偏差计算所在象限进给方向偏差计算
一、四+xFm+1=Fm-ye一、二+yFm+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;

  • 11
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clear_lantern

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值