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, 体育数据分析, 实时遥测, 异常检测, 机器学习, 逆向工具