我目前正在为一台数控机床的控制器编程,因此当我从a点到B点时,我需要得到每个方向步进电机的步进量。
例如,点A的坐标是X=0,Y=0,B的坐标是X=15和Y=3。所以我必须在X轴上走15个步骤,而Y轴则要3步。
但是,我如何将这两个值以平滑的方式混合起来(也就是说,不是先x后y,这会导致非常难看的线条)?
在x=15和y=3的例子中,我希望它的排列方式如下:
for 3 times do:
x:4 steps y:0 steps
x:1 steps y:1 step
但是我怎样才能从算法中得到这些数字呢?
我希望你明白我的问题所在,谢谢你的时间,
卢卡
最佳答案
这里有两个主要问题:
弹道
这可以通过任何插值/光栅化来处理,例如:
DDA
布雷森汉姆
DDA是您的最佳选择,因为它可以轻松地处理任意数量的维度,并且可以根据整数和浮点运算进行计算它的速度也更快(在x386时代不是这样,但现在CPU架构已经完全改变了)
即使你只有二维机器,插值本身也很可能是多维的,因为你可能会添加另一个东西,如:保持力,刀具转速,什么都可以,等等…必须以同样的方式沿直线插值。
速度
这个要复杂得多。您需要从开始位置到结束平稳地驱动您的电机,涉及以下内容:
线路开始/结束速度,以便您可以顺利地将更多线路连接在一起
最高速度(取决于每个刀具的制造过程,通常是恒定的)
电机/机械共振
电机速度限制:启动/停止和顶部
当写速度时,我指的是电机步数的频率[Hz]
或工具的物理速度[m/s]
或[mm/2]
。
线性插值不太好,我使用的是立方体,因为它们可以平滑连接,并为速度变化提供良好的形状。见:
How can i produce multi point linear interpolation?
插值立方(CATMUL-ROM的形式)正是我用来完成这样的任务的(为此我推导了它)
主要的问题是电动机的启动。您需要从0 Hz
驱动到某个频率,但通常的步进电机在较低的频率下会产生共振,而且对于多维机器,这些共振是不可避免的,因此您需要在这些频率下花费尽可能少的时间还有另一种方法可以通过增加重量或改变形状,以及在马达本身上增加惯性阻尼器(仅限旋转马达)来处理这种运动的位移共振。
所以通常的单起停线速度控制如下:
所以你应该有两个隔间,一个是每次启动,一个是每次停止,把你的线分成两个相连的。你必须这样做,开始和停止频率是可配置的。。。
现在如何合并速度和时间?我使用离散非线性时间:
Find start point (time) of each cycle in a sine wave
这是同样的过程,但不是时间而是角度正弦波的频率是线性变化的,所以你需要改变的部分与立方。另外,你没有一个正弦波,所以用得到的time
作为dda的插值参数来代替它…或者将其与下一步的时间进行比较,如果较大或相等,则执行步骤并计算下一步…
这里是这种技术的另一个例子:
how to control the speed of animation, using a Bezier curve?
这一个实际上正是你应该做的…用三次曲线控制速度插值dda。
完成后,您需要在此基础上构建另一层,该层将配置每条轨迹线的速度,以便结果尽可能快,并匹配您的机器速度限制,以及匹配刀具速度(如果可能)。这部分是最复杂的。。。
为了让你知道什么是在你之前,当我把所有这些放在一起,我的数控插补器有166K字节的纯C++代码,不依赖于LIBS,比如向量数学、动态列表、通信等等。整个控制代码约为2.2兆字节