Nomar记录一段历史
打印对象的打印时间是如何估计的?

我很好奇切片软件提供的估算背后的算法/原理。这背后是否有标准技术,它的准确度如何?

让我们不要忘记心理部分:印刷品的开始似乎总是要花很长时间,部分原因是几乎没有可识别的形状。最后 25% 左右的层,不仅形状非常明显,而且这些层覆盖的面积通常比底部小得多,因此每层的时间确实减少了。

2个回答

一般来说,典型的算法会考虑切片机对构建特定特征的速度设置,例如填充、周长、顶层/底层等。每个特征的喷嘴以特定速度行进的距离也是所涉及的方程。基于加速度和其他因素的喷嘴运动有一些相当模糊的部分,这使得计算不太准确。

它有多准确?

不太准确。我使用三种不同切片机的经验是,它从未超过百分之十。我相信一个构建的各种特征组合不会从一个模型到另一个模型完全相同,甚至阻止从以前的构建创建一个大概的数字。

你能提供一个参考,让人们可以看到这些计算是如何进行的吗?就像一段代码或算法本身。
Tom van der Zanden 的回答比我能理解的更复杂,不是代码人,但这是一个好的开始。我发现了许多包含计算基本描述的网站,包括 http://forums.reprap.org/read.php?2,647001,但它们似乎都缺少各种因素。在大多数站点中,加速度被忽略或近似。因此,构建时间是近似值。我想如果将轨道动力学数学应用到 3D 打印中,可以获得更准确的结果。
除非您要处理多天打印,否则我会说 10% 的准确度已经足够了。

3D 打印中使用的大部分软件都是开源的,一些切片器也是如此。例如,Cura 在gcodeInterpreter.py 中执行(或执行,此源代码来自较旧的分支)其打印时间估计。

源代码的相关部分是(为了清楚起见,已简化并删除了许多行):

 totalMoveTimeMinute = 0.0 pos = util3d.Vector3() for line in gcodeFile: G = self.getCodeInt(line, 'G') if G is not None: if G == 0 or G == 1: #Move x = self.getCodeFloat(line, 'X') y = self.getCodeFloat(line, 'Y') z = self.getCodeFloat(line, 'Z') e = self.getCodeFloat(line, 'E') f = self.getCodeFloat(line, 'F') oldPos = pos.copy() pos.x = x pos.y = y pos.z = z feedrate = f currentE = e totalMoveTimeMinute += (oldPos - pos).vsize() / feedRate

如您所见,(此版本的)Cura 只是:

  • 循环遍历所有 G 代码指令,

  • 计算每次移动的长度(在 X/Y/Z 中)并将其除以进给率以获得移动所需的时间,

  • 总结一下所有的动作。

并且不考虑:

  • 加速或减速。假设打印机始终以最大进给率运行,

  • 挤出的长丝长度。进给率是在 (X,Y,Z,E) 中移动的速度,但 Cura 只看 (X,Y,Z)。

  • 加热打印床/热端或归位/自动调平所需的时间,

  • 如果不能足够快地读取移动(从 USB/SD 卡),打印机速度会减慢的影响(尽管这很难包含在任何估计中)。

如果将进给率设置为某个不切实际的值,则此估计的准确性可能会非常糟糕。

较新版本的 Cura 使用更高级的时间估计方法,可以在timeEstimate.cpp 中找到。它要复杂得多,实际上还要考虑加加速度/加速度/减速度。它要准确得多。

我们确切地知道 3D(开源)3D 打印机固件的工作原理,因此估算打印时间就像模拟给定固件执行 G 代码一样简单。您没有理由不能得到一个真正好的估计(如果您考虑到给定固件的加速/减速技术的所有复杂性),但是为其编写代码却相当复杂。

随机文章