一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于圆弧切线矢量的圆弧插补方法与流程

2022-06-29 23:12:32 来源:中国专利 TAG:


1.本发明涉及数控机床和工业机器人领域,具体涉及一种基于圆弧切线矢量的圆弧插补方法。


背景技术:

2.在工业机器人和数控机床实际操作过程中,常常需要以圆弧曲线轨迹进行拾放物体和加工零部件。通常机器人和机床在进行圆弧轨迹插补时,首先确定其轨迹长度,然后根据设置的柔性加减速规划,将连续的圆弧曲线轨迹离散为一系列的插补点,在每一个脉冲指令下执行插补点的运动,直到达到总的执行时间就终止圆弧曲线的插补。那么圆弧曲线插补的核心问题就是提高其插补精度,提高插补精度就是建立圆弧曲线弧长以及插补点计算的精确数学模型,由于圆弧曲线弧长属于第二类圆弧积分,使得其没有解析解。
3.圆弧插补主要内容之一是插补计算,即生成插补点,从而将连续的圆弧轨迹分解成离散的点,然后再将离散的点送入数控系统的位置控制模块即可控制机床生成运动轨迹。二是进行终点判别,以便插补到达圆弧终点时及时准确的结束插补,避免欠插补和过插补现象的发生。
4.当前的圆弧的实时插补算法一般采用的方法为:方法一逐点比较法,方法二数字积分法。此二类方法基于直线延伸到对于圆弧的插补进行了具体的算法实现,同时基于此的最小二乘法、bresenham算法等等改进型算法。它们的中心思想也都是尽量的是满足与圆心的距离尽可能的接近圆弧半径值。但它是需要进行整体象限处理,即过象限处理,这样的处理就需要分为4个象限,有的方法甚至于需要分为8个象限处理,这样对于算法而言需要考虑的情况较多,存在着算法复杂、效率低、插补点坐标精度不高等问题。


技术实现要素:

5.为解决上述技术问题,本发明提供一种基于圆弧切线矢量的圆弧插补方法,利用直线插补时分解到各轴的比例值,而后进行等比例的脉冲处理的思想来进行圆弧插补,以解决上述背景技术中提及的问题。
6.一种基于圆弧切线矢量的圆弧插补方法,其特征在于,包括如下步骤:
7.步骤一:输入新一段插补圆弧信息,所述圆弧信息包括圆心、初始点、终点、圆弧半径、旋转方向;
8.步骤二:比较输入的x、y方向的脉冲余量,判断哪个坐标轴的脉冲余量绝对值大于等于0.5,进行脉冲处理;
9.步骤三:求解此刻的圆弧点的切线矢量,并归一化处理;
10.步骤四:将归一化处理后的数据分别与各自坐标轴的脉冲当量相乘,判断哪个坐标轴此刻为最长轴,决定发送脉冲;
11.步骤五:根据当前点坐标、下一点的一个轴坐标和圆心坐标,求解另一轴的坐标值,并反转为为脉冲值;
12.步骤六:重复步骤三到步骤五,并根据终点判别方法决定是否完成圆弧插补。
13.作为本发明进一步的方案,所述步骤一具体为:设圆弧所在的平面为xy两轴构成,设圆弧的圆心为o(x0,y0),半径长为r,当前的插补坐标为a(x,y),下一个脉冲的插补坐标为b(x1,y1),终点坐标为c(x’,y’)。
14.作为本发明进一步的方案,所述步骤二具体为:设x方向脉冲余数为repulse_x,y方向脉冲余数为repulse_y,并判断这两个方向的脉冲余数是否超出范围值,即绝对值大于 0.5;
15.当|repulse_x》0.5|,且repulse_x》0,则令repulse_x-1,同时x轴发送一个脉冲;
16.当|repulse_x》0.5|,且repulse_x《0,则令repulse_x 1,同时x轴发送一个脉冲;
17.当|repulse_y》0.5|,且repulse_y》0,则令repulse_y-1,同时y轴发送一个脉冲;
18.当|repulse_y》0.5|,且repulse_y《0,则令repulse_y 1,同时y轴发送一个脉冲。
19.作为本发明进一步的方案,所述步骤三具体为:若是没有一个方向上的余数的绝对值超过0.5,则直接进入下面的计算:首先计算切向矢量:z轴的矢量与圆上的点到圆心点的矢量叉乘所得,圆上的点到圆心点的矢量,即为a(x,y,0);切向矢量 vector(m,n,k);
20.至于z轴的矢量,若切线沿逆时针旋转,则设为z(0.0,0.0,1.0);
[0021][0022]
若切线沿顺时针旋转,则设为z(0.0,0.0,-1.0);
[0023][0024]
然后将切向矢量单位化:
[0025]
切线逆时针:
[0026]
切线顺时针:
[0027]
作为本发明进一步的方案,所述步骤四具体为:判断哪个轴为长轴,哪个方向发送一个脉冲,设脉冲当量分别为pulunitx和pulunity,设numx,numy分别为切线矢量分别与各自轴的脉冲当量的乘积数值;
[0028]
numx=m*pulunitx;
[0029]
numy=n*pulunity;
[0030]
如果|numx|》|numy|,则x方向发送一个脉冲,不然则y方向发送一个脉冲。
[0031]
作为本发明进一步的方案,所述步骤五具体为:(1)如果x方向发送脉冲,若 numx》0,则求下一个插补坐标b(x1,y1);
[0032]
x1=x 1/pulunitx;
[0033]
若numx《0,则x1=x-1/pulunitx;
[0034]
利用内插法求y1:
[0035]

[0036][0037]
否则,
[0038]
此时y方向增加了脉冲余数(y
1-‑
y)pulunity,y方向总脉冲余数变为 repulse_y (y
1-‑
y)pulunity;
[0039]
此时重新判断y方向总脉冲余数是否超出范围值,即绝对值大于0.5;
[0040]
当|repulse_y》0.5|,且repulse_y》0,则令repulse_y-1,同时y轴发送一个脉冲;
[0041]
当|repulse_y》0.5|,且repulse_y《0,则令repulse_y 1,同时y轴发送一个脉冲;
[0042]
(2)如果y方向发送脉冲,若numy》0,则求下一个插补坐标b(x1,y1);
[0043]
y1=y 1/pulunity;
[0044]
若numy《0,则y1=y-1/pulunity;
[0045]
利用内插法求x1:
[0046]

[0047][0048]
否则
[0049]
此时x方向增加了脉冲余数(x
1-‑
x)pulunitx,x方向总脉冲余数变为 repulse_x (x
1-‑
x)pulunitx;
[0050]
此时重新判断x方向总脉冲余数是否超出范围值,即绝对值大于0.5;
[0051]
当|repulse_x》0.5|,且repulse_x》0,则令repulse_x-1,同时x轴发送一个脉冲;
[0052]
当|repulse_x》0.5|,且repulse_x《0,则令repulse_x 1,同时x轴发送一个脉冲。
[0053]
作为本发明进一步的方案,所述步骤六具体为:重复步骤三到步骤五,直到判断完成本段圆弧插补,所述终点判断依据为:当前点坐标是否为终点坐标,其中为了防止整圆现象,加一个标志量,若是当前第一次进入插补,则不需要比较终点坐标,而是第二次开始才开始进行终点位置比较判断,终点之间的误差若是小于0.5个脉冲数,则判断为本段圆弧插补结束。
[0054]
本发明的技术效果和优点:本发明采用的基于圆弧切线矢量的圆弧插补方法,利用直线插补时分解到各轴的比例值,而后进行等比例的脉冲处理来进行圆弧插补,适用于任意起终点、任意空间平面的圆弧插补,通过区域划分的方法,来划分最长脉冲轴,再根据圆弧经过的区域具体分析,而后每个区域的最长轴的脉冲数相加得到我们需要对于椭圆对应圆心的圆弧分隔的段数,无需进行插补象限的判断,同时每一个点的处理方式都是采用
的脉冲余数和矢量分解比较判断决定哪个轴发送脉冲,且矢量的方向自身含有了发送脉冲的正负,而不像之前所处理的需要自己特定标注正负方向。方法流程清晰简单,可以精确地计算出复杂曲线的插补点且易于实现,满足工程实际需求。
附图说明
[0055]
图1为本发明中一个5x5的方格的示意图;
[0056]
图2为本发明方法第一次插补示意图;
[0057]
图3为本发明方法第二次插补示意图;
[0058]
图4为本发明方法第三次插补示意图;
[0059]
图5为本发明方法第四次插补示意图;
[0060]
图6为本发明方法第五次插补示意图;
[0061]
图7为本发明方法第六次插补示意图;
[0062]
图8为本发明方法第七次插补示意图;
[0063]
图9为本发明方法中切线顺时针旋转示意图;
[0064]
图10为本发明方法中切线逆时针旋转示意图。
具体实施方式
[0065]
下面结合附图和具体实施方式对本发明作进一步详细的说明。本发明的实施例是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显而易见的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。
[0066]
作为本发明的一个实施例,如图1所示,一个5*5的方格,从a点出发,到b点。脉冲当量为1pulse/mm其计算过程为:
[0067]
步骤一:
[0068]
首先,设圆弧所在的平面为xy两轴构成,设圆弧的圆心为o(0,0),半径长为5,当前的插补坐标为a(0,5),下一个脉冲的插补坐标为b(x1,y1),终点坐标为c(5,0);
[0069]
步骤二:
[0070]
设x方向脉冲余数为repulse_x,y方向脉冲余数为repulse_y,并判断这两个方向的脉冲余数是否超出范围值,即绝对值大于0.5;
[0071]
当|repulse_x》0.5|,且repulse_x》0,则令repulse_x-1,同时x轴发送一个脉冲;
[0072]
当|repulse_x》0.5|,且repulse_x《0,则令repulse_x 1,同时x轴发送一个脉冲;
[0073]
当|repulse_y》0.5|,且repulse_y》0,则令repulse_y-1,同时y轴发送一个脉冲;
[0074]
当|repulse_y》0.5|,且repulse_y《0,则令repulse_y 1,同时y轴发送一个脉冲;
[0075]
步骤三:
[0076]
若是没有一个方向上的余数的绝对值超过0.5,则直接进入下面的计算:首先计算切向矢量:是z轴的矢量与圆上的点到圆心点的矢量叉乘所得。圆上的点到圆心点的矢量, a(0,5,0);切向矢量vector(m,n,k);
[0077]
至于z轴的矢量,切线沿顺时针旋转,则设为z(0.0,0.0,-1.0);
[0078][0079]
然后将切向矢量单位化:
[0080]
切线顺时针:vector:(1,0,0);
[0081]
步骤四:
[0082]
接下来判断哪个是长轴,谁发送一个脉冲,设脉冲当量分别为pulunitx和 pulunity,pulunitx=pulunity=1,设numx,numy分别为切线矢量分别与各自轴的脉冲当量的乘积数值;
[0083]
numx=m*pulunitx=1;
[0084]
numy=n*pulunity=0;
[0085]
|numx|》|numy|,x方向发送一个脉冲;
[0086]
步骤五:
[0087]
1、如果x方向发送脉冲,若numx》0,则求下一个插补坐标b(x1,y1)
[0088]
x1=x 1/pulunitx;
[0089]
若numx《0,则
[0090]
x1=x-1/pulunitx;
[0091]
因为numx》0,则
[0092]
x1=1;
[0093]
利用内插法求y1:
[0094]

[0095][0096]
否则
[0097][0098][0099]
y1=4.8989;
[0100]
即下一点的脉冲坐标为(1,4.8989);
[0101]
此时y方向增加了脉冲余数(y
1-‑
y)pulunity,y方向总脉冲余数变为 repulse_y (y
1-‑
y)pulunity;repulse_y (y
1-‑
y)pulunity=-0.1010;
[0102]
此时重新判断y方向总脉冲余数是否超出范围值,即绝对值大于0.5;
[0103]
当|repulse_y》0.5|,且repulse_y》0,则令repulse_y-1,同时y轴发送一个脉冲;
[0104]
当|repulse_y》0.5|,且repulse_y《0,则令repulse_y 1,同时y轴发送一个脉冲;
[0105]
|-0.1010|《0.5;
[0106]
则不发送脉冲,具体如图2所示。
[0107]
第一次插补结束,返回步骤三,圆上的点到圆心点的矢量,a(1,4.8989,0);切向矢量vector(m,n,k);
[0108]
至于z轴的矢量,切线沿顺时针旋转,则设为z(0.0,0.0,-1.0);
[0109][0110]
然后将切向矢量单位化:
[0111]
切线顺时针:vector:(0.97978,-0.2,0)
[0112]
步骤四判断得到x方向为最长轴,x正方向发送一个脉冲;
[0113]
步骤五numx》0,x1=x 1/pulunitx=2;
[0114]
利用内插法求得y1=4.5826,即下一点的脉冲坐标为(2,4.5826),此时y方向增加了脉冲余数(y
1-‑
y)pulunity=-0.3163,y方向总脉冲余数变为repulse_y=-0.1010 (
‑ꢀ
0.3163)=-0.4174;因为|-0.4174|《0.5,则不发送脉冲,具体如图3所示。
[0115]
第二次插补结束,返回步骤三,圆上的点到圆心点的矢量,a(1,4.8989,0);切向矢量vector(m,n,k);
[0116]
至于z轴的矢量,切线沿顺时针旋转,则设为z(0.0,0.0,-1.0);
[0117][0118]
然后将切向矢量单位化:
[0119]
切线顺时针:
[0120]
vector:(0.91652,-0.4,0);
[0121]
步骤四判断得到x方向为最长轴,x正方向发送一个脉冲。
[0122]
步骤五numx》0,x1=x 1/pulunitx=3,利用内插法求得y1=4,即下一点的脉冲坐标为 (3,4),此时y方向增加了脉冲余数(y
1-‑
y)pulunity=-0.5826,y方向总脉冲余数变为 repulse_y=-0.4174 (-0.5826)=-1.0,因为|-1|》0.5-1《0,此时重新判断y方向总脉冲余数是否超出范围值,即绝对值大于0.5;
[0123]
当|repulse_y》0.5|,且repulse_y》0,则令repulse_y-1,同时y轴发送一个脉冲;
[0124]
当|repulse_y》0.5|,且repulse_y《0,则令repulse_y 1,同时y轴发送一个脉冲;
[0125]
y方向总脉冲余数变为repulse_y=0,y轴发送一个脉冲。
[0126]
第四次插补过程如下表,结果如图4所示。
[0127][0128][0129]
第五次插补,圆上的点到圆心点的矢量a(4,3);切向矢量vector(m,n,k);
[0130]
至于z轴量,切线沿顺时针旋转,则设为z(0.0,0.0,-1.0);
[0131][0132]
然后将切向矢量单位化:
[0133]
切线顺时针:vector:(0.6,-0.8,0);
[0134]
步骤四,如果|numx|《|numy|,判断得到y方向为最长轴,y负方向发送一个脉冲;
[0135]
步骤五,如果y方向发送脉冲,若numy》0,则求下一个插补坐标b(x1,y1);
[0136]
y1=y 1/pulunity;
[0137]
若numy《0,则
[0138]
y1=y-1/pulunity;
[0139]
numy《0,y1=y-1/pulunity=2;
[0140]
利用内插法求x1:
[0141]

[0142][0143]
否则
[0144][0145][0146]
x1=4.5826;
[0147]
即下一点的脉冲坐标为(2,4.5826);
[0148]
此时x方向增加了脉冲余数(x
1-‑
x)pulunitx,x方向总脉冲余数变为repulse_x (x
1-‑
x)pulunitx;(x
1-‑
x)pulunitx=0.5826;repulse_x (x
1-‑
x) pulunitx=0.5826;因为|0.5826|》0.5,此时重新判断x方向总脉冲余数是否超出范围值,即绝对值大于0.5;
[0149]
当|repulse_x》0.5|,且repulse_x》0,则令repulse_x-1,同时x轴发送一个脉冲;
[0150]
当|repulse_x》0.5|,且repulse_x《0,则令repulse_x 1,同时x轴发送一个脉冲;
[0151]
x方向总脉冲余数变为repulse_y=-0.4174,x轴发送一个脉冲。
[0152]
第六七次插补过程省略,结果如下表所示。
[0153]
[0154]
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献