计算n维弧形路径

时间:2012-04-16 11:07:41

标签: python algorithm math geometric-arc g-code

我正在为CNC铣床实施驱动程序,而且我在实现G代码弧命令时遇到了麻烦。

我找到了几个中点圆算法的实现,但它实际上并不是真的可用。

我发现中点圆算法的问题在于它是2D并且同时绘制所有八分圆,而我需要通过3D路径的连续步骤,由起点,终点和中心点给出。

我找到了使用浮点运算的nice multidimensional equivalent of Bresenham’s line drawing algo。绘制圆弧可能存在类似的事情吗?

我可以通过大量的思考和实验来改变这种算法,但是由于绘制弧线并不是一个未解决的问题,而且之前已经制造过数控机床,我想知道一个优雅的解决方案是否已经存在?

3 个答案:

答案 0 :(得分:1)

CNC 上,通常不止是2D,因为还有速度,每个轴运动学中的刀具角度不止一个致动器等。为此,我通常使用参数为{ {1}}。因此,我将路径转换为一组三次曲线,这些曲线可以在任何维度上轻松评估。完成此步骤后,您将获得3种常用的栅格化方法:

  1. 恒定的t=<0.0,1.0>步骤

    参数三次方通常是非线性的,因此要移动到另一个像素(或其他像素),您需要以比分辨率小的步长增加参数dt,例如:

    t

    dt < 1.0 / curve_length 越少,您将不会错过一个像素,但粗略的像素将具有更多的重复位置。

  2. 搜索下一步dt步骤

    使用二进制搜索,您可以找到下一个dt是什么,因此到当前位置的距离是单个像素。这要精确得多,但也要慢一点……

  3. 转换为行

    您可以将三次曲线采样为一组线(多少取决于曲线的大小),并照常使用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没有什么不同,只是根据距离而不是根据时间对曲线基元进行采样。