MATLAB GUI 之 插补(逐点比较法、数字积分法DDA的直线圆弧插补)

本科实验周做的东西,效果不错,特此分享。

因代码内容过长,仅开源部分简单内容,更多请转至资源下载。资源中的文件可以直接编译运行。

资源包链接:后续整理上传,需要的同学可先收藏关注或留言。

MATLABGUI之插补//逐点比较法、数字积分发DDA的直线、圆弧插补源代码资源包)-VB文档类资源-CSDN文库

一、逐点比较法直线插补

基本原理:

在刀具按要求轨迹运动加工零件轮廓的过程中,不断比较刀具与被加工零件轮廓之间的相对位置,并根据比较结果决定下一步的进给方向,使刀具向减小偏差的方向进给(始终只有一个方向)。

一般地,逐点比较法插补过程有四个处理节拍,如图所示:

实现效果:全象限、任意脉冲当量的插补,且会自动得出分别向X轴、Y轴方向的进给总次数,效果如图:

 实现代码:(此处代码仅为GUI里调用的插补函数部分,也即“chabu()”,参考网上已有代码修改,GUI部分过长,一并放入资源中供下载)

function [res_x,res_y] = chabu(start_x,start_y,current_x,current_y,end_x,end_y,step_x,step_y)
% 
% Take step_x and step_y as the step values in the horizontal and vertical directions, 
% then use the point by point comparison method to return the linear interpolation 
% from point (start_x, start_y) to point (end_x, end_y)
% 
% 以step_x,step_y为横纵方向步进值,逐点比较法返回从点(start_x,start_y)到点(end_x,end_y)的直线插值
% 
% 输入参数(start_x, start_y):开始点横纵坐标
% 输入参数(end_x, end_y):结束点横纵坐标
% 输入参数(current_x,current_y):刀具或绘笔图目前所在的位置
% 输出参数step_x,step_y:刀具或绘笔图的步进值
% 输出参数(res_x,res_y):刀具或绘笔图的轨迹
%
% 常用调用方式:
% [res_x,res_y] = PBPC_Linear_Interpolation(start_x,start_y,current_x,current_y,end_x,end_y,step_x,step_y)


if start_x == end_x
    res_x = [];
    res_y = [];
    res_x(1) = start_x;
    res_y(1) = start_y;
    
    counter = 2;
    if end_y >= start_y
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            current_y = current_y+step_y;
            res_x(1,counter) = current_x;
            res_y(1,counter) = current_y;
            counter = counter+1;
        end
    else
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            current_y = current_y-step_y;
            res_x(1,counter) = current_x;
            res_y(1,counter) = current_y;
            counter = counter+1;
        end
    end
end        

if start_y == end_y
    res_x = [];
    res_y = [];
    res_x(1) = start_x;
    res_y(1) = start_y;
    
    counter = 2;
    if end_x >= start_x
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            current_x = current_x+step_x;
            res_x(1,counter) = current_x;
            res_y(1,counter) = current_y;
            counter = counter+1;
        end
    else
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            current_x = current_x-step_x;
            res_x(1,counter) = current_x;
            res_y(1,counter) = current_y;
            counter = counter+1;
        end
    end
end        

if start_x ~= end_x
    k = (start_y-end_y)/(start_x-end_x);
    x0 = start_x;
    y0 = start_y;
    syms x
    func = matlabFunction(k*(x-x0)+y0);

    res_x = [];
    res_y = [];
    res_x(1) = start_x;
    res_y(1) = start_y;

    counter = 2;
    if end_x > start_x && end_y >= start_y
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            if current_y >= func(current_x)
                current_x = current_x+step_x;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            else
                current_y = current_y+step_y;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            end
        end
    elseif end_x < start_x && end_y >= start_y
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            if current_y >= func(current_x)
                current_x = current_x-step_x;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            else
                current_y = current_y+step_y;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            end
        end
    elseif end_x > start_x && end_y < start_y
        while(1)
            if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            if current_y <= func(current_x)
                current_x = current_x+step_x;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            else
                current_y = current_y-step_y;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            end
        end
    elseif end_x < start_x && end_y < start_y
         while(1)
             if current_x >= end_x-step_x/2 && current_x <= end_x+step_x/2 && ...
                    current_y >= end_y-step_y/2 && current_y <= end_y+step_y/2
                break
            end
            if current_y <= func(current_x)
                current_x = current_x-step_x;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            else
                current_y = current_y-step_y;
                res_x(1,counter) = current_x;
                res_y(1,counter) = current_y;
                counter = counter+1;
            end
         end
    end
end
end

二、逐点比较法圆弧插补

基本原理同逐点比较法直线插补。

实现效果:全象限、任意脉冲当量、顺逆时针走向的圆弧插补。如图:

 后续实现代码均放入资源,自行下载。

 三、数字积分法(DDA)直线、圆弧插补

基本原理:数字积分法插补器的关键部件是累加器和被积函数寄存器,每一个坐标方向就需要一个累加器和一个被积函数寄存器。一般情况下,插补开始前,累加器清零,被积函数寄存器分别寄存Xe和Ye;插补开始后,每来一个累加脉冲▲t,被积函数寄存器里的内容在相应的 累加器中相加一次,相加后的溢出 作为驱动相应坐标轴的进给脉冲▲x (或▲y),而余数仍寄存在累加器 中,当脉冲源发出的累加脉冲数m恰好等于被积函数寄存器的容量2n时,溢出的脉冲数等于以脉冲当量为最小单位的终点坐标,刀具运行到终点。如图所示(前为直线,后为圆弧):

 实现效果:DDA直线插补实现了全象限、任意脉冲当量的插补。

DDA圆弧插补实现了第一象限内任意半径的圆弧插补。

(由于当时时间紧凑,DDA圆弧实现的功能较少,欢迎各方大佬补充)

 

 所参考的资料:老师布置任务时发的一些源文件、百度搜索 Matlab圆弧插补程序+郑国安、数控工作室 最大的中文数控技术学习网站 (busnc.com)、还有一些繁杂而有些小用的CSDN文章,可自行搜索。

本文完。

(据说当时我带领的小组实验周分数最高,并不是我们学校多拉风,毕竟只有5天时间,除了这个还有其他两项任务,之间还要花一天布置任务和答辩,所以有不足的地方还请大佬们多多担待)

另附资源包文件目录:

### 回答1: MATLAB GUI中的插补功能可以通过逐点比较法来实现。逐点比较法是一种常见的插补方法,它通过计算两个点之间的差值,并根据设定的间距和速度来逐步逼近目标点。 数字积分发DDA直线插补是一种用于直线插补的常用算法。该算法通过将直线分成若干个小段,并计算每段的斜率和步进值,来逐步插补直线圆弧插补是用于生成圆弧轨迹的一种插补方法。该方法通过计算圆弧的起点、终点和半径,以及插补的步进值和速度来生成圆弧轨迹。 以上这些插补方法的源代码资源包可以在MATLAB中找到。这些资源包通常包含了相关的函数和算法,可以直接在MATLAB中调用和使用。通过使用这些源代码资源包,我们可以快速实现各种插补功能,并根据实际需求进行修改和定制。 MATLAB GUI中的插补功能可以帮助我们实现复杂的运动轨迹控制,提高运动的平滑性和精度。通过合适的插补方法和源代码资源包的使用,我们可以灵活地控制运动轨迹的生成和执行,满足不同应用的需求。 ### 回答2: MATLAB GUI是一种基于MATLAB的图形用户界面设计工具,它提供了一种直观和交互性强的方式来编写程序和处理数据。在MATLAB GUI中进行插补操作时,可以使用逐点比较法数字积分法以及DDA算法来实现直线圆弧插补逐点比较法是一种简单但有效的插补方法,通过计算两点之间的差值并逐点进行比较来实现插补操作。对于直线插补,可以通过计算两点之间的横纵坐标的差值,并根据步长逐点逼近目标点来实现插补。对于圆弧插补,可以通过将圆弧插补问题转化为直线插补问题,通过多次进行直线插补来逼近圆弧的弧长,并保持插补路径的光滑性。 数字积分法是一种更为精确的插补方法,它通过对曲线进行数值积分来实现插补操作。对于直线插补,可以采用数值积分的方法计算直线的参数方程,并根据步长逐点逼近目标点来实现插补。对于圆弧插补,可以采用数值积分的方法计算圆弧的参数方程,并通过多次进行数值积分来逼近圆弧的弧长,并保持插补路径的光滑性。 DDA算法是一种常用的数字微分分析算法,用于实现直线插补。该算法通过计算两点之间的斜率,并根据斜率逐点逼近目标点来实现插补。对于直线插补,可以通过计算两点之间的斜率并根据步长逐点逼近目标点来实现插补。 在MATLAB GUI中实现这些插补算法可以通过编写相应的源代码来完成。代码资源包可以提供相关的函数和类库,以及示例代码,用于实现逐点比较法数字积分法DDA算法直线圆弧插补操作。通过调用这些函数和类库,用户可以在MATLAB GUI中设计和实现各种插补操作,以满足特定的应用需求。 ### 回答3: matlabgui中的插补是通过使用逐点比较法数字积分来实现的。逐点比较法是一种将目标轨迹与当前位置进行比较,并计算出当前位置需要移动的距离和方向的方法。数字积分则是用来计算出每个时间步长内需要移动的位置。 在matlabgui中,插补直线的方法是使用发dda的方式。发dda是一种基于逐点比较法数字积分的直线插补算法。它可以根据给定的起始点和终止点,计算出沿着直线路径需要经过的所有点,并生成相应的代码资源包。 类似地,插补圆弧的方法也是使用逐点比较法数字积分。通过指定圆心、起始角度、终止角度和半径,可以计算出沿着圆弧轨迹需要经过的所有点,并生成相应的代码资源包。 这些插补方法的源代码资源包可以在matlabgui中找到,可以根据具体的需求进行调用和使用。通过使用这些插补方法,我们可以在matlabgui中实现直线圆弧插补运动,从而实现各种机器人和运动控制系统的应用。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@Duang~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值