Files
TurboSu/docs/F1_DATA_FORMAT.md
T

319 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 🏎️ F1 24 UDP Telemetry 规范总览
### 📌 官方文档
- **官方规范 Word 文档**[EA Forums — Data Output from F1 24 v27.2x.docx](https://forums.ea.com/t5/s/tghpe58374/attachments/tghpe58374/f1-24-general-discussion-en/4624/1/Data%20Output%20from%20F1%2024%20v27.2x.docx)
- **GitHub 开源解析库参考**https://github.com/MacManley/f1-24-udp
---
## ⚙️ 游戏设置
在游戏中启用 UDP 遥测:**Game Options → Settings → Telemetry Settings**
| 设置项 | 推荐值 |
|---|---|
| `UDP Telemetry` | On |
| `UDP Broadcast Mode` | Off(多设备时可开启) |
| `UDP IP Address` | 接收端 IP(本机用 `127.0.0.1` |
| `Port` | `20777`(默认) |
| `UDP Send Rate` | `20Hz`(默认,最高 60Hz |
| `UDP Format` | `2024` |
> ⚠️ 注意:游戏仅在玩家进入 **计时圈(timed lap)** 后才开始发送有效遥测数据。
---
## 📦 数据编码
- **字节序**Little Endian
- **对齐**packed(无填充)
- **最大车辆数**22
### 数据类型
| 类型 | 说明 |
|---|---|
| `uint8` / `int8` | 无符号/有符号 8-bit |
| `uint16` / `int16` | 无符号/有符号 16-bit |
| `uint32` | 无符号 32-bit |
| `uint64` | 无符号 64-bit |
| `float` | 32-bit 浮点 |
---
## 📋 包头结构(PacketHeader
**大小:29 bytes**
```c
struct PacketHeader {
uint16 m_packetFormat; // 2024
uint8 m_gameYear; // 年份后两位,如 24
uint8 m_gameMajorVersion; // 主版本号 "X.00"
uint8 m_gameMinorVersion; // 次版本号 "1.XX"
uint8 m_packetVersion; // 包类型版本号,从 1 开始
uint8 m_packetId; // 包类型 ID(见下表)
uint64 m_sessionUID; // 会话唯一 ID
float m_sessionTime; // 会话时间戳
uint32 m_frameIdentifier; // 帧标识符
uint32 m_overallFrameIdentifier; // 全局帧标识符(Flashback 不回退)
uint8 m_playerCarIndex; // 玩家车辆索引
uint8 m_secondaryPlayerCarIndex; // 分屏第二玩家索引(255 = 无)
};
```
---
## 🆔 包类型 ID 汇总
| ID | 包名称 | 说明 | 频率 | 大小 |
|---|---|---|---|---|
| 0 | **Motion** | 所有车辆物理运动数据 | 菜单设定频率 | 1349 B |
| 1 | **Session** | 会话信息(赛道、剩余时间) | 2/秒 | 753 B |
| 2 | **Lap Data** | 所有车辆圈速数据 | 菜单设定频率 | 1285 B |
| 3 | **Event** | 会话事件 | 事件触发时 | 45 B |
| 4 | **Participants** | 参与者列表 | 每 5 秒 | 1350 B |
| 5 | **Car Setups** | 车辆调校参数 | 2/秒 | 1133 B |
| 6 | **Car Telemetry** | 遥测数据(速度/油门/DRS等) | 菜单设定频率 | 1352 B |
| 7 | **Car Status** | 车辆状态(燃油/ERS等) | 菜单设定频率 | 1239 B |
| 8 | **Final Classification** | 最终排名 | 结果界面每 5 秒 | 1020 B |
| 9 | **Lobby Info** | 多人游戏大厅信息 | 大厅中 2/秒 | 1306 B |
| 10 | **Car Damage** | 车辆损伤数据 | 10/秒 | 953 B |
| 11 | **Session History** | 圈速和轮胎历史 | 20/秒(轮询车辆) | 1460 B |
| 12 | **Tyre Sets** | 轮胎组详细数据 | 2/秒 | 231 B |
| 13 | **Motion Ex** | 玩家车辆扩展运动数据 | 菜单设定频率 | 237 B |
| 14 | **Time Trial** | 计时赛专用数据 | 1/秒(仅TT | 101 B |
---
## 🔍 各包数据结构详解
### 1. Motion PacketID=0
包含所有 22 辆车的物理数据。
```c
struct CarMotionData {
float m_worldPositionX, m_worldPositionY, m_worldPositionZ; // 世界位置 (m)
float m_worldVelocityX, m_worldVelocityY, m_worldVelocityZ; // 世界速度 (m/s)
int16 m_worldForwardDirX, m_worldForwardDirY, m_worldForwardDirZ; // 前向向量(÷32767 归一化)
int16 m_worldRightDirX, m_worldRightDirY, m_worldRightDirZ; // 右向向量
float m_gForceLateral, m_gForceLongitudinal, m_gForceVertical; // G 力分量
float m_yaw, m_pitch, m_roll; // 角度 (rad)
};
// PacketMotionData: PacketHeader + CarMotionData[22]
```
---
### 2. Session PacketID=1
包含当前会话完整信息,如天气、温度、赛道、规则、辅助设置等。
关键字段:
- `m_weather`: 0=晴, 1=少云, 2=阴, 3=小雨, 4=大雨, 5=暴雨
- `m_trackId`: 赛道 ID-1=未知,见附录)
- `m_sessionType`: 会话类型
- `m_formula`: 0=F1 Modern, 1=F1 Classic, 2=F2, 3=F1 Generic, 4=Beta, 6=Esports, 8=F1 World, 9=F1 Elimination
- `m_safetyCarStatus`: 0=无, 1=实体安全车, 2=虚拟安全车, 3=编队圈
- `m_weatherForecastSamples[64]`: 天气预测(最多 64 样本,适配冲刺赛周末)
- `m_weekendStructure[12]`: 周末赛程结构
- `m_sector2LapDistanceStart` / `m_sector3LapDistanceStart`: 赛段起点距离
---
### 3. Lap Data PacketID=2
```c
struct LapData {
uint32 m_lastLapTimeInMS; // 上一圈时间 (ms)
uint32 m_currentLapTimeInMS; // 当前圈耗时 (ms)
uint16 m_sector1TimeMSPart; // S1 毫秒部分
uint8 m_sector1TimeMinutesPart; // S1 分钟部分
uint16 m_sector2TimeMSPart; // S2 毫秒部分
uint8 m_sector2TimeMinutesPart; // S2 分钟部分
uint16 m_deltaToCarInFrontMSPart; // 与前车差距毫秒
uint8 m_deltaToCarInFrontMinutesPart; // 与前车差距分钟
uint16 m_deltaToRaceLeaderMSPart; // 与领跑者差距毫秒
uint8 m_deltaToRaceLeaderMinutesPart; // 与领跑者差距分钟
float m_lapDistance; // 当前圈已跑距离 (m)
float m_totalDistance; // 总行驶距离 (m)
float m_safetyCarDelta; // 安全车时间差 (s)
uint8 m_carPosition; // 赛道排名
uint8 m_currentLapNum; // 当前圈数
uint8 m_pitStatus; // 0=无, 1=进站中, 2=维修区
uint8 m_numPitStops; // 已进站次数
uint8 m_sector; // 0=S1, 1=S2, 2=S3
uint8 m_currentLapInvalid; // 0=有效, 1=无效
uint8 m_penalties; // 累计罚时 (s)
uint8 m_driverStatus; // 0=车库, 1=飞行圈, 2=回场圈, 3=出场圈, 4=赛道上
uint8 m_resultStatus; // 0-7 (invalid/active/finished/DNF/DSQ等)
float m_speedTrapFastestSpeed; // 速度陷阱最快速度 (km/h)
// ... 等
};
```
---
### 4. Event PacketID=3
事件代码:
| 代码 | 事件 | 代码 | 事件 |
|---|---|---|---|
| `SSTA` | 会话开始 | `SEND` | 会话结束 |
| `FTLP` | 最快圈速 | `RTMT` | 退赛 |
| `DRSE` | DRS 启用 | `DRSD` | DRS 禁用 |
| `TMPT` | 队友进站 | `CHQF` | 方格旗 |
| `RCWN` | 冠军产生 | `PENA` | 处罚发出 |
| `SPTP` | 速度陷阱触发 | `STLG` | 发车灯 |
| `LGOT` | 灯灭起跑 | `DTSV` | Drive-through 已执行 |
| `SGSV` | Stop-Go 已执行 | `FLBK` | Flashback |
| `BUTN` | 按钮状态 | `RDFL` | 红旗 |
| `OVTK` | 超车 | `SCAR` | 安全车事件 |
| `COLL` | 碰撞事件 | | |
---
### 5. Car Telemetry PacketID=6
```c
struct CarTelemetryData {
uint16 m_speed; // 速度 (km/h)
float m_throttle; // 油门 (0.0~1.0)
float m_steer; // 转向 (-1.0~1.0)
float m_brake; // 刹车 (0.0~1.0)
uint8 m_clutch; // 离合 (0~100)
int8 m_gear; // 档位 (1-8, N=0, R=-1)
uint16 m_engineRPM; // 引擎转速
uint8 m_drs; // DRS: 0=关, 1=开
uint8 m_revLightsPercent; // 转速灯百分比
uint16 m_revLightsBitValue; // 转速灯位值
uint16 m_brakesTemperature[4]; // 刹车温度 (°C)
uint8 m_tyresSurfaceTemperature[4]; // 胎面温度 (°C)
uint8 m_tyresInnerTemperature[4]; // 胎内温度 (°C)
uint16 m_engineTemperature; // 引擎温度 (°C)
float m_tyresPressure[4]; // 胎压 (PSI)
uint8 m_surfaceType[4]; // 路面类型
};
```
---
### 6. Car Status PacketID=7
```c
struct CarStatusData {
uint8 m_tractionControl; // 0=关, 1=中, 2=全
uint8 m_antiLockBrakes; // 0=关, 1=开
uint8 m_fuelMix; // 0=Lean, 1=Standard, 2=Rich, 3=Max
uint8 m_frontBrakeBias; // 前刹车比 (%)
float m_fuelInTank; // 燃油量 (kg)
float m_fuelCapacity; // 油箱容量
float m_fuelRemainingLaps; // 剩余油量可跑圈数
uint8 m_drsAllowed; // DRS 是否允许
uint16 m_drsActivationDistance; // DRS 激活距离 (m)
uint8 m_actualTyreCompound; // 实际轮胎配方 (16=C5, 17=C4, 18=C3, 19=C2, 20=C1, 21=C0, 7=半雨, 8=全雨)
uint8 m_visualTyreCompound; // 视觉轮胎配方 (16=软, 17=中, 18=硬)
uint8 m_tyresAgeLaps; // 轮胎使用圈数
int8 m_vehicleFiaFlags; // FIA 旗帜 (-1=未知, 0=无, 1=绿, 2=蓝, 3=黄)
float m_enginePowerICE; // 内燃机功率 (W)
float m_enginePowerMGUK; // MGU-K 功率 (W)
float m_ersStoreEnergy; // ERS 储能 (J)
uint8 m_ersDeployMode; // 0=无, 1=Medium, 2=Hotlap, 3=Overtake
float m_ersHarvestedThisLapMGUK; // MGU-K 回收能量
float m_ersHarvestedThisLapMGUH; // MGU-H 回收能量
float m_ersDeployedThisLap; // 已使用 ERS 能量
};
```
---
### 7. Car Damage PacketID=10
```c
struct CarDamageData {
float m_tyresWear[4]; // 轮胎磨损 (%)
uint8 m_tyresDamage[4]; // 轮胎损伤 (%)
uint8 m_brakesDamage[4]; // 刹车损伤 (%)
uint8 m_frontLeftWingDamage; // 前左翼损伤 (%)
uint8 m_frontRightWingDamage; // 前右翼损伤 (%)
uint8 m_rearWingDamage; // 尾翼损伤 (%)
uint8 m_floorDamage; // 底板损伤 (%)
uint8 m_diffuserDamage; // 扩散器损伤 (%)
uint8 m_sidepodDamage; // 侧箱损伤 (%)
uint8 m_drsFault; // DRS 故障 (0/1)
uint8 m_ersFault; // ERS 故障 (0/1)
uint8 m_gearBoxDamage; // 变速箱损伤 (%)
uint8 m_engineDamage; // 引擎损伤 (%)
uint8 m_engineMGUHWear; // MGU-H 磨损 (%)
uint8 m_engineESWear; // ES 磨损 (%)
uint8 m_engineCEWear; // CE 磨损 (%)
uint8 m_engineICEWear; // ICE 磨损 (%)
uint8 m_engineMGUKWear; // MGU-K 磨损 (%)
uint8 m_engineTCWear; // TC 磨损 (%)
uint8 m_engineBlown; // 引擎爆缸 (0/1)
uint8 m_engineSeized; // 引擎卡死 (0/1)
};
```
---
### 8. Motion Ex PacketID=13)— 运动平台关键包
专为 **运动模拟平台(D-BOX 等)** 设计,包含更多细节:
```c
float m_suspensionPosition[4]; // 悬挂位置 [RL, RR, FL, FR]
float m_suspensionVelocity[4]; // 悬挂速度
float m_suspensionAcceleration[4]; // 悬挂加速度
float m_wheelSpeed[4]; // 各轮速度
float m_wheelSlipRatio[4]; // 滑移率
float m_wheelSlipAngle[4]; // 滑移角
float m_wheelLatForce[4]; // 横向力
float m_wheelLongForce[4]; // 纵向力
float m_wheelVertForce[4]; // 垂向力
float m_heightOfCOGAboveGround; // 重心高度
float m_localVelocityX/Y/Z; // 局部速度
float m_angularVelocityX/Y/Z; // 角速度 (rad/s)
float m_angularAccelerationX/Y/Z; // 角加速度 (rad/s²)
float m_frontWheelsAngle; // 前轮转角 (rad)
float m_frontAeroHeight; // 前底盘高度
float m_rearAeroHeight; // 后底盘高度
float m_frontRollAngle; // 前悬挂侧倾角
float m_rearRollAngle; // 后悬挂侧倾角
float m_chassisYaw; // 底盘偏航角 (rad) — 可用于判断侧滑
```
---
### 9. 其余包简介
| 包 | 关键内容 |
|---|---|
| **Final Classification (8)** | 最终排名、圈数、积分、最佳圈速、轮胎使用记录 |
| **Lobby Info (9)** | 多人游戏大厅的玩家信息 |
| **Session History (11)** | 每辆车的全部圈速历史 + 轮胎使用历史(最多 100 圈) |
| **Tyre Sets (12)** | 轮胎组详情:配方、磨损度、可用性、圈速差等 |
| **Time Trial (14)** | 计时赛专属:玩家最佳、个人最佳、对手数据 |
---
## 🔒 隐私:Your Telemetry 设置
当玩家设置 `Your Telemetry = Restricted` 时,以下数据对其他玩家**归零**:
- **Car Status**:燃油、ERS 相关数据
- **Car Damage**:所有损伤数据
- **Tyre Sets**:全部轮胎组数据
---
## 🆕 F1 24 相比 F1 23 的主要变化
1. 会话包中新增模拟/规则选项
2. 新增安全车事件详情(`SCAR`
3. 大厅和参与者包中新增在线名称、Your Telemetry、F1 World Tech Level
4. 圈速包中新增与前车/领先者的分钟差距字段
5. 最终排名包改为结果界面每 5 秒重复发送
6. 新增 **Time Trial 包**ID=14
7. Motion Ex 包新增底盘高度(plank height)、悬挂侧倾角、底盘偏航角
8. 新增碰撞事件(`COLL`
9. 新增周末赛程结构(`m_weekendStructure`
10. 天气预测数组从 56 扩展到 64
11. 圈速包新增速度陷阱数据
12. Car Setup 包新增发动机制动参数 + 下次进站前翼值