Files
OrcaSlicer/doc/developer-reference/Acceleration_Correction.md
xiaoyeliu b43cfaaaf9 2.2.0 flutter & WCP & Network Test (#54)
* Add docs about time_estimate

* Fix: Problems with graceful program exit caused by Flutter refactoring

* Add: sw_OpenBrowser() & sw_OpenOrcaWebview

* Fix: NetworkTestDialog Crash & Add: Lan Device test \ cloud test
2025-12-09 10:39:27 +08:00

5.9 KiB
Raw Blame History

问题1纠正E最大加速度 vs 挤出最大加速度

我之前的错误分析

我之前说"会使用5000"是错误的!感谢你的测试发现了问题。

正确的理解

代码逻辑重新分析

位置: src/libslic3r/GCode/GCodeProcessor.cpp

步骤1: 初始化加速度Line 770-773

// 从machine_max_acceleration_extruding读取
float max_acceleration = get_option_value(
    m_time_processor.machine_limits.machine_max_acceleration_extruding, i);

// 设置为machines的加速度
m_time_processor.machines[i].max_acceleration = max_acceleration;
m_time_processor.machines[i].acceleration = max_acceleration;

关键点:

  • machines[i].acceleration = machine_max_acceleration_extruding
  • 场景1: acceleration = 20000
  • 场景2: acceleration = 5000

步骤2: 获取打印移动的加速度Line 2827-2831

float acceleration = get_acceleration(static_cast<PrintEstimatedStatistics::ETimeMode>(i));
// 返回 machines[i].acceleration

结果:

  • 场景1: acceleration = 20000从extruding配置
  • 场景2: acceleration = 5000从extruding配置

步骤3: 检查各轴加速度限制Line 2834-2838

for (unsigned char a = X; a <= E; ++a) {
    float axis_max_acceleration = get_axis_max_acceleration(..., static_cast<Axis>(a));
    // 对E轴axis_max_acceleration = 5000

    // 检查这个轴的加速度分量是否超过限制
    if (acceleration * std::abs(delta_pos[a]) * inv_distance > axis_max_acceleration)
        acceleration = axis_max_acceleration / (std::abs(delta_pos[a]) * inv_distance);
}

关键区别理解

machine_max_acceleration_extruding(挤出最大加速度):

  • 主要限制:打印移动的整体加速度上限
  • 直接决定acceleration的初始值

machine_max_acceleration_eE轴最大加速度:

  • 次要检查确保E轴的加速度分量不超限
  • 只在E轴分量超限时才降低整体加速度

实际计算示例

假设打印移动100mm距离XY=99mmE=5mm

场景1extruding=20000, e=5000

1. acceleration = 20000从extruding配置

2. 检查E轴
   - E轴比例 = 5/100 = 0.05
   - E轴加速度分量 = 20000 * 0.05 = 1000 mm/s²
   - E轴限制 = 5000 mm/s²
   - 1000 < 5000 ✓ 不超限

3. 最终使用acceleration = 20000 mm/s²

场景2extruding=5000, e=5000

1. acceleration = 5000从extruding配置

2. 检查E轴
   - E轴比例 = 5/100 = 0.05
   - E轴加速度分量 = 5000 * 0.05 = 250 mm/s²
   - E轴限制 = 5000 mm/s²
   - 250 < 5000 ✓ 不超限

3. 最终使用acceleration = 5000 mm/s²

结果对比

  • 场景1用20000加速更快时间更短
  • 场景2用5000加速更慢时间更长

这与你的测试结果一致!

E轴限制什么时候生效

只有当E轴占比很大E轴限制才会降低整体加速度。

示例E占比50%100mm移动XY=50mmE=50mm

场景1extruding=20000, e=5000

1. acceleration = 20000

2. 检查E轴
   - E轴比例 = 50/100 = 0.5
   - E轴加速度分量 = 20000 * 0.5 = 10000 mm/s²
   - E轴限制 = 5000 mm/s²
   - 10000 > 5000 ✗ 超限!

3. 调整加速度:
   - acceleration = 5000 / 0.5 = 10000 mm/s²
   - 验证10000 * 0.5 = 5000 ✓

4. 最终使用acceleration = 10000 mm/s²被E轴限制降低了

场景2extruding=5000, e=5000

1. acceleration = 5000

2. 检查E轴
   - E轴加速度分量 = 5000 * 0.5 = 2500 mm/s²
   - E轴限制 = 5000 mm/s²
   - 2500 < 5000 ✓ 不超限

3. 最终使用acceleration = 5000 mm/s²

结果对比

  • 场景1用10000被E轴限制从20000降到10000
  • 场景2用5000
  • 场景1仍然更快

正确的结论

主从关系

  1. machine_max_acceleration_extruding是主要限制

    • 决定了打印移动的基础加速度
    • 直接影响时间估算
    • 设置20000 vs 5000会导致显著的时间差异
  2. machine_max_acceleration_e是辅助检查

    • 只检查E轴分量是否超限
    • 对于正常打印E占比通常5-20%很少触发
    • 只在E占比>25%时才可能降低加速度

你的测试结果解释

测试1E最大=5000挤出最大=20000
→ 大部分移动使用20000加速度
→ 时间较短

测试2E最大=5000挤出最大=5000
→ 大部分移动使用5000加速度
→ 时间较长约4倍加速时间

结论:挤出最大加速度是主要决定因素 ✓

时间差异计算示例

假设100mm移动从0加速到100 mm/s

加速度20000 mm/s²:

  • 加速时间 = 100 / 20000 = 0.005秒
  • 加速距离 = 0.5 * 100 * 0.005 = 0.25mm

加速度5000 mm/s²:

  • 加速时间 = 100 / 5000 = 0.02秒
  • 加速距离 = 0.5 * 100 * 0.02 = 1mm

时间差0.02 - 0.005 = 0.015秒每次加速多3倍时间

对于一个典型的打印任务10000次移动块累积时间差可能达到2-5分钟

修正后的理解

参数 作用 影响程度
machine_max_acceleration_extruding 打印时整体加速度 主要
machine_max_acceleration_e E轴分量限制 次要(通常不触发)

优先级extruding > e对正常打印

我之前错误的原因

我错误地认为"E轴限制会把加速度直接降到5000",但实际上:

  • E轴限制只检查E轴分量
  • 如果E占比小5-20%E轴分量 = 加速度 × 5-20%
  • 即使加速度是20000E轴分量只有1000-4000不超过5000
  • 所以E轴限制不会触发

只有E占比>25%时E轴限制才会降低加速度但仍然不是降到5000而是降到满足"E轴分量=5000"的程度。

感谢你的测试!

你的实际测试证明了:

  • extruding挤出最大加速度是关键参数
  • 改变它会显著影响打印时间
  • 我之前的分析是错误的

正确答案是:会使用20000对于正常E占比的打印移动