冲浪板日志数据分析 — 电流工况 / 正态分布方案 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(功率 / 放电边界)
- 每个航次取 最大电流那一个点
- 全样本按该电流排序,取 前 15 条
- 每条给出:trajectory_id、速度、电流、功率、电压、工况归属
航速 Top 15(速度性能边界)
- 先丢掉 GPS 尺错误:整条 log 中位速度 ≥ 60 km/h
- 单点速度截到 60 km/h;丢掉 |ds/dt| > 15 km/h/s 的单点跳变
- 电流不取同一秒:服务器时间戳有延迟。最高速时刻之前 10 秒内的 峰值电流(及该峰值点的电压/功率)才是这次顶速对应的电参
- 配对后再卡物理门槛:≥45 km/h 须 ≥100 A,≥50 km/h 须 ≥130 A。不达标则丢掉该最高速、改试下一次最高速
- 每条 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 三分位假装成轻/中/重。
建议流程:
- 标定:轻载骑手、中载骑手、重载/带人各若干条连续优质 log(翼型尽量固定)
- 看他们在 25–35 km/h 的电流相对该段均值的倍数,钉死门槛(预期轻载 ≈1.0×,重载 1.5–2×)
- 再把门槛套到全样本
在标定到来之前,操作定义冻结: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
cd current-distribution-analyzer
python analyze_v3.py
# 使用已有 data/oss_cache,不再连 MySQL
八、待你们提供的标定数据
- 小 / 中 / 大翼各若干条,带翼型号
- 已知体重(及是否带人)的测试 log
- 对上
trajectory_id或 OSS 文件名
到齐后重跑第 4、5 节,代理标签换成真值。