计算n维弧路径

5

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

我找到了几个中点圆算法的实现,但它并不能直接使用。

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

我找到了一个使用浮点运算的Bresenham线段绘制算法的多维等效算法。也许绘制弧形的类似算法也存在?

我也许能够用很多思考和实验来改变这个算法以适应我的需求,但由于绘制弧形不是一个未解决的问题,并且CNC机器以前已经被制造过,所以我想知道是否已经存在一种优雅的解决方案?


你是在尝试寻找一条沿着三维空间中的一维曲线的路径,还是一条覆盖三维空间中的二维曲面的路径? - Beta
3个回答

1

CNC上,通常不仅有2D图像,还有速度、工具角度、每个轴运动学的多个执行器等等。为此,我通常使用参数化立方曲线,参数为t=<0.0,1.0>。因此,我将路径转换为一组立方曲线,这些曲线可以在任何维度中轻松计算。完成此步骤后,您有三种常规的栅格化方式:

  1. constant dt step

    parametric cubics are usually nonlinear so in order to move to another pixel (or whatever) you need to increase parameter t with smaller step than your resolution is something like:

    dt < 1.0 / curve_length  
    

    the less dt is the better chances are you will not miss a pixel but of coarse will have many more duplicate positions.

  2. search next dt step

    using binary search you can find what is the next t so the distance to current position is single pixel. This is much more precise but also slower up to a point...

  3. convert to lines

    you can sample your cubic curve into set of lines (how many depends on size of the curve) and rasterize lines as usuall using DDA or Bresenham. This is simplest but the result will not be exactly a curve.

立方体是这样的:

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

其中P(t)表示位置,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是弧线的中心。

如果旋转轴不与坐标轴对齐,则可以使用Rodrigues_rotation_formula

然而,在ND中,最好使用homogenous transform matrices,只需扩大矩阵大小即可:


1
正如你所想,七年是一段很长的时间了,所以我不再实现CNC驱动程序,但这是一个非常全面的答案,所以谢谢!(尽管七年前我对旋转矩阵之类的东西一无所知) - Pepijn

1

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


1
LinuxCNC中,位置生成与步骤生成分离。在位置生成循环中,系统跟踪它已经沿着当前原语(线或螺旋)移动的距离,并使用简单的公式得出该原语上距离D的位置。(通常每毫秒执行一次)。根据是否有伺服、硬件步进或软件步进,可以以不同的方式使用这个位置。
在软件步进生成系统中,沿每个轴确定旧命令位置和新命令位置之间的差异,并使用直接数字合成方法(DDS)更新数字波形发生器的速率。然后,在更高的速率下(通常每20-50微秒),DDS确定每个轴在该时间是否应该生成一个步进。
这是一个不同的设计,但它是一个更灵活的设计。例如,通过将位置生成与步骤生成分离,您可以修改位置生成代码中的混合算法而无需修改步骤生成;您还可以用类似PID的算法替换软件步进生成或伺服控制。
在您的设计中,您可以通过将螺旋弧线切成线段并将其作为输入放入您的步进生成代码中来近似我上面描述的方法,就像Roland所描述的那样。从某种意义上说,这与LinuxCNC所做的并没有太大的区别,只是曲线原语根据距离而不是时间进行采样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接