欢迎光临散文网 会员登陆 & 注册

[matlab]DDA画圆弧测试

2023-02-13 02:34 作者:扎之克  | 我要投稿

    打算用stm32做主控DIY台xy雕刻机,所以看了一点DDA直线插补和圆弧插补的东西,一些细节不是很懂,所以用matlab画了圆弧的几种情况。代码在最后,这里的代码和数控技术的算法不一样。 

X,Y轴运动独立:

 逆时针圆方程:

对时间t求导:

(V是线速度)

推导2:

首先速度向量与半径垂直,那么只要将位置坐标的XY互换一下再添个符号就行,也就是向量(X,Y)的垂直向量是(-Y,X)或(Y,-X)。

做了这个操作后再除以模R乘以速度V。

有了初始坐标就能用上面的方程进行迭代(欧拉法):

 △t*V/R是常数,所以也可以写成:

X,Y累加器每个周期累加△x=-ky,△y=kx,当累加器溢出时,向相应电机发出脉冲。

 根据这个写了一个画圆的函数:


 (起始于[50,0],速度=0.5,迭代次数=400)

    一次性最好只画一个象限的圆弧,再根据圆的对称性画其他象限的圆弧,这样比较容易编程,效率也高。如果一次性画整圆,那必须得处理符号问题,这使得编程更复杂,同时也拖了效率。但为了方便观察,这里的函数能一次性画出整个圆,改变迭代次数可以改变圆弧的长度。

       这里,累加器不做半加载处理,因为累加值有符号,而正浮点四舍五入与负浮点四舍五入是不同的,int(5.5+0.5)、int(-5.5-0.5),半加载改成对累加器四舍五入后再判断溢出。


二阶近似:

    迭代方程是一阶近似,这相当于沿着切线走,路肯定越走越宽,可以用二阶近似来提高精度。

推导1:

推导2:

将cos与sin用泰勒一阶多项式替换得到之前方程:

将cos与sin用泰勒二阶多项式替换:

Y轴也一样,所以有:

一阶、二阶对比:

 紫线为二阶,(速度=0.5,迭代次数=8000)      ,     (速度=1,迭代次数=8000)

隐方法:

只需要改变一阶代码中累加那一行代码的位置就可以实现。


三者对比(黑线为隐方法),(速度=1,迭代次数=400)(速度=1,迭代次数=8000)

隐方法突出的就是一个稳定性

(速度=12.5,迭代次数=40)             (迭代次数=800)

X,Y轴运动关联:

圆的标准方程:

对其求关于x的一、二阶导数得:

x与y对称的,所以:

    从方程上来看,x=0或y=0时会出现斜率无穷大的情况,如果在画圆弧时始终选择一个轴作为主要方向,那就会出现斜率无穷大的情况。有一个解决方法:当X坐标绝对值与Y坐标绝对值相同时交换方向,既保证了从动方向的累加量小于等1又能保证不出现斜率无穷大的情况。

    根据初始坐标选择方向,X,Y轴速度的绝对值中,数值大的那个的对应轴作为主要方向,如果两绝对值相等,那就根据关于t的二阶导来判断。

比如对于初始坐标(0,50)有:Y轴速度绝对值大于X轴速度绝对值,所以选Y轴作为主要方向开始迭代直到两者相等或者说两轴坐标绝对值相等时,交换方向。

根据以上写了个画圆的函数:

红线为一阶,黑线为二阶,

(速度=1,迭代次数=400)        (速度=12)
(速度=1,迭代次数=8000)        (速度=12)

画出来的路径不受程序的速度参数影响。

一阶情况下,两种圆弧积分的精确度控制:

    圆方程关于X或Y二阶导不恒为0,所以用一阶导数来积分有误差,而△x和△y的取值范围是{-1,1},这种情况下,可以调节精度但有点麻烦。


而运动独立的方法中,

可以通过调节△t来减小误差。


    当圆弧的半径较小时,运动联合方法绘制的路径将会偏离较多且无法调节精度。(这里的代码没法调节联合方法的精确度)

在独立的方法中,将速度设置得尽可能地小来提高精度。

(虚线为联合方法,实线为独立方法)

 (起始[5,0],速度=0.005,迭代次数=40)

代码段:https://blog.csdn.net/qq_39892910/article/details/128978782


[matlab]DDA画圆弧测试的评论 (共 条)

分享到微博请遵守国家法律