mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-11 14:33:04 +00:00
* 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
342 lines
8.8 KiB
Markdown
342 lines
8.8 KiB
Markdown
# Klipper配置 vs OrcaSlicer时间估算:实战分析
|
||
|
||
## 实际Klipper配置(Fluidd)
|
||
|
||
```ini
|
||
kinematics: corexy
|
||
max_velocity: 500 # 合成速度限制 500 mm/s
|
||
max_accel: 20000 # 合成加速度限制 20000 mm/s²
|
||
max_z_velocity: 30 # Z轴单独速度限制 30 mm/s
|
||
max_z_accel: 500 # Z轴单独加速度限制 500 mm/s²
|
||
square_corner_velocity: 8 # 转角速度(类似jerk概念)
|
||
```
|
||
|
||
## 关键发现
|
||
|
||
### 1. Klipper没有per-axis的XY速度限制
|
||
|
||
注意到:
|
||
- ✓ 有 `max_velocity` (合成速度)
|
||
- ✓ 有 `max_z_velocity` (Z轴单独)
|
||
- ❌ **没有** `max_x_velocity`
|
||
- ❌ **没有** `max_y_velocity`
|
||
|
||
**这意味着什么?**
|
||
|
||
XY平面的限制是**合成速度**,不是各轴分量!
|
||
|
||
### 2. 验证:不同方向的最大速度
|
||
|
||
根据这个配置:
|
||
|
||
```
|
||
纯X方向移动:G1 X100 F30000
|
||
- 合成速度 = 500 mm/s
|
||
- max_velocity = 500 mm/s
|
||
- 实际速度 = 500 mm/s ✓
|
||
|
||
纯Y方向移动:G1 Y100 F30000
|
||
- 合成速度 = 500 mm/s
|
||
- max_velocity = 500 mm/s
|
||
- 实际速度 = 500 mm/s ✓
|
||
|
||
45度对角线:G1 X100 Y100 F30000
|
||
- 合成速度 = 500 mm/s
|
||
- max_velocity = 500 mm/s
|
||
- 实际速度 = 500 mm/s ✓
|
||
|
||
结论:所有方向都能跑500 mm/s!
|
||
```
|
||
|
||
**Klipper的设计哲学**:打印头的移动速度是500 mm/s,不管是什么方向。
|
||
|
||
## OrcaSlicer的机器限制配置
|
||
|
||
OrcaSlicer使用Marlin风格的配置:
|
||
|
||
```
|
||
machine_max_speed_x = ? # 需要设置
|
||
machine_max_speed_y = ? # 需要设置
|
||
machine_max_speed_z = 30 # 匹配max_z_velocity
|
||
machine_max_speed_e = 120 # 挤出机限制
|
||
|
||
machine_max_acceleration_extruding = 20000 # 匹配max_accel
|
||
machine_max_acceleration_e = 5000 # E轴单独限制
|
||
```
|
||
|
||
**问题**:X和Y应该设置为多少?
|
||
|
||
## 三种配置策略对比
|
||
|
||
### 策略1:保守配置(简单但不够准确)
|
||
|
||
```
|
||
machine_max_speed_x = 500
|
||
machine_max_speed_y = 500
|
||
machine_max_speed_z = 30
|
||
```
|
||
|
||
**实际效果分析**:
|
||
|
||
```
|
||
场景1:纯X移动 G1 X100 F30000
|
||
OrcaSlicer检查:
|
||
- X轴分量 = 500 mm/s
|
||
- machine_max_speed_x = 500 mm/s
|
||
- 500 = 500 ✓ 不降速
|
||
- 估算:500 mm/s
|
||
Klipper实际:500 mm/s
|
||
偏差:0% ✓ 准确
|
||
|
||
场景2:45度对角线 G1 X100 Y100 F30000 (合成500)
|
||
OrcaSlicer检查:
|
||
- X轴分量 = 500 × (100/141.4) = 354 mm/s
|
||
- Y轴分量 = 354 mm/s
|
||
- X: 354 < 500 ✓
|
||
- Y: 354 < 500 ✓
|
||
- 估算:500 mm/s
|
||
Klipper实际:500 mm/s
|
||
偏差:0% ✓ 准确
|
||
|
||
场景3:高速对角线 G1 X100 Y100 F42426 (想跑707 mm/s)
|
||
OrcaSlicer检查:
|
||
- X轴分量 = 707 × 0.707 = 500 mm/s
|
||
- Y轴分量 = 500 mm/s
|
||
- X: 500 = 500 ✓ 刚好到限制
|
||
- Y: 500 = 500 ✓
|
||
- 估算:707 mm/s (因为分量都不超)
|
||
Klipper实际:500 mm/s (被max_velocity限制)
|
||
偏差:+41% ✗ 高估!
|
||
```
|
||
|
||
**结论**:
|
||
- ✓ 正常速度准确
|
||
- ✗ 超高速对角线会高估
|
||
|
||
### 策略2:精确配置(推荐)
|
||
|
||
为了让对角线也准确,需要计算:
|
||
|
||
```
|
||
假设想要对角线跑500 mm/s:
|
||
- 合成速度 = √(Vx² + Vy²) = 500
|
||
- 对于45度:Vx = Vy = 500/√2 = 354 mm/s
|
||
|
||
但OrcaSlicer检查的是分量,所以:
|
||
如果设置 machine_max_speed_x = 500
|
||
那么对角线的X分量只能是354,不会触发降速
|
||
这样对角线最大合成速度 = √(500² + 500²) = 707 mm/s
|
||
|
||
要让对角线被正确限制到500,需要:
|
||
500² = Vx² + Vy² (对角线)
|
||
Vx = Vy (对称)
|
||
500² = 2×Vx²
|
||
Vx = 500/√2 = 354
|
||
|
||
但这是实际速度,OrcaSlicer检查的是限制值
|
||
我们需要限制值让分量达到354时触发限制...
|
||
|
||
不对,思路错了。
|
||
|
||
正确思路:
|
||
我们希望当合成速度达到500时,OrcaSlicer认为超限。
|
||
但OrcaSlicer只检查分量,不检查合成速度。
|
||
|
||
所以无法完美匹配!
|
||
```
|
||
|
||
**实际上,对于Klipper的max_velocity,OrcaSlicer的per-axis检查永远无法完美匹配!**
|
||
|
||
**妥协方案**:
|
||
```
|
||
machine_max_speed_x = 500
|
||
machine_max_speed_y = 500
|
||
machine_max_speed_z = 30
|
||
```
|
||
|
||
接受对于极端高速对角线会略有高估。
|
||
|
||
### 策略3:激进配置(不推荐)
|
||
|
||
```
|
||
machine_max_speed_x = 707 # 500 × √2
|
||
machine_max_speed_y = 707
|
||
machine_max_speed_z = 30
|
||
```
|
||
|
||
**效果分析**:
|
||
|
||
```
|
||
场景1:纯X移动 G1 X100 F30000 (想跑500)
|
||
OrcaSlicer检查:
|
||
- X轴分量 = 500 mm/s
|
||
- machine_max_speed_x = 707 mm/s
|
||
- 500 < 707 ✓ 不降速
|
||
- 估算:500 mm/s
|
||
Klipper实际:500 mm/s
|
||
偏差:0% ✓
|
||
|
||
场景2:超高速纯X G1 X100 F48000 (想跑800)
|
||
OrcaSlicer检查:
|
||
- X轴分量 = 800 mm/s
|
||
- machine_max_speed_x = 707 mm/s
|
||
- 800 > 707 ✗ 降速到707
|
||
- 估算:707 mm/s
|
||
Klipper实际:500 mm/s (被max_velocity限制)
|
||
偏差:+41% ✗ 严重高估!
|
||
```
|
||
|
||
**结论**:更糟糕,不推荐。
|
||
|
||
## 加速度配置
|
||
|
||
同样的问题也存在于加速度!
|
||
|
||
### Klipper配置
|
||
```
|
||
max_accel: 20000 # 合成加速度
|
||
max_z_accel: 500 # Z轴加速度
|
||
```
|
||
|
||
### OrcaSlicer配置
|
||
```
|
||
machine_max_acceleration_extruding = 20000 # ✓ 直接匹配
|
||
machine_max_acceleration_x = ?
|
||
machine_max_acceleration_y = ?
|
||
machine_max_acceleration_z = 500 # ✓ 匹配max_z_accel
|
||
machine_max_acceleration_e = 5000
|
||
```
|
||
|
||
**问题**:X和Y的加速度限制是什么?
|
||
|
||
在Klipper中,并没有单独的max_x_accel或max_y_accel!
|
||
|
||
**推荐配置**:
|
||
```
|
||
machine_max_acceleration_x = 20000 # 设置为max_accel
|
||
machine_max_acceleration_y = 20000
|
||
machine_max_acceleration_z = 500
|
||
machine_max_acceleration_e = 5000
|
||
```
|
||
|
||
## Square Corner Velocity是什么?
|
||
|
||
```
|
||
square_corner_velocity: 8
|
||
```
|
||
|
||
这是Klipper的转角速度限制,类似于jerk的概念。
|
||
|
||
**物理意义**:
|
||
- 在直角转弯时,允许的最小速度
|
||
- 更高的值 = 更激进的转角 = 更多振动
|
||
- 更低的值 = 更平滑但慢
|
||
|
||
**OrcaSlicer对应**:
|
||
```
|
||
machine_max_jerk_x/y/z
|
||
```
|
||
|
||
但计算逻辑不同:
|
||
- Klipper的square_corner_velocity基于向心加速度
|
||
- Marlin的jerk是瞬时速度变化限制
|
||
|
||
**近似转换**(粗略):
|
||
```
|
||
jerk ≈ square_corner_velocity × 2
|
||
machine_max_jerk_x = 16 mm/s (8 × 2)
|
||
machine_max_jerk_y = 16 mm/s
|
||
```
|
||
|
||
但这只是粗略近似,实际效果会有差异。
|
||
|
||
## 完整的OrcaSlicer配置建议(针对你的Klipper)
|
||
|
||
```
|
||
# 速度限制
|
||
machine_max_speed_x = 500 # 保守策略,匹配max_velocity
|
||
machine_max_speed_y = 500 # 保守策略
|
||
machine_max_speed_z = 30 # 精确匹配max_z_velocity
|
||
machine_max_speed_e = 120 # E轴通常单独限制
|
||
|
||
# 加速度限制
|
||
machine_max_acceleration_extruding = 20000 # 匹配max_accel
|
||
machine_max_acceleration_retracting = 5000 # 回抽加速度
|
||
machine_max_acceleration_travel = 20000 # 空走加速度(如果支持)
|
||
machine_max_acceleration_x = 20000 # 匹配max_accel
|
||
machine_max_acceleration_y = 20000 # 匹配max_accel
|
||
machine_max_acceleration_z = 500 # 精确匹配max_z_accel
|
||
machine_max_acceleration_e = 5000 # E轴单独限制
|
||
|
||
# Jerk限制(粗略转换)
|
||
machine_max_jerk_x = 16 # square_corner_velocity × 2
|
||
machine_max_jerk_y = 16
|
||
machine_max_jerk_z = 0.4 # Z轴jerk通常很小
|
||
machine_max_jerk_e = 2.5 # E轴jerk
|
||
```
|
||
|
||
## 预期偏差
|
||
|
||
使用上述配置:
|
||
|
||
| 场景 | OrcaSlicer估算 | Klipper实际 | 偏差 |
|
||
|-----|---------------|------------|------|
|
||
| 纯X/Y移动,速度≤500 | 准确 | 准确 | 0% ✓ |
|
||
| 对角线移动,合成≤500 | 准确 | 准确 | 0% ✓ |
|
||
| 对角线移动,合成>500 | 可能高估 | 被限制到500 | <10% |
|
||
| 包含Z轴移动 | 准确 | 准确 | 0% ✓ |
|
||
| 正常打印任务 | 准确 | 准确 | <5% ✓ |
|
||
|
||
## 根本解决方案:OrcaSlicer需要支持Klipper风格
|
||
|
||
理想情况下,OrcaSlicer应该:
|
||
|
||
1. **检测Klipper flavor**
|
||
2. **添加新配置**:
|
||
```cpp
|
||
machine_max_velocity = 500 // 合成速度限制
|
||
machine_max_z_velocity = 30 // Z轴单独限制
|
||
square_corner_velocity = 8 // 转角速度
|
||
```
|
||
|
||
3. **使用不同的检查逻辑**:
|
||
```cpp
|
||
if (flavor == gcfKlipper) {
|
||
// 检查合成速度
|
||
float composite_velocity = sqrt(vx² + vy² + vz²);
|
||
if (composite_velocity > max_velocity)
|
||
降速;
|
||
|
||
// Z轴单独检查
|
||
if (vz > max_z_velocity)
|
||
降速;
|
||
} else {
|
||
// Marlin风格:检查各轴分量
|
||
// 当前逻辑...
|
||
}
|
||
```
|
||
|
||
## 总结
|
||
|
||
### 核心问题
|
||
|
||
**Klipper限制合成速度,OrcaSlicer检查分量速度** - 这是根本性的差异!
|
||
|
||
### 实用建议
|
||
|
||
1. **使用保守配置**(X/Y都设为500)
|
||
2. **接受轻微偏差**(高速对角线可能高估<10%)
|
||
3. **Z轴精确匹配**(30 mm/s)
|
||
4. **大部分打印任务**影响很小(<5%偏差)
|
||
|
||
### 你的发现很重要
|
||
|
||
这个问题影响所有使用Klipper的OrcaSlicer用户!
|
||
- 大部分情况下影响不大
|
||
- 但对于高速、多对角线的打印会有偏差
|
||
- 长期应该在OrcaSlicer中添加Klipper风格的速度限制检查
|
||
|
||
---
|
||
|
||
**感谢你分享这个真实配置!** 它完美地说明了Klipper和Marlin在速度限制设计上的根本差异。
|