直线插补

在数控机床运作的时候,如果我们想让机床的钻头走一条直线,他的钻头在微观的视角里面实际上走的不是直线,而是呈现一个阶梯状态的路径,在走的每一步中,根据偏差预定轨迹,在x方向或者y方向给一个很小的脉冲,接下来是运用直线插补的逐点比较法进行插补计算。

假设我们起点是O(0,0),终点是A(6,4)

有这样一个公式

F>=0,F=F-|ye|
F<0 ,F=F+|Xe|

这里面(xe,ye)就是终点的坐标(6,4)。

有这几个参数:

步数偏差判别坐标进给偏差计算终点判断E

初始E=x+y=6+4=10

第0步,E=10,在原点,所以偏差计算F(0,0)=0

第1步,之前没有偏差,F>0,x方向进给,偏差计算F=F-|ye|=0-4=-4,E=9

第2步,这里由于第一步只给了x方向的进给,就开始有偏差了,偏差为-4,偏差判别F<0,y方向向上给一个进给,进行偏差计算,F=F+|xe|=-4+6=2,终点E=8

第3步,偏差判别F>0,x方向给进给,F=F-|ye|=2-4=-2,E=7

第4步,F=-2<0,Y方向给进给,F=F+|xe|=-2+6=4,E=6

第5步,F=4>0,x方向给进给,F=F-|ye|=4-4=0,E=5

第6步,F=0>=0,x方向给进给,F=F-|ye|=0-4=-4,E=4

第7步,F=-4<0,Y方向给进给,F=F+|xe|=-4+6=2,E=3

第8步,F=2>0,x方向给进给,F=F-|ye|=2-4=-2,E=2

第9步,F=-2<0,Y方向给进给,F=F+|xe|=-2+6=4,E=1

第10步,F=4>0,x方向给进给,F=F-|ye|=4-4=0,E=0

以上就是计算过程,将结果汇总制成图表:

步数偏差判别坐标进给偏差计算终点判断E
0F(0,0)=010
1F=0+xF=F-|ye|=0-4=-49
2F<0+yF=F+|xe|=-4+6=28

3

F>0+xF=F-|ye|=2-4=-27
4F=-2<0+yF=F+|xe|=-2+6=46
5F=4>0+xF=F-|ye|=4-4=05
6F=0>=0+xF=F-|ye|=0-4=-44
7F=-4<0+yF=F+|xe|=-4+6=23
8F=2>0+xF=F-|ye|=2-4=-22
9F=-2<0+yF=F+|xe|=-2+6=41
10F=4>0+xF=F-|ye|=4-4=00

最终运动效果如下,直线是预期轨迹,折线是实际运动轨迹 

算法实现

static int F=0;
int x,y,E;
void gx();//x方向给脉冲
void gy();//y方向给脉冲
int main(){
//x,y预处理,负数取反
if(x<0),x=std::abs(x);
if(y<0),y=std::abs(y);
E=x+y;
while(E>=0)
{
if(F>=0){
        gx();
        F=F-y;
        }
if(F<0){
       gy();
       F=F=x;
       }
E--;
}
return 0;
}

我这个算法实现有局限性,即起始点是在原点,线段在坐标系的第二象限,如果是在其他位置,xy的进给方向和所在坐标轴的正负相同,如果线段不是从原点开始需要将线段通过计算移到原点。

圆弧插补

圆弧插补的原理和直线的相似下面是计算公式分为顺时针和逆时针


//方向一顺二逆三顺四逆
F>=0,F=F-2|yi|+1
F<0 ,F=F+2|xi|+1


//方向一逆二正三逆四正
F>=0,F=F-2|xi|+1
F<0 ,F=F+2|yi|+1

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐