Files
TurboSu/docs/F1_DATA_FORMAT.md
T

13 KiB
Raw Blame History

🏎️ F1 24 UDP Telemetry 规范总览

📌 官方文档


⚙️ 游戏设置

在游戏中启用 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

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 辆车的物理数据。

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

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

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

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

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 等) 设计,包含更多细节:

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 包新增发动机制动参数 + 下次进站前翼值