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
This commit is contained in:
xiaoyeliu
2025-12-09 10:39:27 +08:00
committed by GitHub
parent f32aa81f6a
commit b43cfaaaf9
13 changed files with 4256 additions and 39 deletions

View File

@@ -0,0 +1,312 @@
# 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用户可能会发现时间估算不够准确。