4、运动控制核心指令:G0/G1快速移动与线性插补、绝对/相对坐标(G90/G91)的区别与应用
在3D打印机的G-code指令体系中,G0与G1是出现频率最高、直接决定打印质量与效率的两条运动控制指令。许多初学者将G0简单理解为“快移”、G1理解为“慢移”,这种认知在底层逻辑上是错误的——两者的本质区别不在于速度,而在于运动模式是否参与挤出联动。与此同时,G90/G91坐标模式的选择直接影响所有后续坐标值的解释方式,一旦混淆,轻则模型错位,重则撞机或损坏热床。本章将从指令架构、坐标语义、实际切片输出与手工编程四个维度,系统拆解这组核心指令的工程应用。
4.1 核心原理:G0与G1的底层运动学差异
G0与G1在固件层面都调用直线插补器,但两者的运动规划参数与挤出联动逻辑截然不同。G0被设计为“非打印移动”,其核心特征是挤出电机(E轴)不参与运动同步——即使指令中携带E值,固件也会忽略或仅做位置记录而不实际挤出。这意味着G0可以调用更高的最大速度与加速度参数(通常为打印参数的2-3倍),因为不存在材料挤出均匀性的约束。而G1是“打印移动”,必须保证挤出量与位移量的严格比例关系,因此其速度、加速度受限于材料流动特性与热端响应能力。
从运动规划角度看,G0与G1在Marlin、Klipper等主流固件中分别对应不同的运动缓存区与规划器配置。G0通常使用max_jerk和max_accel的独立参数组,而G1则受print_jerk与print_accel约束。这种分离设计允许打印机在空驶时快速移动,同时在打印时保持高精度。值得注意的是,部分固件(如RepRapFirmware)允许通过M203、M201等指令分别调整两类运动的速率与加速度上限。
4.2 判断方法:如何区分与选择G0/G1
在实际编程与切片参数检查中,判断一条移动指令应该使用G0还是G1,核心依据是该移动过程中是否需要挤出材料。以下是具体的判断流程:
- 检查移动目的:如果移动是为了改变打印位置但不挤出材料(如从打印件上方越过、移动到起始点、换层空驶),使用G0;如果移动过程中需要连续挤出材料形成线条或层,使用G1。
- 检查E值变化:在绝对挤出模式(M82)下,如果目标E值大于当前E值且差值大于0,则该移动为挤出移动,必须使用G1;如果E值不变或为回抽(E值减小),则使用G0。
- 检查速度参数:G0可以使用高于打印速度的F值(如快移速度3000-6000mm/min),而G1的F值应匹配材料与层高的推荐打印速度(通常1500-2400mm/min)。
- 检查固件配置:查看固件中
DEFAULT_MAX_FEEDRATE与DEFAULT_MAX_ACCELERATION的数组定义,确认G0与G1是否使用不同的运动参数组。
| 对比维度 | G0 快速移动 | G1 线性插补 |
|---|---|---|
| 运动本质 | 非打印空驶 | 打印挤出移动 |
| 挤出联动 | 不联动(忽略E值) | 联动(按比例挤出) |
| 速度上限 | 快移速度(通常较高) | 打印速度(受材料限制) |
| 加速度规划 | 快移加速度 | 打印加速度 |
| 典型应用 | 换层、越过、回抽后移动 | 外壁、填充、支撑等挤出路径 |
| 切片输出 | 非挤出路径 | 挤出路径 |
4.3 核心原理:G90/G91坐标模式的语义差异
G90与G91定义了后续所有坐标指令的解释方式。G90(绝对坐标)下,每个坐标值都是相对于打印机构建原点(通常为热床左下角或中心)的绝对位置;G91(相对坐标)下,每个坐标值表示从当前位置出发的增量位移。这一差异对程序的可重复性、可读性与安全性有深远影响。
在绝对模式下,程序中的每一行坐标都是独立且完整的——无论当前喷头在哪里,执行G1 X100 Y100都会将喷头移动到构建板上X=100、Y=100的位置。这种特性使得绝对模式非常适合切片软件输出,因为切片器可以精确计算每个路径点的绝对坐标,且程序可以随时中断、恢复或重复执行而不会累积误差。相反,相对模式下每个坐标都依赖前一个位置,程序一旦中断或跳转执行,后续所有坐标都会错位。
从固件实现角度看,G90/G91状态存储在一个全局变量中,所有运动指令在执行前都会查询该状态。Marlin固件中,relative_mode标志位控制坐标解释逻辑;Klipper则通过G90/G91命令切换虚拟机的坐标模式。值得注意的是,E轴坐标模式可以独立于XYZ轴设置——M82设置绝对挤出模式,M83设置相对挤出模式,这在回抽与恢复挤出时非常有用。
4.4 判断方法:G90/G91的选择策略与转换技巧
选择G90还是G91,取决于使用场景与编程需求。以下是工程实践中的判断依据:
- 切片软件输出:几乎所有主流切片软件(Cura、PrusaSlicer、Simplify3D)默认使用G90绝对坐标模式,因为切片器可以精确计算每个路径点的绝对坐标,且程序可重复执行。
- 手动调试与测试:当需要微调喷头位置(如调平、探针测试、手动换料)时,G91相对模式更直观——输入
G91 G1 X10即可让喷头向右移动10mm,无需计算目标绝对坐标。 - 宏程序与循环:在编写重复性操作(如多点点检、阵列打印)时,G91可以简化循环逻辑,但必须注意每次循环结束后的位置复位。
- 混合使用:工程实践中常在同一程序中混合使用G90与G91——主体打印使用G90,而回抽、换料、探针等辅助操作临时切换G91,操作完成后切回G90。
G28(回原点)或G29(自动调平)可能导致意外行为,因为这些指令内部使用绝对坐标逻辑。建议在执行归位或调平指令前,先切换回G90模式。此外,G91模式下重复执行同一程序段会导致位置不断累加,可能超出打印范围造成撞机。
4.5 案例拆解:从切片输出到手工编程的完整闭环
以下通过一个实际打印任务,完整展示G0/G1与G90/G91在真实工程中的应用。假设我们使用PrusaSlicer切片一个20mm×20mm×10mm的立方体,层高0.2mm,壁厚0.8mm(2条挤出线),填充率20%。切片器输出的关键G-code片段如下:
; 初始设置
M82 ; 绝对挤出模式
G28 ; 回原点
G90 ; 绝对坐标模式
G1 Z0.2 F300 ; 抬升到首层高度
; 首层外壁(G1挤出移动)
G1 X0.8 Y0.8 F1800 ; 移动到起点
G1 X19.2 Y0.8 E0.8 F1200 ; 挤出底边
G1 X19.2 Y19.2 E1.6 F1200 ; 挤出右边
G1 X0.8 Y19.2 E2.4 F1200 ; 挤出顶边
G1 X0.8 Y0.8 E3.2 F1200 ; 挤出左边
; 换层空驶(G0快速移动)
G0 Z0.4 F300 ; 抬升到第二层
G0 X0.8 Y0.8 F3000 ; 快速移动到起点
; 第二层外壁
G1 X19.2 Y0.8 E4.0 F1200
G1 X19.2 Y19.2 E4.8 F1200
G1 X0.8 Y19.2 E5.6 F1200
G1 X0.8 Y0.8 E6.4 F1200
在这个案例中,我们可以观察到以下关键设计决策:
- G90绝对模式贯穿全程:所有坐标都是相对于构建原点的绝对位置,这使得程序可重复执行,且任何一行都可以独立理解。
- G0用于层间空驶:换层时使用G0快速抬升并移动到新起点,速度F3000远高于打印速度F1200,且不携带E值。
- G1用于挤出路径:所有挤出移动都使用G1,且E值按挤出长度递增(每段0.8mm³),确保材料流量与位移严格同步。
- M82与G90配合:绝对挤出模式与绝对坐标模式共同保证了程序的确定性。
现在,假设我们需要在打印过程中手动插入一段“擦拭喷头”操作——将喷头移动到热床边缘的擦拭区,挤出少量材料清洁喷嘴。此时使用G91相对模式更为安全:
; 暂停打印,手动擦拭
G91 ; 切换到相对坐标
G1 X-10 Y-20 F3000 ; 向左后方向移动10mm、20mm
G1 E5 F300 ; 挤出5mm材料清洁喷嘴
G1 E-5 F300 ; 回抽5mm
G90 ; 切回绝对坐标
; 继续原程序
这种混合使用方式既保证了擦拭操作的灵活性(无需计算擦拭区的绝对坐标),又确保了主程序在绝对模式下的确定性。但必须注意:切换回G90后,后续坐标仍然基于原始原点,不会因为G91期间的移动而改变基准。
4.6 常见误区与总结复盘
在G0/G1与G90/G91的使用中,工程师与爱好者常犯以下错误,需要重点规避:
| 误区描述 | 可能后果 | 正确做法 |
|---|---|---|
| 将G0理解为“慢速G1” | 空驶时速度过慢,浪费时间 | G0使用独立快移参数 |
| 在G1中省略E值 | 喷头移动但不挤出,产生断料 | G1必须携带正确的E增量 |
| 在G0中携带E值 | 固件忽略E值,材料未挤出 | 空驶移动不携带E值 |
| G91模式下执行G28 | 归位逻辑混乱,可能撞机 | 归位前切换G90 |
| 混淆M82/M83与G90/G91 | E轴坐标解释错误,挤出量异常 | E轴模式独立设置,注意区分 |
| G91模式下重复执行程序 | 位置不断累加,超出打印范围 | 循环程序使用G90或每次复位 |
总结本章核心要点:G0与G1的本质区别在于是否联动挤出,而非速度高低;G90/G91决定了坐标解释的基准,绝对模式适合切片输出与程序复用,相对模式适合手动调试与增量操作。在实际工程中,应遵循“主体打印用G90+G1,空驶用G0,辅助操作临时切G91”的黄金法则。同时,务必理解E轴坐标模式(M82/M83)与XYZ轴坐标模式(G90/G91)是独立控制的,两者不可混淆。掌握这些核心指令的语义与工程边界,是编写可靠、高效、可维护的3D打印程序的基础。