5

我正在为 CNC 铣床实现驱动程序,但在实现 G 代码圆弧命令时遇到问题。

我发现了中点圆算法的几种实现,但它并不是真正可用的。

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

我发现了一个很好的多维等价于 Bresenham使用浮点运算的线条绘制算法。绘制弧线可能存在类似的事情?

通过大量的思考和实验,我也许可以根据自己的意愿弯曲这个算法,但是由于绘制圆弧不是一个未解决的问题,而且之前已经制造了 CNC 机器,我想知道是否已经存在一个优雅的解决方案?

4

3 回答 3

1

我的dxftools python 包用于处理不太智能的 2D 刀具的 DXF 文件,具有将弧线分割成 2D 线段的功能。您可以使用此代码,然后使用 3D 坐标变换将其任意放置在 3D 空间中。坐标变换的示例可以在我的py-stl包中找到。

于 2012-04-19T17:45:08.207 回答
1

LinuxCNC中,位置生成与步骤生成是分开的。在位置生成循环中,系统跟踪它已经沿着当前图元(直线或螺旋线)移动的距离,并使用一个简单的公式来获得沿该图元距离 D 的位置。(通常每毫秒执行一次)。根据您是否有舵机、硬件步骤生成或软件步骤生成,可以以不同的方式使用此位置。

在软件步骤生成系统中,沿每个轴确定旧指令位置和新指令位置之间的差异,这用于更新使用直接数字合成方法 (DDS) 的数字波形发生器的速率。然后,以更高的速率(通常每 20-50µs),DDS 确定每个轴是否应在此时生成一个步进。

这是一种与您描述的不同的设计,但它是一种更灵活的设计。例如,通过将位置生成与步骤生成分开,您可以在不修改步骤生成的情况下修改位置生成代码中的混合算法;并且您可以用硬件步进生成或伺服控制替换软件步进生成,或使用 PID 等算法。

在您的设计中,您可以通过简单地将螺旋弧切割成 Roland 所描述的线段,并将这些作为输入到您的仅理解线的步骤生成代码中,来近似我上面描述的方法。从某种意义上说,这与 LinuxCNC 所做的并没有太大的不同,只是曲线图元是根据距离而不是根据时间进行采样的。

于 2014-05-03T20:54:41.773 回答
1

CNC上,通常不仅仅是 2D,因为还有速度、每个轴运动学不止一个执行器的工具角度等……为此,我通常使用带参数的参数三次方t=<0.0,1.0>。所以我将路径转换为一组三次曲线,这些三次曲线很容易在任何维度上进行评估。完成此步骤后,您将获得 3 种常用的光栅化方法:

  1. dt

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

    dt < 1.0 / curve_length  
    

    越少越好dt,你不会错过一个像素,但粗糙的会有更多的重复位置。

  2. 搜索dt下一步

    使用二进制搜索,您可以找到下一个t,因此到当前位置的距离是单个像素。这更精确,但在某种程度上也更慢......

  3. 转换为线条

    您可以将三次曲线采样成一组线条(多少取决于曲线的大小)并像往常一样使用 DDA 或 Bresenham 栅格化线条。这是最简单的,但结果不会完全是一条曲线。

立方是这样的:

P(t) = a0 + a1*t + a2*t^2 + a3*t^3
t = <0.0,1.0>

其中P(t)是位置,a0,a1,a2,a3是向量 m 中的系数,其中每个轴都有自己的标量系数。

请参阅如何生成多点线性插值?以及如何使用/计算它们的子链接。

无论如何,如果您坚持假设圆弧进行圆弧插值:

P(t) = ( Rotation_matrix(t) * (P0 - Pcenter) ) + Pcenter
t = <0.0,2*PI>

Where将您的Rotation_matrix点沿曲线方向旋转,并且是起点并且是圆弧的中心。(0,0,0,...,0)t [rad]P0Pcenter

在非轴对齐旋转的情况下,您可以使用Rodrigues_rotation_formula代替。

然而,使用齐次变换矩阵是 ND 中的最佳选择,您只需扩大矩阵大小:

于 2020-02-12T11:04:54.093 回答