Klipper Delta 打印机自动校准完全指南:DELTA_CALIBRATE 与 DELTA_ANALYZE 实战与源码解析
2026/9/15 12:27:19 网站建设 项目流程

Klipper Delta 打印机自动校准完全指南:DELTA_CALIBRATE 与 DELTA_ANALYZE 实战与源码解析

【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper

Klipper 为 "delta"(并联臂)结构的 3D 打印机提供了一套完整的软件自动校准系统,用于求解塔柱限位(tower endstop)位置、塔柱角度、delta 半径与并联臂杆长等彼此耦合、呈非线性影响的运动学参数。本文以 Klipper 官方文档 docs/Delta_Calibrate.md 为主体,结合仓库内 delta_calibrate.py、delta.py、example-delta.cfg 与测试用例 delta_calibrate.test,完整讲解基本校准(DELTA_CALIBRATE)与增强校准(DELTA_ANALYZE)的操作流程、命令参数与底层原理。读完本文,你将能够独立为 delta 打印机完成从"能打印"到"尺寸精确"的完整校准,并理解 Klipper 是如何用数值优化而非手工经验求解这些参数的。

为什么 Delta 打印机的校准如此特殊

在笛卡尔(CoreXY、i3 等)结构上,每个轴的运动是相对独立的,可以通过拧限位开关、调 Z 偏移等方式逐轴手工调整。但 delta 结构的运动学完全不同:喷头最终位置是三个塔柱滑块高度的非线性函数。Klipper 在 klippy/kinematics/delta.py 中通过三球交汇(mathutil.trilateration)把三个塔柱的伸长量换算为 XYZ 坐标,其中涉及以下关键参数:

  • 塔柱限位位置(position_endstop):每个塔柱回零时滑块的绝对高度;
  • 塔柱角度(angle):三根塔柱在 XY 平面上的方位角;
  • delta 半径(delta_radius):塔柱轴线到打印机中心轴的距离;
  • 臂杆长度(arm_length):连接滑块与效应器(effector)的平行杆长度。

每个参数都对最终位置有"非显而易见且非线性"的影响:例如某个限位偏移 1mm,在床面不同位置的 Z 误差并不相同;角度偏差还会造成 XY 方向的尺寸变形。手工逐个调参几乎不可能同时收敛,而软件校准只需几分钟,且不需要任何特殊探测硬件——手动模式仅依赖一张纸片(paper test)。

需要特别强调的是:delta 校准的最终精度受限于塔柱限位开关的精度。如果使用 Trinamic 步进驱动,建议启用 限位相位检测(Endstop Phase) 来提升开关触发点的可重复性,这能显著改善校准结果。

自动探测还是手动探测

Klipper 的校准支持两种探测方式,通过METHOD参数区分:

  • DELTA_CALIBRATE METHOD=manual:手动探测。喷头移动到床面附近后暂停,由用户按 纸片测试(the paper test) 判断喷嘴与床面的实际间隙,并通过ACCEPT确认。
  • DELTA_CALIBRATE(不带参数):自动探测,要求打印机装有自动 Z 探针。

文档对自动探针给出了明确的精度红线

如果自动探针的探测位置偏差(location bias)超过 25 微米(0.025mm),请改用手动探测。

原因是 delta 打印机的臂杆长度若有微小差异,会导致效应器倾斜,进而使安装在热端侧面或带有 X/Y 偏移的探针产生系统性偏差。若坚持使用自动探针,必须首先完成 探针校准(Probe Calibrate) 并执行其中的 位置偏差检查(Location Bias Check)。

此外还有一个容易踩坑的细节:如果探针安装在热端侧面(带 X/Y 偏移),delta 校准会使之前的探针校准结果失效。因为 delta 校准本身会改变效应器倾斜状态,从而改变探针相对喷嘴的空间关系。这类探针本身也很少适合 delta 使用,若确要使用,必须在每次 delta 校准之后重新运行探针校准。

基本 Delta 校准:DELTA_CALIBRATE

前置条件与配置

进行校准前,打印机的初始 delta 参数(臂杆长度、半径、限位位置)必须已经写入配置,且精度需在几毫米以内。大多数 delta 套件会提供这些默认值;如果没有,需要先查找一份 delta 校准入门指南来获得可用的起点。

在配置中需要定义[delta_calibrate]段。以 config/example-delta.cfg 为例:

[printer] kinematics: delta max_velocity: 300 max_accel: 3000 max_z_velocity: 150 delta_radius: 174.75 [stepper_a] step_pin: PF0 dir_pin: PF1 enable_pin: !PD7 microsteps: 16 rotation_distance: 40 endstop_pin: ^PE4 homing_speed: 50 position_endstop: 297.05 arm_length: 333.0 [stepper_b] # ... 前右塔柱,默认角度 330° [stepper_c] # ... 后塔柱,默认角度 90° [delta_calibrate] radius: 50

根据 docs/Config_Reference.md 中[delta_calibrate]段的说明,可用参数如下:

参数含义默认值备注
radius允许探测区域的半径(mm),指喷嘴坐标的探测范围必填若自动探针带 XY 偏移,需选得足够小以保证探针始终落在床面上
speed校准过程中非探测移动的速度(mm/s)50
horizontal_move_z探测动作开始前喷头应到达的高度(mm)5

注意stepper_a默认角度为 210°、stepper_b为 330°、stepper_c为 90°(见 Config_Reference.md 与 delta.py 中的[210., 330., 90.]默认数组);arm_lengthposition_endstop只需在stepper_a中给出,bc会默认继承a的值。

允许探针低于床面

校准过程中 Klipper 需要探测一些"按常理低于床面平面"的点(用于数值拟合出完整曲面),因此建议在校准期间临时修改配置,让minimum_z_position=-5。校准完成并SAVE_CONFIG之后,再将该设置从配置中移除。对应实现可见 delta.py 中self.min_z = config.getfloat('minimum_z_position', 0, maxval=self.max_z)对运动边界的影响。

执行校准

G28 DELTA_CALIBRATE METHOD=manual

流程说明:

  1. G28先完成回零(delta 三个轴同时回零,见 delta.py 的home()方法中homing_state.set_axes([0, 1, 2]))。
  2. DELTA_CALIBRATE会依次探测床上 7 个点(中心点 + 6 个围绕点)。探测点由 delta_calibrate.py 根据配置的radius自动计算:scatter = [.95, .90, .85, .70, .75, .80]决定每个点相对半径的比例,角度按 60° 间隔分布在圆周上。
  3. 手动模式下,每次喷头靠近床面后,用户用纸片法确认间隙,输入间隙值(如Z0.1)后发送ACCEPT,Klipper 记录该点的实际高度(源码中add_manual_height会把当前位置换算成"稳定位置"三元组并保存)。
  4. 全部 7 个点探测完毕后,Klipper 计算出一组新的塔柱角度、塔柱限位与 delta 半径,并提示运行SAVE_CONFIG写入配置:
SAVE_CONFIG

SAVE_CONFIG会将新参数写入配置文件(参见 delta.py 的save_state(),它把delta_radius写入[printer],把anglearm_lengthposition_endstop写入对应的[stepper_a/b/c]),并重启打印机使参数生效。测试用例 delta_calibrate.test 中完整演示了 G28 → 7 次手动探测 → 保存的流程,其生成的SAVE_CONFIG区块在 delta_calibrate.cfg 中可以看到真实效果。

基本校准得到的参数足以满足普通打印的 Z 方向精度需求。如果是新组装的打印机,此刻正好可以打印一些基础测试件验证整体功能。

增强 Delta 校准:DELTA_ANALYZE

基本校准只保证"喷嘴到床面的距离正确",不校准 X/Y 方向上的尺寸精度。增强校准通过打印并测量一个专用测试件,额外求解臂杆长度等参数,把 X/Y 尺寸精度也校准到位。本流程需要数字卡尺(digital calipers)与一次打印。

打印测试件

用切片软件从 docs/prints/calibrate_size.stl 生成 G-Code,切片参数建议:

  • 低速打印,例如 40mm/s;
  • 优先使用硬质塑料(如 PLA);
  • 测试件直径为 140mm。若打印机幅面不够可整体缩小(X、Y 必须等比例缩放);若打印机幅面更大也可放大——更大的尺寸能提升测量精度,但良好的粘附比更大的尺寸更重要

打印完成后等待其完全冷却。后续所有测量与命令必须在与打印测试件时完全相同的打印机配置下进行:打印与测量之间不要运行DELTA_CALIBRATE,也不要改动任何配置。若不确定配置是否一致,请重新执行一次 基本校准(含SAVE_CONFIG)后再打印。

测量时若可能,让测试件保持在打印床上进行;即使脱落也无妨,但避免在测量中弯折测试件。

第一组测量:中心柱到各外围柱的距离

先用卡尺测量中心柱"A" 标签旁柱(应指向 A 塔柱方向)之间的距离:

然后逆时针依次测量中心柱到其余各柱的距离(中心柱到 C 对面柱、中心柱到 B 柱……):

将这些数值以无空格的浮点数逗号分隔列表输入:

DELTA_ANALYZE CENTER_DISTS=<a_dist>,<far_c_dist>,<b_dist>,<far_a_dist>,<c_dist>,<far_b_dist>

参数顺序为:A 旁柱、C 对面柱、B 旁柱、A 对面柱、C 旁柱、B 对面柱(对应源码 delta_calibrate.py 中MeasureAngles = [210., 270., 330., 30., 90., 150.]定义的 6 个方位角)。

第二组测量:相邻外围柱之间的距离

测量A 柱C 对面柱之间的距离:

同样逆时针继续测量:C 对面柱到 B 柱、B 柱到 A 对面柱……:

输入命令:

DELTA_ANALYZE OUTER_DISTS=<a_to_far_c>,<far_c_to_b>,<b_to_far_a>,<far_a_to_c>,<c_to_far_b>,<far_b_to_a>

第三组测量:中心柱宽度

完成以上测量后,即可将测试件从床上取下。接下来测量柱子本身的尺寸:先测量中心柱沿 A 辐条方向的宽度,再沿 B 辐条、C 辐条方向:

输入命令:

DELTA_ANALYZE CENTER_PILLAR_WIDTHS=<a>,<b>,<c>

第四组测量:外围柱宽度

最后测量各外围柱的宽度。先测A 柱沿"A 到 C 对面柱"连线方向的宽度:

再逆时针测量其余外围柱(C 对面柱沿"到 B 柱"连线方向、B 柱沿"到 A 对面柱"连线方向……):

输入命令:

DELTA_ANALYZE OUTER_PILLAR_WIDTHS=<a>,<far_c>,<b>,<far_a>,<c>,<far_b>

提供缩放系数并执行计算

如果打印时对测试件做了缩放,需要告知 Klipper 实际使用的比例:

DELTA_ANALYZE SCALE=1.0
  • SCALE=2.0表示测试件放大为原尺寸的 2 倍;
  • SCALE=0.5表示缩小为原尺寸的一半。

最后执行增强校准计算:

DELTA_ANALYZE CALIBRATE=extended

该命令可能需要数分钟才能完成(源码中它在后台线程里运行坐标下降优化,见 delta_calibrate.py 调用mathutil.background_coordinate_descent)。计算完成后会输出新的 delta 参数(delta 半径、塔柱角度、限位位置与臂杆长度——臂杆长度是增强校准新增的优化对象,基本校准并不调整它)。保存并应用:

SAVE_CONFIG

SAVE_CONFIG会同时保存两样东西:

  1. 更新后的 delta 运动学参数(写入[printer]与各[stepper_*]段);
  2. 距离测量的原始数据(以height*manual_height*distance*等键写入[delta_calibrate]段,见 delta_calibrate.py 的save_state())。

因此今后的DELTA_CALIBRATE命令会自动复用这批距离信息(源码中last_distances在初始化时从配置恢复,并在probe_finalize中一并参与计算)。反之,不要在SAVE_CONFIG之后重新输入原始的裸距离测量值——因为SAVE_CONFIG已改变打印机配置,那些裸测量不再适用于新的坐标系。

附加说明

  • 理想尺寸参考:如果 delta 打印机尺寸精度良好,任意两根柱之间的距离应在 74mm 左右,每根柱的宽度应在 9mm 左右。更精确地说,目标是"任意两柱间距减去其中一柱的宽度恰好为 65mm"。当测试件存在尺寸偏差时,DELTA_ANALYZE会同时利用距离测量值和上次DELTA_CALIBRATE的高度测量值求解新参数——这正是 delta_calibrate.py 中误差函数delta_errorfunc的机制:它把"高度误差平方和"与"距离误差平方和"加权合并,其中距离权重由MEASURE_WEIGHT = 0.5及探测点数共同决定(z_weight = len(distances) / (0.5 * len(probe_positions)))。
  • 结果可能"出乎意料"DELTA_ANALYZE可能给出令人意外的参数,例如臂杆长度与实际物理长度不符。但实测表明它往往能得到更优的结果——因为计算出的参数能够吸收硬件上其他地方的微小误差。例如臂杆长度的微小差异会导致效应器倾斜,而其中一部分倾斜可以通过调整臂杆长度参数被补偿掉。这正体现了数值优化相对"按图纸填参数"的优势。

源码视角:稳定位置与坐标下降法

理解 Klipper 的校准算法,核心概念是"稳定位置"(stable position)。正如 delta_calibrate.py 注释所述:一个稳定位置是一个三元组,表示从各塔柱限位触发后各轴走了多少步。它刻意与软件参数解耦——无论delta_radiusarm_length怎么改,同一个物理点对应的步数三元组不变。校准的全部测量(探测高度、卡尺距离)都被换算成"物理量 + 稳定位置对",然后交给优化器:

  • calc_stable_position(coord):把笛卡尔坐标换算为稳定位置(delta.py);
  • get_position_from_stable(stable_position):用一套待评估的候选参数把稳定位置反算回笛卡尔坐标。

优化器(坐标下降,coordinate descent)不断微调参数组合,目标是让误差函数最小:

total_error = z_weight * Σ(z_测量 - z_预测)² + Σ(距离_测量 - 距离_预测)²

基本校准只调整 6 个参数(radiusangle_a/bendstop_a/b/c);增强校准追加 3 个臂杆参数(arm_a/b/c),共 9 个可调参数(见coordinate_descent_params())。整个求解过程在后台线程执行,因此DELTA_ANALYZE CALIBRATE=extended需要数分钟。

测试用例 delta_calibrate.test 给出了最直接的验证路径:G28→ 7 次ACCEPT手动探测 → 输入全部距离测量 →DELTA_ANALYZE CALIBRATE=extended,其输出配置(delta_calibrate.cfg 中的SAVE_CONFIG区块)展示了校准后参数被写回配置的真实格式。

在 Delta 上使用 Bed Mesh

Delta 打印机同样可以使用 床网格(Bed Mesh),但必须先获得良好的 delta 校准,再启用 bed mesh。在 delta 参数不准的情况下运行 bed mesh,会得到令人困惑且质量低劣的结果——因为床面误差与运动学误差会混叠在一起无法区分。

另需注意:执行 delta 校准会使之前获得的 bed mesh 失效。每次完成新的 delta 校准后,务必重新运行BED_MESH_CALIBRATE重新生成网格。

校准流程速查

阶段命令目的
回零G28三个塔柱同时回到限位
基本校准DELTA_CALIBRATE METHOD=manual(或自动)探测 7 点,求解角度/限位/半径
保存SAVE_CONFIG写入配置并重启
打印测试件用 calibrate_size.stl 切片打印提供可测量基准
输入测量DELTA_ANALYZE CENTER_DISTS/OUTER_DISTS/CENTER_PILLAR_WIDTHS/OUTER_PILLAR_WIDTHS/SCALE输入卡尺数据
增强计算DELTA_ANALYZE CALIBRATE=extended追加求解臂杆长度,修正 XY 尺寸精度
保存SAVE_CONFIG写入配置并重启
重建网格BED_MESH_CALIBRATE使床网格与新的 delta 参数匹配

按此流程,一台新组装的 delta 打印机可以在数十分钟内从"无法打印"走到"尺寸精确、可直接出活"的状态。整个过程中唯一的硬件要求是一把数字卡尺,而这正是 Klipper 软件校准设计的精妙之处:用确定性的数值优化,替代对操作者经验的高度依赖。

【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询