SmartEDT/汽车数字孪生系统_数据交互协议.md

571 lines
11 KiB
Markdown
Raw Normal View History

# 汽车数字孪生系统
主控程序和Unity数据交互协议文档
# 一、系统交互
系统由两台独立主机组成:
• 主控程序(负责传感器数据采集、系统控制、数据记录存储等)
• Unity数字孪生负责三维场景渲染、运动计算、视频录制
数据流向:
| | | | |
| --- | --- | --- | --- |
| **数据类型** | **方向** | **频率** | **说明** |
| InitConfig | 主控 → Unity | 1次/任务 | 初始化车辆、驾驶员、场景配置 |
| Command | 主控 → Unity | 低频 | 开始/停止/暂停等控制指令 |
| DriveData | 主控 → Unity | 50Hz | 传感器数据驱动虚拟车运动 |
| FrameRecord | Unity → 主控 | 50Hz | 车辆位置记录用于回放 |
| Status | Unity → 主控 | 按需 | Unity运行状态反馈 |
# 二、InitConfig - 初始化配置
方向:主控 → Unity
频率:任务开始时发送 1 次
用途:配置车辆信息、驾驶员信息、场景参数、录制设置
{
"msgType": "init", // 消息类型:初始化配置
"timestamp": 1737388800000, // 发送时间戳
"session": { // ===== 会话信息 =====
"sessionId": "sess\_20250120\_143000\_001", // 会话唯一ID
"taskId": "task\_brake\_001", // 任务ID
"taskName": "紧急制动测试", // 任务名称(显示用)
"createTime": "2025-01-20 14:30:00", // 创建时间(可读格式)
"syncTimestamp": 1737388800000 // 同步基准时间戳(数据/视频对齐用)
},
"driver": { // ===== 驾驶员信息 =====
"driverId": "D20250001", // 驾驶员编号
"name": "张三", // 驾驶员姓名
"department": "培训一部", // 所属部门
"level": "初级学员", // 学员等级/身份
"avatar": "" // 头像URL或预制
},
"vehicle": { // ===== 车辆配置 =====
"vehicleId": "V003", // 车辆编号
"model": "改装教学车A型", // 车型名称
"plateNo": "沪A·12345", // 车牌号
"color": "#FFFFFF", // 车身颜色(十六进制)
"colorName": "珍珠白" // 颜色名称(显示用)
},
"scene": { // ===== 场景配置 =====
"sceneId": "scene\_03", // 场景ID
"sceneName": "城市道路", // 场景名称
"sceneFile": "CityRoad", // Unity场景文件名
"weather": "sunny", // 天气sunny/rain/fog/night
"spawnPoint": "SpawnPoint\_A", // 出生点预制体名称
"hasGpsMapping": true // 该场景是否有GPS坐标映射
},
"recording": { // ===== 录制设置 =====
"enabled": true, // 是否启用录制
"recordId": "rec\_20250120\_143000\_001", // 录制ID与视频文件关联
"frameRate": 50, // 数据录制帧率
"videoFrameRate": 30, // 视频录制帧率
"videoResolution": "1280x720" // 视频分辨率
},
"vehicleParams": { // ===== 车辆物理参数 =====
"wheelRadius": 0.32, // 轮胎半径(米)
"steeringRatio": 15.5, // 方向盘转向比
"wheelbase": 2.68 // 轴距(米)
}
}
# 三、Command - 控制指令
方向:主控 → Unity
频率:低频,人工触发时发送
用途系统控制、模式切换、回放控制、相机和UI控制
{
"msgType": "command", // 消息类型:控制指令
"timestamp": 1737388800000, // 发送时间戳
"seqId": 1, // 指令序列号(递增)
"action": "start", // ===== 主动作 =====
// start - 开始任务
// stop - 停止任务
// pause - 暂停
// resume - 恢复
// reset - 重置到起点
// emergency\_stop - 紧急制动
"mode": { // ===== 模式设置(可选)=====
"type": "realtime", // realtime - 实时驱动模式
// playback - 回放模式
// standby - 待机模式
"playbackId": null // 回放模式时指定录制ID
},
"playback": { // ===== 回放控制(回放模式有效)=====
"action": "play", // play/pause/seek/setSpeed
"seekFrame": 0, // 跳转到指定帧号
"seekTime": 0.0, // 跳转到指定时间(秒)
"playSpeed": 1.0 // 播放速度倍率
},
"camera": { // ===== 相机控制(可选)=====
"viewMode": "chase", // driver - 驾驶员视角
// chase - 追尾视角
"fov": 60 // 视野角度
},
"ui": { // ===== UI控制暂定根据UI调整=====
"showDashboard": true, // 显示仪表盘
"showTelemetry": true, // 显示遥测数据面板
"showTrajectory": false, // 显示行驶轨迹线
"showMinimap": true // 显示小地图
}
}
# 四、DriveData - 实时驱动数据
方向:主控 → Unity
频率50Hz每 20ms 一帧)
用途传感器数据驱动Unity虚拟车辆运动
{
"msgType": "drive", // 消息类型:驱动数据
"ts": 1737388800123, // 时间戳(毫秒)
"seq": 50001, // 帧序列号(递增,丢帧检测用)
// ==================== 运动控制核心 ====================
"speed": 45.6, // 车速km/h
"steer": 12.5, // 方向盘角度(度)左负右正
"wheelRpm": { // 各轮转速rpm
"fl": 650.0, // 左前轮 Front-Left
"fr": 652.0, // 右前轮 Front-Right
"rl": 648.0, // 左后轮 Rear-Left
"rr": 649.0 // 右后轮 Rear-Right
},
// ==================== 踏板状态 ====================
"throttle": 0.35, // 油门/电门开度 0.0~1.0
"brake": 0.0, // 刹车开度 0.0~1.0
"handbrake": 0.0, // 手刹开度 0.0~1.0
// ==================== 传动系统 ====================
"gear": 3, // 挡位:-1倒挡/0空挡/1~N前进挡
"engine": { // 发动机/电机数据(可选)
"rpm": 2800, // 转速rpm可选
"torque": 180.5 // 输出扭矩N·m可选
},
// ==================== IMU数据可选====================
"imu": { // 惯性测量单元
"ax": 0.15, // X轴加速度m/s²纵向
"ay": -0.02, // Y轴加速度m/s²垂直
"az": 0.05, // Z轴加速度m/s²横向
"gx": 0.01, // X轴角速度rad/s俯仰
"gy": 0.005, // Y轴角速度rad/s横滚
"gz": 0.12 // Z轴角速度rad/s偏航
},
// ==================== 车灯状态 ====================
"lights": { // 车灯
"head": 1, // 大灯0关/1近光/2远光
"turn": 0, // 转向灯0关/1左/2右/3双闪
"brake": false, // 刹车灯
"reverse": false, // 倒车灯
"fog": false // 雾灯
},
// ==================== 其他状态 ====================
"misc": { // 其他
"horn": false, // 喇叭
"wiper": 0, // 雨刷0关/1低速/2高速
"seatbelt": true // 安全带是否系好
}
}
# 五、FrameRecord - 帧记录数据
方向Unity → 主控
频率50Hz每 20ms 一帧)
用途记录Unity计算的车辆绝对位置用于精确回放
{
"msgType": "frame", // 消息类型:帧记录
"ts": 1737388800123, // 时间戳(毫秒)
"seq": 50001, // 帧序列号与DriveData对应
"elapsed": 100.02, // 相对任务开始的时间(秒)
// ==================== 车辆位置Unity世界坐标====================
"pos": { // 位置
"x": 1250.35, // X坐标
"y": 0.42, // Y坐标/高度(米)
"z": 3560.78 // Z坐标
},
// ==================== 车辆旋转 ====================
"rot": { // 旋转(四元数)程序用
"x": 0.0,
"y": 0.383,
"z": 0.0,
"w": 0.924
},
"euler": { // 旋转(欧拉角,度)便于查看
"pitch": 0.5, // 俯仰角(抬头为正)
"yaw": 45.2, // 偏航角/航向(顺时针为正)
"roll": -0.1 // 横滚角(右倾为正)
},
// ==================== 速度向量 ====================
"vel": { // 速度
"x": 32.1, // X方向速度m/s
"y": 0.0, // Y方向速度m/s
"z": 31.8, // Z方向速度m/s
"speed": 45.2 // 合速度km/h
},
// ==================== 车轮状态(视觉还原用)====================
"wheels": { // 车轮
"steerAngle": 12.5, // 前轮实际转向角(度)
"fl": { // 左前轮
"rot": 1250.6, // 累计旋转角度(度)
"susp": 0.05 // 悬挂压缩量(米)
},
"fr": { // 右前轮
"rot": 1252.1,
"susp": 0.04
},
"rl": { // 左后轮
"rot": 1248.3,
"susp": 0.03
},
"rr": { // 右后轮
"rot": 1249.0,
"susp": 0.03
}
},
// ==================== 视觉状态 ====================
"visual": { // 视觉状态
"gear": 3, // 挡位显示
"steerWheel": 45.0, // 方向盘角度(内饰视角用)
"speedometer": 45.6, // 速度表读数
"tachometer": 2800, // 转速表读数
"lights": { // 车灯状态
"head": 1,
"turn": 0,
"brake": false,
"reverse": false
}
},
// ==================== GPS显示数据学校场景用 ====================
"gps": { // GPS坐标从Unity坐标换算
"valid": true, // 该场景是否有GPS映射
"lat": 31.230416, // 纬度
"lng": 121.473701, // 经度
"alt": 4.5, // 海拔(米)
"heading": 45.2 // GPS航向
}
}
# 六、Status - Unity状态反馈
方向Unity → 主控
频率:状态变化时发送,或主控查询时响应
用途反馈Unity运行状态、性能指标、错误信息
{
"msgType": "status", // 消息类型:状态反馈
"ts": 1737388800000, // 时间戳
"state": "running", // ===== Unity当前状态 =====
// loading - 加载场景中
// ready - 就绪,等待开始
// running - 任务运行中
// paused - 已暂停
// stopped - 已停止
// playback - 回放中
// error - 出错
"scene": { // ===== 场景状态 =====
"loaded": true, // 场景是否加载完成
"sceneId": "scene\_03", // 当前场景ID
"spawnPointFound": true // 出生点预制体是否找到
},
"recording": { // ===== 录制状态 =====
"isRecording": true, // 是否正在录制
"recordId": "rec\_20250120\_143000\_001", // 当前录制ID
"frameCount": 15000, // 已录制帧数
"duration": 300.0 // 已录制时长(秒)
},
"performance": { // ===== 性能指标 =====
"fps": 58, // 当前帧率
"renderTime": 12.5, // 渲染耗时ms
"physicsTime": 2.3, // 物理计算耗时ms
"encodeTime": 8.2 // 视频编码耗时ms
},
"connection": { // ===== 连接状态 =====
"lastDriveDataSeq": 50001, // 最后收到的DriveData序列号
"lastDriveDataTime": 1737388800123, // 最后收到DriveData的时间
"dataLossCount": 0 // 累计丢帧数
},
"error": { // ===== 错误信息 =====
"code": 0, // 错误码0表示无错误
"message": "" // 错误描述
}
}
# 状态汇总:
## 车灯状态
| | | |
| --- | --- | --- |
| **字段** | **值** | **说明** |
| head | 0 / 1 / 2 | 大灯:关 / 近光 / 远光 |
| turn | 0 / 1 / 2 / 3 | 转向灯:关 / 左 / 右 / 双闪 |
| wiper | 0 / 1 / 2 | 雨刷:关 / 低速 / 高速 |
| gear | -1 / 0 / 1~N | 挡位:倒挡 / 空挡(N/P) / 前进挡 |
## Unity状态
| | |
| --- | --- |
| **state值** | **说明** |
| loading | 加载场景中 |
| ready | 就绪,等待开始指令 |
| running | 任务运行中(实时模式) |
| paused | 已暂停 |
| stopped | 已停止 |
| playback | 回放模式运行中 |
| error | 发生错误 |
## 天气
| | |
| --- | --- |
| **weather值** | **说明** |
| sunny | 晴天 |
| rain | 雨天 |
| fog | 雾天 |
| night | 夜间 |