我正在为CNC铣床实施驱动程序,而且我在实现G代码弧命令时遇到了麻烦。
我找到了几个中点圆算法的实现,但它实际上并不是真的可用。
我发现中点圆算法的问题在于它是2D并且同时绘制所有八分圆,而我需要通过3D路径的连续步骤,由起点,终点和中心点给出。
我找到了使用浮点运算的nice multidimensional equivalent of Bresenham’s line drawing algo。绘制圆弧可能存在类似的事情吗?
我可以通过大量的思考和实验来改变这种算法,但是由于绘制弧线并不是一个未解决的问题,而且之前已经制造过数控机床,我想知道一个优雅的解决方案是否已经存在?
答案 0 :(得分:1)
在 CNC 上,通常不止是2D,因为还有速度,每个轴运动学中的刀具角度不止一个致动器等。为此,我通常使用参数为{ {1}}。因此,我将路径转换为一组三次曲线,这些曲线可以在任何维度上轻松评估。完成此步骤后,您将获得3种常用的栅格化方法:
恒定的t=<0.0,1.0>
步骤
参数三次方通常是非线性的,因此要移动到另一个像素(或其他像素),您需要以比分辨率小的步长增加参数dt
,例如:
t
dt < 1.0 / curve_length
越少,您将不会错过一个像素,但粗略的像素将具有更多的重复位置。
搜索下一步dt
步骤
使用二进制搜索,您可以找到下一个dt
是什么,因此到当前位置的距离是单个像素。这要精确得多,但也要慢一点……
转换为行
您可以将三次曲线采样为一组线(多少取决于曲线的大小),并照常使用DDA或Bresenham将线栅格化。这是最简单的方法,但是结果将不会完全是一条曲线。
立方像这样:
t
其中P(t) = a0 + a1*t + a2*t^2 + a3*t^3
t = <0.0,1.0>
是位置,P(t)
是m个向量的系数,其中每个轴都有自己的标量系数。
有关如何使用/计算它们的信息,请参见How can i produce multi point linear interpolation?和子链接。
无论如何,如果您坚持假设圆弧为圆弧进行插值:
a0,a1,a2,a3
在P(t) = ( Rotation_matrix(t) * (P0 - Pcenter) ) + Pcenter
t = <0.0,2*PI>
沿曲线方向将点Rotation_matrix
绕(0,0,0,...,0)
旋转t [rad]
的地方,并且P0
是起点,而Pcenter
是弧的中心。 / p>
如果旋转方向未对齐,则可以使用Rodrigues_rotation_formula。
不过,在ND中最好使用homogenous transform matrices来扩大矩阵大小:
答案 1 :(得分:0)
我的dxftools python软件包用于处理非常智能的2D切割器的DXF文件,它具有将弧分割成2D线段的功能。您可以使用此代码,然后使用3D坐标转换任意将其放置在3D空间中。坐标变换的示例可以在我的py-stl包中找到。
答案 2 :(得分:0)
在LinuxCNC中,位置生成与步骤生成分开。在位置生成循环中,系统跟踪它已经沿当前图元(线或螺旋线)移动的距离,并使用一个简单的公式来获得沿该图元的距离D的位置。 (通常,每毫秒执行一次)。根据您是否具有伺服,硬件步骤生成或软件步骤生成,可以以不同方式使用此位置。
在软件步骤生成系统中,沿每个轴确定旧命令位置和新命令位置之间的差异,这用于使用直接数字合成方法(DDS)更新数字波形发生器的速率。然后,以更高的速率(通常每20-50μs),DDS确定每个轴是否应该在那时生成一个步骤。
这是一个与你描述的不同的设计,但它更灵活。例如,通过将位置生成与步骤生成分离,您可以在位置生成代码中修改混合算法,而无需修改步骤生成;您可以使用PID等算法替换硬件步骤生成或伺服控制的软件步骤生成。
在您的设计中,您可以通过简单地将螺旋弧切割成Roland所描述的线段,并将它们用作仅了解线条的步骤生成代码的输入,来近似我上面描述的方法。从某种意义上说,这与LinuxCNC没有什么不同,只是根据距离而不是根据时间对曲线基元进行采样。