siddoboi/f1-telemetry-dashboard
GitHub: siddoboi/f1-telemetry-dashboard
按赛道距离对齐多车手数据的 F1 遥测分析仪表板,融合 Isolation Forest 异常检测与物理规则验证,支持历史单圈重放与实时数据流。
Stars: 0 | Forks: 0
# 🏎️ PIT WALL - F1 实时遥测与车手一致性仪表板
一个流式传输真实 Formula 1 遥测数据的全栈赛车运动分析平台 —— 通过实时 pipeline 重放历史单圈,在比赛周末呈现 OpenF1 延迟的实时数据流,或者直接从本地数据库即时读取 —— 以**按赛道距离索引**的基准圈为参照对比车手,并使用无监督的 **Isolation Forest** 标记驾驶异常(轮胎锁死、车轮打滑、油门不稳定、弯中失控),同时附带自动化文本诊断。
**技术栈:** FastAPI · WebSockets · scikit-learn · FastF1 · OpenF1 · MongoDB Time Series · React · Recharts · Vite
## 为什么用距离,而不是时间?
按流逝时间比较两圈是没有意义的——较慢的车手在相同的 `t` 时刻处于*不同的弯角*。这里的每个通道都经过了重采样,映射到统一的 5 米距离网格上,因此“VER 在 1,250 米处”和“LEC 在 1,250 米处”指的是同一段赛道。在所有地方,距离都是 X 轴:图表、异常事件、缩放、赛道地图。
## 架构
```
FastF1 (historical) OpenF1 (live, ~30 s delay) MongoDB (saved laps)
│ │ │
▼ ▼ ▼
Distance-grid alignment Polling client + history_serve.py
(5 m steps, brake distance integration (re-serve, no FastF1)
normalisation, GPS) │ │
│ │ │
▼ ▼ ▼
Isolation Forest fitted Incremental physics Stored scores re-used,
on baseline lap + rules (no baseline events re-extracted
physics-rule validation exists mid-session)
└──────────────┬───────────┴────────────────────────────┘
▼
Replay engine (10 Hz, pause/speed) → FastAPI WebSocket
▼
React dashboard: Telemetry · Track Map · Session · History
```
## 功能
**遥测分析**
- 最多可同时比较 **5 名车手**,按距离同步
- 通道视图:速度 · 油门 · 刹车 · RPM · 档位 · DRS
- **STACKED**(车手叠加) / **SEPARATE**(每位车手单独一个图表)切换
- 基准模式:**Session optimal** · **Personal best** · **Off**(仅基于规则的异常)
- 视频编辑软件级的**时间轴缩放**:缩略图拖动条 + Ctrl+滚动,所有图表间同步
**ML 异常引擎**
- 在基准单圈上训练 Isolation Forest,基于 baseline-delta + 导数特征对比较圈进行评分
- 对照四条独立的物理规则(锁死、打滑、油门震荡、突然松油门)进行验证 - UI 中会显示一致性指标
- 跨越 30 米合并异常片段,随后进行毛刺过滤;事件携带程序化生成的文本诊断
- 基于真实数据(2024 巴林大奖赛排位赛,VER 对比 LEC)完成调优
**视图**
- **Track Map** - 基于基准 GPS 生成的 SVG 赛道图;每位车手的圆点在其*自身*的 GPS 位置上移动;异常标记可点击
- **Session** - 单圈用时进展图表 + 可点击的胶片条;点击任意单圈可使用该圈重新加载重放
- **History** - 每次完成的重放都会持久化到 MongoDB 时间序列集合中;最多可选择 5 条保存的单圈,并**即时、离线、无需 FastF1** 地重放
- **Driver profile overlay** - 悬停在车手标签上:头像、发车位/完赛位、最快单圈、最高速度、进站次数
- **Live mode** - *此构建版本中未启用。* OpenF1 的实时数据流需要付费的 Sponsor 订阅,并且仅在比赛周末处于活动状态。架构已对其提供支持;免费层级仅限于历史数据。OpenF1 仍被(免费)用于获取车手头像。
## 快速开始
前置条件:**Python 3.11+**、**Node.js 18+**,可选 **MongoDB Community**(没有它应用也能运行;但会失去单圈持久化功能)。针对 Windows / macOS / Linux 的完整从零开始安装说明请见 [`docs/SETUP.md`](docs/SETUP.md)。
```
# Backend (终端 1)
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Frontend (终端 2)
cd frontend
npm install
npm run dev # → http://localhost:5173
```
首次加载会话将从 F1 的服务器下载遥测数据(2-10 分钟),之后会被缓存在 `backend/ff1_cache/` 中。请在演示前提前预热缓存。
**首次运行:** 赛季 `2024` → `R1 Bahrain` → `Q` → 选择 `VER` + `LEC` → 基准设为 `Session optimal` → **Start replay**。
## 检测调优(在真实数据上验证)
| 参数 | 数值 | 原因 |
|---|---|---|
| `ANOMALY_THRESHOLD` | 0.72 | 在 2024 巴林 Q 上校准;0.65 会导致标记过度 |
| `THROTTLE_OSC_STD` | 38.0 | 16.0 会在正常的驾驶风格差异下触发 |
| 刹车通道 | 归一化 0/1 → 0–100 % | FastF1 在某些会话中返回布尔值的刹车数据 |
| 事件合并 | 30 米间隔,在毛刺过滤**之前**合并 | 挽救碎片化的真实事件 |
在 VER 对比 LEC(巴林 Q)上的结果:16 个合并事件,注入故障的合成测试均通过,7.4% 的帧被标记。
## 测试
```
cd backend
pip install -r requirements-dev.txt
pytest -m "not slow" # fast suite: 25 tests, offline, ~7 s
pytest -m slow # real-data validation vs 2024 Bahrain Q (downloads)
```
涵盖四条物理规则、针对注入故障的 Isolation Forest pipeline、历史数据重发逻辑以及重放引擎行为。该测试套件在其自身构建过程中捕获了一个真实的 bug:对于中心差分梯度而言,打滑规则中的换挡豁免范围窄了一步。
## 诚实的局限性
- **目前公开的源中不存在真正的实时数据流。** 重放模式是“通过实时架构呈现历史数据”;直播模式则是 OpenF1 延迟约 30 秒的数据流。
- 直播模式仅使用物理规则进行评分 - Isolation Forest 需要一条基准圈,而在会话进行期间这并不存在。
- 历史模式:无赛道地图(GPS 未被持久化),基准 = 所选最快圈,车手档案/会话视图需要 FastF1 context。
- 赛道地图异常标记位于基准行车线上。
## 项目结构
```
backend/app/
├── main.py REST + WebSocket (replay · live · history)
├── config.py all tunables, env-overridable
├── data/ fastf1_loader · openf1_client · database · team_colors
├── ml/ anomaly_detector (IF) · physics_rules (validation)
└── replay/ replay_engine (10 Hz) · history_serve (Mongo)
frontend/src/
├── App.jsx state, tabs, zoom domain, overlays
├── api/client.js REST + WebSocket client
└── components/ TelemetryView · TrackMapView · SessionView ·
HistoryView · Minimap · ControlPanel · NavBar ·
ProfileOverlay · AnomalySidebar · TelemetryCharts
```
## 路线图
- [x] 阶段 1 - 重放 pipeline、Isolation Forest、同步图表、事件日志
- [x] 阶段 2 - 5 名车手、导航标签、缩放缩略图、赛道地图、直播模式
- [x] 阶段 2.5 - 会话时间轴、车手档案叠加层、每位车手 GPS、关闭基准、真实数据调优
- [x] 阶段 3 - 从 MongoDB 即时重新读取历史记录
- [x] Delta-time 图表(沿着距离展示相对于基准的赢得/损失时间)
- [x] 导出:CSV 包 + 包含按事件统计通道数据的多页 PDF 单圈报告
- [x] 错误记录与调试基础设施(循环文件日志、异常处理程序、React 错误边界)
- [ ] 弯角分割:针对单个弯角的异常报告
- [ ] Mongo schema v2:持久化 GPS + 事件 + 基准
- [ ] 性能优化专项(性能分析优先)
- [ ] 第二种 ML 方法(DTW / autoencoder)对比 Isolation Forest - 研究课题
- [ ] 云端部署:容器化后端、静态前端、MongoDB Atlas
## 免责声明
非官方项目 - 与 Formula 1、FIA 或任何车队无关。通过开源项目 [FastF1](https://github.com/theOehrly/Fast-F1) 和 [OpenF1](https://openf1.org) 获取数据,仅供教育使用。F1® 是 Formula One Licensing B.V. 的商标。
## 许可证
[MIT](LICENSE)
标签:Apex, AV绕过, FastAPI, React, Syscalls, 体育数据分析, 实时遥测, 异常检测, 机器学习, 逆向工具