571 lines
11 KiB
Markdown
571 lines
11 KiB
Markdown
|
|
# 汽车数字孪生系统
|
|||
|
|
|
|||
|
|
主控程序和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 | 夜间 |
|