Pep*_*ijn 5 python algorithm math g-code geometric-arc
我正在为CNC铣床实现驱动程序,而我在实现G代码弧命令时遇到了麻烦.
我已经找到了几个中点圆算法的实现,但它实际上并不是真的可用.
我发现中点圆算法的问题在于它是2D并且同时绘制所有八分圆,而我需要通过3D路径的连续步骤,由起点,终点和中心点给出.
我发现了一个很好的多维等效Bresenham的线绘算法使用浮点运算.绘制圆弧可能存在类似的事情吗?
我可以通过大量的思考和实验来改变这种算法,但是由于绘制弧线并不是一个未解决的问题,而且之前已经制造过数控机床,我想知道是否已经存在一个优雅的解决方案?
在CNC上,通常不仅仅是 2D,因为还有速度、刀具角度、每轴运动学多个执行器等......为此,我通常使用参数为 的参数三次方t=<0.0,1.0>。因此,我将路径转换为一组三次曲线,这些曲线可以在任何维度上轻松评估。完成此步骤后,您将获得 3 种常用的光栅化方法:
恒定dt步长
参数三次通常是非线性的,因此为了移动到另一个像素(或其他像素),您需要t以比分辨率更小的步长增加参数,如下所示:
dt < 1.0 / curve_length
Run Code Online (Sandbox Code Playgroud)
越少越好dt,您不会错过任何像素,但粗略地说会有更多重复位置。
搜索dt下一步
使用二分搜索,您可以找到下一个,t因此到当前位置的距离是单个像素。这更精确,但在某种程度上也更慢......
转换为线
您可以将三次曲线采样为一组线(数量取决于曲线的大小),并像往常一样使用 DDA 或 Bresenham 对线进行栅格化。这是最简单的,但结果不会完全是一条曲线。
三次方是这样的:
P(t) = a0 + a1*t + a2*t^2 + a3*t^3
t = <0.0,1.0>
Run Code Online (Sandbox Code Playgroud)
其中P(t)是位置,a0,a1,a2,a3是 m 个向量的系数,其中每个轴都有自己的标量系数。
请参阅如何生成多点线性插值?以及如何使用/计算它们的子链接。
无论如何,如果您坚持假设圆弧进行圆弧插补:
P(t) = ( Rotation_matrix(t) * (P0 - Pcenter) ) + Pcenter
t = <0.0,2*PI>
Run Code Online (Sandbox Code Playgroud)
其中,沿曲线方向Rotation_matrix旋转点,并且是起点,也是圆弧的中心。(0,0,0,...,0)t [rad]P0Pcenter
如果是非轴对齐旋转,您可以使用Rodrigues_rotation_formula代替。
然而,使用齐次变换矩阵是 ND 中的最佳选择,您只需放大矩阵大小: