Files
OrcaSlicer/doc/developer-reference/Klipper_vs_OrcaSlicer_Velocity_Limits.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

313 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Klipper vs OrcaSlicer速度限制方式的重要差异
## 你发现的关键问题
**Klipper固件配置**:
```ini
[printer]
max_velocity: 300 # 限制合成速度
max_z_velocity: 10 # 单独限制Z轴
```
**OrcaSlicer配置**:
```
machine_max_speed_x: 500 # X轴速度限制
machine_max_speed_y: 500 # Y轴速度限制
machine_max_speed_z: 12 # Z轴速度限制
machine_max_speed_e: 120 # E轴速度限制
```
## 核心矛盾
### Klipper的限制方式固件实际执行
**max_velocity** 限制的是**合成速度**,不是分量!
```
例子G1 X100 Y100 F6000 (合成100 mm/s)
Klipper检查
- 合成速度 = √(Vx² + Vy²) = 100 mm/s
- max_velocity = 300 mm/s
- 100 < 300 ✓ 不降速
即使:
- X轴分量 = 70.7 mm/s
- Y轴分量 = 70.7 mm/s
Klipper不关心分量只看合成速度
```
**max_z_velocity** 是特例限制Z轴分量
```
因为Z轴通常很慢丝杠驱动单独限制
```
### OrcaSlicer的时间估算方式
**检查每个轴的分量**(我之前解释的方式):
```cpp
// 检查X轴分量
if (X轴分量 > machine_max_speed_x)
// 检查Y轴分量
if (Y轴分量 > machine_max_speed_y)
// 检查Z轴分量
if (Z轴分量 > machine_max_speed_z)
```
## 问题:时间估算可能不准确!
### 场景1高速对角线移动
**G-code**: `G1 X200 Y200 F18000` (合成300 mm/s)
**Klipper固件**:
```
合成速度 = 300 mm/s
max_velocity = 300 mm/s
300 = 300 ✓ 允许执行,不降速
```
**OrcaSlicer估算**:
```
X轴分量 = 300 × (200/282.8) = 212 mm/s
Y轴分量 = 212 mm/s
如果 machine_max_speed_x = 500:
212 < 500 ✓ OrcaSlicer认为不降速
结果估算认为可以跑300 mm/s ✓ 与Klipper一致
```
**这个场景没问题!**
### 场景2三轴斜向移动
**G-code**: `G1 X100 Y100 Z20 F18000` (合成300 mm/s)
**Klipper固件**:
```
距离 = √(100² + 100² + 20²) = 144.6mm
合成速度 = 300 mm/s
max_velocity = 300 mm/s
但Z轴分量 = 300 × (20/144.6) = 41.5 mm/s
max_z_velocity = 10 mm/s
41.5 > 10 ✗ 需要降速!
降速因子 = 10 / 41.5 = 0.241
实际合成速度 = 300 × 0.241 = 72.3 mm/s
```
**OrcaSlicer估算**:
```
Z轴分量 = 300 × (20/144.6) = 41.5 mm/s
machine_max_speed_z = 12 mm/s
41.5 > 12 ✗ 需要降速
降速因子 = 12 / 41.5 = 0.289
实际合成速度 = 300 × 0.289 = 86.7 mm/s
```
**结果对比**:
- Klipper实际: 72.3 mm/s (被max_z_velocity=10限制)
- OrcaSlicer估算: 86.7 mm/s (被machine_max_speed_z=12限制)
**问题**: 如果machine_max_speed_z设置不等于max_z_velocity时间估算会偏差
### 场景3纯XY高速移动最大问题
**G-code**: `G1 X200 Y0 F30000` (500 mm/s)
**Klipper固件**:
```
合成速度 = 500 mm/s
max_velocity = 300 mm/s
500 > 300 ✗ 降速到300 mm/s
```
**OrcaSlicer估算**:
```
X轴分量 = 500 mm/s
machine_max_speed_x = 500 mm/s
500 = 500 ✓ 不降速认为可以跑500 mm/s
```
**严重偏差**
- Klipper实际: 300 mm/s
- OrcaSlicer估算: 500 mm/s
- **时间估算偏短约40%**
## 为什么会有这个差异?
### Marlin固件的限制方式
MarlinOrcaSlicer最初针对的固件使用**per-axis限制**
```c
// Marlin固件代码伪代码
for (axis in XYZE) {
if (axis_velocity[axis] > max_speed[axis])
;
}
```
这正是OrcaSlicer时间估算的逻辑
### Klipper的不同设计哲学
Klipper使用**合成速度限制**:
```python
# Klipper固件代码伪代码
velocity = sqrt(vx² + vy² + vz²)
if velocity > max_velocity:
降速
```
**原因**
- Klipper的运动规划更先进
- 考虑的是打印头的实际移动速度
- 而不是单个电机的速度
## 如何配置才能准确?
### 方法1保守配置推荐
对于Klipper打印机在OrcaSlicer中
```
假设Klipper配置
max_velocity = 300 mm/s
max_z_velocity = 10 mm/s
OrcaSlicer配置保守
machine_max_speed_x = 300 # 不是500
machine_max_speed_y = 300 # 不是500
machine_max_speed_z = 10 # 匹配max_z_velocity
machine_max_speed_e = 120 # E轴通常单独限制
```
**原理**: 将XY的限制设为max_velocity这样
- 纯X移动: 300 mm/s正确
- 纯Y移动: 300 mm/s正确
- 对角线XY: 会被降速到212 mm/s**偏保守**
**缺点**: 对角线移动会略微高估时间
### 方法2激进配置更准确但复杂
```
OrcaSlicer配置
machine_max_speed_x = 424 # 300 × √2
machine_max_speed_y = 424 # 300 × √2
machine_max_speed_z = 10
```
**原理**: 对角线移动时,分量 = 300/√2 ≈ 212需要轴限制 = 300×√2 ≈ 424
**缺点**:
- 对于纯X/Y移动会高估速度
- 计算复杂
### 方法3接受偏差实用
```
OrcaSlicer配置
machine_max_speed_x = 500 # 电机物理限制
machine_max_speed_y = 500
machine_max_speed_z = 10
```
**接受**
- 高速纯X/Y移动时时间估算会偏短
- 但大部分打印是复杂路径,影响不大
- 用户了解这个限制即可
## OrcaSlicer是否应该改进
### 理想方案添加Klipper模式
在时间估算中添加两种模式:
```cpp
if (m_flavor == gcfKlipper) {
// Klipper模式检查合成速度
float composite_velocity = sqrt(vx² + vy² + vz²);
if (composite_velocity > max_velocity)
;
// Z轴单独检查
if (vz > max_z_velocity)
;
} else {
// Marlin模式检查各轴分量当前逻辑
for each axis:
if (axis_velocity > axis_max)
;
}
```
### 需要添加的配置
```cpp
def = this->add("machine_max_velocity", coFloat);
def->label = L("Maximum velocity");
def->tooltip = L("Maximum toolhead velocity (Klipper max_velocity)");
def->sidetext = L("mm/s");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(300.0));
```
## 实际影响评估
### 对U1打印机的影响
U1使用什么固件
- 如果是Marlin系当前逻辑完全正确 ✓
- 如果是Klipper可能有偏差
### 典型打印任务的偏差
**正常打印**(大部分是中低速、复杂路径):
- 偏差 < 5%(可接受)
**高速打印**(直线多、速度高):
- 偏差可能达到20-30%
**首层/慢速打印**:
- 几乎无偏差(速度远低于限制)
## 总结
### 你的观察非常重要!
发现了OrcaSlicerMarlin-style和Klipper的限制方式差异
| 固件 | 限制方式 | OrcaSlicer估算 | 匹配度 |
|-----|---------|---------------|-------|
| Marlin | Per-axis分量 | Per-axis分量 | ✓ 完美 |
| Klipper | 合成速度 + Z轴 | Per-axis分量 | ⚠️ 有偏差 |
### 实用建议
1. **了解固件类型**
2. **Marlin打印机**: 当前配置完全准确
3. **Klipper打印机**:
- 保守: 将XY限制设为max_velocity
- 激进: 接受偏差
4. **Z轴**: 始终匹配max_z_velocity
### 长期改进方向
OrcaSlicer可以
1. 检测gcfKlipper flavor
2. 添加max_velocity配置
3. 实现Klipper风格的速度限制检查
4. 提供更准确的Klipper时间估算
---
**你的问题触及了一个真正的设计差异!** 这解释了为什么某些Klipper用户可能会发现时间估算不够准确。