# 冲浪板日志数据分析 — 电流工况 / 正态分布方案 v3.0

> 版本：v3.0 · 2026-08-20  
> 相对 v2 的核心修正：平均速度必须来自**连续航段**；高负荷 / 起飞滑行从混池中拆出；动力边界改 Top15 逐点；翼型按各自速度带；负载先标定后入样。  
> 实现：`current-distribution-analyzer/analyze_v3.py`  
> 输出：`current-distribution-analyzer/output_v3/`

---

## 一、分析目标（拆开混在一起的工况）

| 工况 | 怎么抓 | v2 问题 |
|---|---|---|
| 正常巡航 | 各速度段均值 / P50（总览表，接近真实） | 已体现 |
| 高负荷（急速 / 大载重 / 带人） | **25–35 km/h** 且电流 ≥ **该速度段均值 × 1.5**（常见到 2 倍） | 未单独捕捉，被并进全局 μ，把工况电流抬高了 |
| 起飞电流 | **0–20 km/h** 且速度在加速（ds/dt>0）的峰值电流 | 点级直接丢掉 <15，起飞被滤掉 |
| 未起飞水中滑行 | **0–20 km/h** 电流长时间大于 **20–25 km/h 均值** | 未体现 |

最终用途不变：给电池连续 / 峰值 / 起飞工况提供依据。

**工况电流不要用「全样本正态 μ」。** 总览里按速度段算的均值才接近真实巡航；全局 μ 会被高负荷尾巴拉高。

---

## 二、数据提取

### 2.1 Log 级（保留 v2 门槛）

- CSV / JSON `average_speed` **> 20 km/h**
- 航时 **20–120 min**
- 最高速 ≥ 25 km/h（粗筛未起飞）
- `deleted=0` 且 `object_key` 非空

低于 20 km/h 的平均速度 = 未起飞或新手，去掉。

### 2.2 连续航段（v3 新增，对应「平均速度应该是连续的点」）

采样约 **1 Hz**。图上的「起飞前」和「断联」不能进平均速度。

| 规则 | 默认阈值 | 含义 |
|---|---|---|
| 断联 | 相邻点 Δt **> 3 s** | 图中断联缺口 |
| 有效飞行 | speed ≥ **15 km/h** | 起飞后 |
| 掉出飞行 | speed < **10 km/h** | 速度断断续续、反复落水 |
| 最长连续飞行 | ≥ **8 min** | 一段能看的巡航 |
| **连续段平均速度** | ≥ **20 km/h** | 真正用来筛 log 的平均速度 |
| 飞行点占比 | speed≥15 的点 ≥ **50%** | 整段大部分时间在飞 |
| 断联时长占比 | ≤ **10%** | 频繁断联 = 无参考价值 |

JSON 头里的 `averageSpeed` 会掺进起飞前和断联，**只作初筛**。最终去留看连续航段平均速度。

断断续续（多次掉到 10 km/h 以下、最长连续段太短）= 新手，整条 log 丢掉。

### 2.3 点级：两套池，不要混

**巡航 / 高负荷池**（主正态）：

| 字段 | 条件 |
|---|---|
| hourSpeed | ≥ 15 km/h |
| electricCurrent | ≥ 5 A |
| batteryVoltage | ≥ 38 V |
| batteryElectricity | ≥ 10% |

**起飞 / 滑行池**（独立通道）：

- 保留 **0–20 km/h** 的点（这里**不要**再用 ≥15 一刀切掉）
- 起飞：5–20 km/h 且 ds/dt > 0.3 km/h/s → 该航次峰值电流
- 滑行：0–20 km/h 电流连续 ≥15 s 大于 20–25 km/h 均值

---

## 三、数据分析

### 3.1 巡航分布

- 先按速度段算均值（总览，含该段所有点）
- 再把 25–35 km/h 中 I ≥ 1.5× 段均值的点标成高负荷，**从巡航正态里剔除**
- 给出巡航 μ、σ、P50、P95（用于容量/连续放电，不是峰值）

### 3.2 高负荷

重点看 **25–35 km/h**：

```
threshold_1.5 = mean(I | 该速度段) × 1.5
threshold_2.0 = mean(I | 该速度段) × 2.0
```

这些过大电流 = 大载重或带人。单独出表，不要并进巡航 μ。

### 3.3 动力边界：Top 15，不用 P99 均值

v2 的 P99 在 ±5 A 窗口里取平均，覆盖太广，说明不了模组边界。

改为两张 Top 15，分别钉功率边界和速度边界：

**电流 Top 15（功率 / 放电边界）**

1. 每个航次取 **最大电流那一个点**
2. 全样本按该电流排序，取 **前 15 条**
3. 每条给出：trajectory_id、速度、电流、功率、电压、工况归属

**航速 Top 15（速度性能边界）**

1. 先丢掉 GPS 尺错误：整条 log 中位速度 ≥ 60 km/h
2. 单点速度截到 **60 km/h**；丢掉 |ds/dt| > 15 km/h/s 的单点跳变
3. **电流不取同一秒**：服务器时间戳有延迟。最高速时刻之前 **10 秒**内的 **峰值电流**（及该峰值点的电压/功率）才是这次顶速对应的电参
4. 配对后再卡物理门槛：≥45 km/h 须 ≥100 A，≥50 km/h 须 ≥130 A。不达标则丢掉该最高速、改试下一次最高速
5. 每条 log 得到一个（航速, 前 10s 峰值电流）点，再取全局前 15

### 3.4 正态图

只画**巡航点**的直方图 + 拟合曲线；高负荷点另外标注，避免把 μ 拉歪。

---

## 四、翼型组

分类思路可用，但 **K-Means 效率曲线 ≠ BOM 翼型号**。

### 4.1 要不要提供标定 log？

**要。** 请提供一批明确的测试 log：

| 必填 | 说明 |
|---|---|
| 翼型号 | 小翼 / 中翼 / 大翼（或具体零件号） |
| 测试者体重 kg | 单人；带人则两人合计 |
| trajectory_id 或 object_key | 能对上服务器日志 |

有真值后：用标定 log 固定各翼速度-电流特征，再给全样本贴标签。**没有真值之前，代码里只有速度包络代理（small/medium/large），并冻结为工作定义（见 v3 续跑）。有真值后再替换。**

### 4.2 每款翼用自己的速度带

| 翼 | 主流使用带 | 看什么 |
|---|---|---|
| 小翼 | **30–60 km/h** | 该带内速度分布、电流分布、P95/最大功率 |
| 中翼 | **20–50 km/h** | 同上 |
| 大翼 | **15–40 km/h** | 同上 |

不要三款翼都切 15–20 / 20–25… 同一套箱子。输出：主流使用速度、速度边界、功率边界。

---

## 五、负载分层

**先定义体重区间，用实测 log 当尺子，再进样本空间。** 不要先用 `I/v` 三分位假装成轻/中/重。

建议流程：

1. 标定：轻载骑手、中载骑手、重载/带人各若干条连续优质 log（翼型尽量固定）
2. 看他们在 **25–35 km/h** 的电流相对该段均值的倍数，钉死门槛（预期轻载 ≈1.0×，重载 1.5–2×）
3. 再把门槛套到全样本

在标定到来之前，**操作定义冻结**：25–35 km/h 下 `I / 该段均值`：light <1.2×，medium 1.2–1.5×，heavy ≥1.5×。不写 kg。

---

## 六、工况定义口径

| 工况 | 电流从哪来 |
|---|---|
| 巡航 | 各速度段均值 / P50（总览表） |
| 连续放电建议 | 巡航 20–30 km/h 的 P95（已剔除 1.5×） |
| 高负荷 | 25–35 km/h 且 ≥1.5× 段均值 的分布 |
| 模组峰值 | Top 15 航次最大电流（逐条速度+功率） |
| 起飞 | 0–20 加速峰值的中位 / P95 |

---

## 七、目录与命令

```
current-distribution-analyzer/
  continuity.py          # 连续航段判定
  analyze_v3.py          # v3 主入口
  output_v3/
    run_report.md
    speed_bin_overview.csv
    cruise_by_speed.csv
    high_load_25_35.csv
    top15_peak_current.csv
    top15_peak_speed.csv
    takeoff_peak_current.csv
    water_sliding_events.csv
    wing_proxy_native_band.csv
    kept_logs.csv / reject_reasons.csv
```

```bash
cd current-distribution-analyzer
python analyze_v3.py
# 使用已有 data/oss_cache，不再连 MySQL
```

---

## 八、待你们提供的标定数据

1. 小 / 中 / 大翼各若干条，带翼型号  
2. 已知体重（及是否带人）的测试 log  
3. 对上 `trajectory_id` 或 OSS 文件名  

到齐后重跑第 4、5 节，代理标签换成真值。
