SmartEDT/系统开发技术方案.md

417 lines
20 KiB
Markdown
Raw Permalink 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.

# 智能电动汽车数字孪生系统开发技术方案V1
智能电动车数字孪生系统软件通过集成高精度数据采集、实时同步控制、三维虚拟仿真、智能算法验证与系统运维管理等功能,构建了一个覆盖教学、科研与产业应用的智能电动汽车虚实融合实验平台。它不仅能实现真实驾驶环境的沉浸式再现与数据级同步,还能为科研人员提供精准可追溯的数据支持、灵活的算法验证接口和可扩展的数据分析工具,充分满足智能电动汽车领域对实验真实性、可靠性与创新性的高标准要求,推动智能驾驶与数字孪生技术的深度融合与发展。
本文基于《智能电动车数字孪生系统功能规划2026》的目标给出一套可落地的软件开发技术方案。Unity 三维驾驶仿真作为独立工程(独立代码库与发布包),通过标准接口与本系统对接。
## 1. 建设目标与原则
### 1.1 建设目标
- 实现多源设备数据采集、统一管理与实时可视化展示
- 构建“实体车—数字孪生体”数据交互:状态同步、数据采集、事件回放
- 支撑多场景驾驶仿真联动Unity 独立运行),实现同屏/多屏展示与协同操作
- 实现实验管理与记录:仿真记录创建、过程记录、视频录制、数据持久化、历史回放
- 本地化部署与数据安全:本地存储、最小暴露接口、路径越界防护
### 1.2 设计原则
- 分层解耦:设备接入、业务编排、数据服务、可视化展示相互独立
- 实时优先:以事件/流式数据驱动为核心WebSocket + HTTP
- 可扩展设备类型、消息类型、算法模块、Unity 场景可插拔扩展
- 可运维:统一配置、日志、诊断接口、打包发布与自动启动链路
## 2. 总体架构
### 2.1 架构分解
系统由三类可独立发布、独立升级的可执行程序组成:
1) **后端数据与控制服务Python EXE**
- 负责设备采集、数据处理、仿真记录管理、持久化、文件存储、对外 API
- 对前端提供 HTTP REST + WebSocket实时推送
- 对 Unity 提供联动接口(可选双向:状态推送/指令下发)
2) **桌面端可视化应用Electron + Vue EXE**
- 负责 UI 展示、实验流程操作、多屏组织、外部程序(后端/Unity启动与守护
- 作为“应用入口”,统一呈现与统一运维
3) **车辆驾驶仿真Unity EXE外部项目**
- 负责 3D 场景、动力学/视觉化仿真、互动控制
- 与后端通过约定协议交换数据HTTP/WebSocket/本地端口均可)
### 2.2 数据流与控制流
- **采集流**:设备/传感器 → 设备接入层 → 统一事件总线 → 处理/校准 → 入库/落盘 → WebSocket 推送
- **控制流**:前端操作 → REST 指令 → 业务编排 → 下发到设备/控制柜,或同步给 Unity
- **回放流**:历史仿真记录 → 查询元数据(数据库)→ 拉取文件(静态映射)→ 前端播放/曲线回放,或驱动 Unity 回放
### 2.3 系统两大部分划分
系统整体可分为两大部分(对应团队分工与发布包边界):
1) **数据采集与处理(后端)**
- 采集:方向盘/踏板/档位/手刹/车速轮速/灯光/电参/温度等
- 处理:滤波、校准、融合、异常检测、指标计算
- 管理:仿真记录、文件、数据库、权限(可选)
- 服务REST + WebSocket + 静态文件映射
2) **界面显示与交互Electron + Vue**
- 显示大屏:系统介绍、仿真监控、数据看板
- 车载屏(驾驶员):驾驶视角信息与仪表盘
- 控制屏:场景配置、系统配置、用户/权限、数据查询、数据分析
### 2.4 推荐工程目录结构(本仓库)
建议把“后端服务”和“前端桌面端”放在同一仓库便于协同开发Unity 工程保持外部独立仓库,仅提交接口文档与发布包获取方式。
```
SmartEDT/
backend/ # Python采集/处理/管理/API
device/ # 传感器设备接入与驱动(方向盘/踏板/灯光/电参等)
database/ # 数据存储PostgreSQL/TimescaleDB与数据访问层
config/ # 配置ini/环境变量)与配置加载
main.py # 后端入口(启动 API/WS、初始化各模块
utils.py # 通用工具(时间/路径/校验/日志等)
frontend/ # Electron + Vue桌面端与多屏展示
src/ # Vue 渲染进程(页面/组件/路由)
main/ # Electron 主进程(多窗口、多屏、拉起后端/Unity
(配置文件) # package.json / vite.config.* / electron-builder 配置等
docs/ # 方案、接口协议、运维文档
data/ # 默认数据目录(开发态可用)
release/ # 可选:打包产物临时输出目录(不提交版本库)
```
## 3. 技术选型与理由
### 3.1 后端Python
- **语言**Python 3.13.1(配合硬件 SDK、算法生态与快速迭代
- **Web 框架**FastAPI异步友好、类型约束清晰、OpenAPI 自动生成)
- **实时通讯**WebSocketFastAPI 原生或 Starlette WebSocket用于状态/传感数据/事件推送
- **进程内并发**asyncio + 线程池/进程池(适配阻塞型硬件 SDK
- **持久化**PostgreSQL18 + TimescaleDB用于实时采集数据的时序存储+ SQLAlchemyORM/迁移支持)
- **文件存储**:本地文件系统(与数据库元数据关联)
- **打包**PyInstaller 打包为独立 EXE开发环境使用 venv 隔离依赖
### 3.2 前端Electron + Vue
- **UI 框架**Vue 3 + Vite开发体验与生态成熟
- **桌面封装**Electron多窗口、多屏支持、可管理外部进程
- **本地通信**HTTP + WebSocket 访问后端;可选 IPC主进程与渲染进程
- **打包**electron-builder 产出 Windows EXE 安装包/绿色包
### 3.3 Unity外部
- **三维仿真**Unity高效构建交互式驾驶场景与渲染
- **对接方式**:建议 WebSocket低延迟实时同步+ HTTP配置、仿真记录、资源拉取
- **进程管理**:由 Electron 主进程统一拉起与关闭(可在指定显示器全屏)
## 4. 后端模块设计Python
### 4.1 模块划分
- **配置中心Config**
- 统一读取 `config.ini`(就近优先原则:后端目录优先,其次项目根目录)
- 管理文件根目录、数据库路径、端口、日志等级等
- **设备接入层Adapters/Drivers**
- 每类设备一个管理器相机、IMU、压力/力传感、控制柜等
- 统一生命周期init/connect/start/stop/disconnect
- 统一数据模型:采集原始数据 + 时间戳 + 设备元信息
- **设备协调器Coordinator**
- 负责多设备协同启动/停止、状态聚合、异常重连策略
- 对上提供“仿真记录级操作”,对下调度各设备管理器
- **数据处理层Pipeline**
- 校准/滤波/坐标变换/融合(按需求插拔)
- 统一输出“标准事件”,写入事件总线与持久化队列
- **仿真实验管理Simulation Experiment**
- 流程:场景配置 → 仿真启动 → 仿真执行 → 仿真结束
- **数据存储Storage**
- 元数据PostgreSQL仿真记录、设备、事件索引、文件索引
- 实时采集数据TimescaleDB Hypertable高频写入、按时间范围查询与聚合
- 典型能力:按时间分区、压缩、保留策略、连续聚合(按需要启用)
- 大文件:视频、原始采样、导出报告等存本地文件系统
- **录制与归档Recording/Archiving**
- 仿真过程视频录制:显示大屏/车载屏/Unity 画面按需求录制(目标帧率 30fps
- 录制任务与仿真记录绑定:开始/停止随仿真流程联动,支持异常中止与补偿关闭
- 文件索引入库:形成可回放、可导出的统一入口
- **对外服务API**
- REST健康检查、设备管理、仿真记录控制、数据查询、导出
- WebSocket实时推送状态、传感数据、告警、进度
- **静态文件映射File Gateway**
- 按配置的根目录对外只读映射
- 路径规范化、拒绝越界(拦截 `..`、绝对路径、UNC 路径)
### 4.2 采集数据范围与精度(本期基线)
本系统“采集与处理”侧的基线采集字段如下(用于实时显示、联动仿真与历史回放);后续可按车型/传感器扩展。
- **转向与踏板**
- 方向盘转角:左/右单位建议deg
- 刹车踏板行程mm
- 电门踏板行程mm
- **车辆状态**
- 挡位P / N / D / S
- 手刹状态手状态0 / 1
- 车速:单位建议 km/h
- 车轮转速:单位建议 rpm按轮位可扩展为 FL/FR/RL/RR
- **灯光状态**
- 左转向灯 / 右转向灯
- 双闪
- 刹车灯
- **电池与电参**
- 电池剩余电量:%
- 电压:测量误差 0.1V
- 电流:测量误差 0.1A
- 温度:测量误差 0.5℃
采集来源建议按两类接入:
- **传感器/控制柜直采**:方向盘、踏板、档位、手刹、车速/轮速、电参等(串口/CAN/以太网,取决于硬件)
- **视觉识别采集(可选)**:当部分状态仅存在于仪表或屏幕显示时,用相机 + 识别推断(需标注数据与容错策略)
### 4.3 API 设计建议(摘要)
- `GET /health`:健康检查(版本、时间、依赖状态)
- `GET /api/devices`:设备列表与状态
- `POST /api/simulation/start`:创建并启动一次三维仿真记录(返回 simulation_id
- `POST /api/simulation/{simulation_id}/stop`:结束一次三维仿真并落盘
- `GET /api/simulation/{simulation_id}`:三维仿真记录元数据
- `GET /api/simulation/{simulation_id}/events`:事件/曲线数据查询(分页/时间窗)
- `GET /files/<path>`:静态文件访问映射(对标 README 的安全校验策略)
- `WS /ws`:统一实时通道(按 topic/room 订阅)
### 4.4 实时消息模型(建议)
采用统一 JSON Envelope便于前端与 Unity 复用:
```json
{
"type": "vehicle.signal",
"ts": 1737000000.123,
"simulation_id": "SIM202601160001",
"device_id": "controlbox_01",
"seq": 1024,
"payload": {
"steering_wheel_angle_deg": 12.3,
"brake_pedal_travel_mm": 5.2,
"throttle_pedal_travel_mm": 18.0,
"gear": "D",
"handbrake": 0,
"vehicle_speed_kmh": 36.5,
"wheel_speed_rpm": { "FL": 320, "FR": 319, "RL": 318, "RR": 318 },
"lights": { "left_turn": 0, "right_turn": 1, "hazard": 0, "brake": 0 },
"soc_percent": 78.2,
"voltage_v": 356.4,
"current_a": 12.7,
"temperature_c": 28.5
}
}
```
建议补充字段:
- `source`device/backend/unity
- `quality`:丢包/校准状态/信噪比等
- `schema_version`:前后端与 Unity 协同升级
### 4.5 目录与文件存储规范(建议)
与 README 的建议一致,采用“根目录 + 仿真记录分层”的稳定结构:
```
<root>/
<subject_id>/
<simulation_id>/
meta.json
video/
signals/
exports/
```
文件根目录通过 `[FILEPATH].path` 配置;当配置为相对路径时,开发环境相对后端工作目录,打包环境相对后端 EXE 同级目录(对标 README 的路径策略)。
存储类型建议(与规划大纲一致):
- 传感器原始数据:生成数据文件(如 `signals/raw_*.dat`),按时间段或按设备分文件落盘
- 传感器/识别后的结构化数据:实时写入 PostgreSQL/TimescaleDB用于查询、统计、回放曲线
- 仿真记录视频:按窗口/视角分别落入 `video/`,并在数据库中建立索引与标签(视角、分辨率、帧率等)
### 4.6 TimescaleDB 时序数据建模建议
为支持“高频写入 + 按时间范围回放/聚合”,建议将采集数据按时序表落库,并在 TimescaleDB 中转换为 Hypertable。
推荐思路:
- 一张时序主表:按 `ts` 做 Hypertable 分区
-`simulation_id` 作为业务主维度,支持一次三维仿真记录的时间窗查询与回放
字段建议(可按性能需要做列化/半结构化折中):
- `ts`时间戳TimescaleDB 分区键)
- `simulation_id`:三维仿真记录 ID用于回放与归档
- `device_id`:数据来源设备
- `signals`:结构化信号(可选 JSONB或将高频字段拆为列以提升聚合效率
典型策略(按需启用):
- 保留策略:只保留近 N 天原始点,长期保留用压缩或降采样结果
- 连续聚合:生成 1s/100ms 粒度的统计序列用于大屏曲线与回放加速
## 5. 前端模块设计Electron + Vue
### 5.1 界面体系(显示大屏 / 车载屏 / 控制屏)
界面显示功能分为三类屏幕(与规划大纲一致),由 Electron 统一创建窗口并在指定显示器呈现Vue 负责页面实现。
1) **显示大屏(面向展示/观摩)**
- **系统介绍**
- 系统功能介绍:图文并茂;可扩展语音播报与 AI 问答导览
- 车辆三维展示:外观/内饰动态展示;关键部件结构展示(转向机构、驱动机构等)
- 系统原理展示:动力/转向/制动/灯光等子系统工作原理可视化
- **数据看板**
- 数据主屏:中间为车辆三维动态模型;周边展示车辆概况、车辆参数(示例:秦 Plus、历次仿真记录、设备监控CPU/内存)、模拟报警信息
- 仿真回放屏:对单次仿真结果回放;三维仿真回放 + 采集数据动态图表回放;进度显示(总时长/当前进度)
- **仿真监控**
- 视角切换:主视角 / 驾驶员视角
- 主视角:路线图(动态)+ 车辆尾随视角
- 驾驶员视角:三维场景动态 + 仪表盘(车速、转速、档位、手刹、车灯、电量等)
- 仿真视频录制:动态录制仿真视频过程屏幕(目标 30fps并与仿真记录绑定
2) **车载屏(驾驶员视角)**
- 仿真界面:三维仿真场景;天气与时段显示;车速显示;仿真状态标识(等待/仿真中/结束)
- 数据记录:后台记录仿真过程记录,并动态录制车载屏仿真屏幕(目标 30fps
3) **控制屏(操作与管理)**
- 场景配置
- 仿真场景:城市道路/高速公路/山区道路/乡村道路/校园道路
- 气象:晴/雨/雪/雾等;时段:黎明/正午/黄昏/夜间
- 车辆颜色:红/白/黑最高限速100180 km/h
- 仿真时长560 分钟;驾驶员选择:人员/账号绑定
- 车辆传感器校正:自检/校正
- 场景推送:下发到车载屏与显示大屏
- 仿真控制:开始仿真 / 结束仿真
- 系统配置:功能介绍(文字)、端口与路径等基础配置入口
- 用户配置:角色与权限配置;用户与角色选择
- 数据查询:系统日志查询;仿真记录查询
- 数据分析车辆数据分析、故障模拟诊断、CAN 总线数据模拟解析
### 5.2 与后端的通信
- REST用于仿真记录控制、配置读写、历史查询、导出触发
- WebSocket订阅实时 topic设备状态、采样数据、告警、录制进度
- 静态文件:通过后端安全映射路径访问视频与大文件(支持 Range
### 5.3 前端路由与窗口映射(建议)
为便于多屏稳定运行,建议把“窗口类型”与“路由入口”固化:
- 显示大屏
- `/big/system-intro`
- `/big/dashboard`
- `/big/sim-monitor`
- 车载屏
- `/car/sim`
- 控制屏
- `/control/config`
- `/control/operate`
- `/control/query`
- `/control/analysis`
- `/control/admin`
### 5.4 外部进程启动与守护Electron 主进程)
主进程负责统一拉起与管理:
- 后端 EXE启动时分配端口固定端口或自动探测轮询 `/health` 确认就绪
- Unity EXE按用户选择显示器启动命令行传参端口、simulation_id、模式等
- 异常策略:崩溃检测、重启次数限制、日志采集、用户提示
推荐机制:
- 端口管理:优先读配置,冲突时自动寻找可用端口并回写运行态配置
- 生命周期Electron 退出时优雅关闭后端与 Unity超时后强制
## 6. Unity 联动方案(外部项目对接约定)
### 6.1 对接目标
- 实时同步实体车/传感器状态到 Unity姿态、速度、踏板、方向、报警等
- Unity 交互事件回传(场景切换、碰撞事件、驾驶行为、训练步骤等)
- 支持“实时模式”和“回放模式”
### 6.2 建议协议
建议使用同一套消息 Envelope
- **WebSocket实时**:订阅 `vehicle.signal`、`control.command` 等Unity 回传 `unity.event.*`
- **HTTP控制/查询)**:加载仿真记录、读取配置、拉取资源、触发导出
### 6.3 同步与时钟策略
- 后端为权威时间源服务端时间戳Unity 按 `ts` 对齐插值
- 允许 Unity 维护环形缓冲(例如 100300ms平衡抖动与延迟
## 7. 配置与环境管理
### 7.1 venv 管理与依赖
- 开发环境:`python -m venv venv`,使用 `requirements.txt` 固定依赖版本
- 构建环境:单独 `requirements_build.txt`(包含 PyInstaller 等打包依赖)
### 7.2 配置文件INI
建议统一使用以下段落(可按需扩展):
```ini
[SERVER]
host = 0.0.0.0
port = 5000
[FILEPATH]
path = data
[DATABASE]
url = postgresql+psycopg://smartedt:CHANGE_ME@127.0.0.1:5432/smartedt
timescaledb = True
```
## 8. 打包发布与部署
### 8.1 后端打包PyInstaller
产物目标:
- `Backend.exe`(单文件或目录模式)
- `config.ini`(可外置,便于现场修改)
- `data/`(默认数据目录,可按配置指向其他盘符)
建议输出:
- 内置 OpenAPI 文档(仅本机或受限网络可访问)
- 日志写入到 `logs/`(按日期切分)
### 8.2 前端打包Electron
产物目标:
- `SmartEDT.exe`(安装包/绿色包)
- `resources/backend/Backend.exe`(随包携带或首次运行下载)
- 统一版本号与升级策略(可选增量更新)
### 8.3 一键启动链路
1. 启动 `SmartEDT.exe`
2. Electron 主进程读取配置并拉起 `Backend.exe`
3. 后端健康检查通过后,渲染进程连接 REST/WS
4. 用户选择“仿真模式”时,拉起 Unity EXE 并注入运行参数
## 9. 多屏显示方案
### 9.1 目标
- 控制屏在主屏(操作与管理入口)
- 显示大屏在副屏/大屏(系统介绍 / 数据看板 / 仿真监控)
- 车载屏在驾驶员屏(或指定小屏)
- Unity 全屏运行在指定显示器(可与显示大屏分离)
### 9.2 Electron 实现要点
- 启动时枚举显示器,建立“显示器—窗口类型”映射
- 针对不同显示器创建多个 BrowserWindow固定 URL/路由)
- 提供“显示器管理”设置页:拖拽绑定、保存配置、开机恢复
- Unity 启动参数附带目标显示器索引(或由 Unity 自行选择)
建议的窗口类型:
- BigScreenWindow显示大屏可切换 system-intro/dashboard/sim-monitor
- CarScreenWindow车载屏驾驶员视角
- ControlWindow控制屏配置、控制、查询、分析、管理
## 10. 安全、可靠性与合规
### 10.1 本地数据安全
- 默认仅本机访问(可通过配置开放局域网)
- 静态文件映射做路径规范化与越界拦截(对标 README 的安全策略)
- 敏感字段脱敏显示subject_id 映射/匿名化)
### 10.2 稳定性策略
- 设备断连:自动重连、指数退避、状态广播
- 写盘保护:异步队列 + 批量提交;异常时保证仿真记录可关闭并可恢复
- 资源管理:视频录制与采样队列限速,避免磁盘/CPU 被打满
## 11. 日志、诊断与监控
- 分级日志:设备/仿真记录/API/存储
- 诊断接口:`/health` 返回依赖与核心子系统状态(设备数量、队列长度等)
- 现场排障:一键导出日志与仿真记录元数据(不含隐私或做脱敏)
## 12. 测试与质量保证
- 单元测试:消息模型、路径安全、数据库 CRUD、仿真流程状态机
- 集成测试模拟设备数据源Mock Adapter验证 WS 推送与落盘
- 性能测试:高频 IMU、视频录制并发、长时仿真稳定性内存/磁盘增长)
## 13. 交付物清单(建议)
- 后端可执行程序、配置模板、API 文档、设备接入开发规范
- 前端:桌面 EXE、显示器管理、实验流程 UI、日志导出
- 对接Unity 通讯协议文档topic/消息体/端口/参数)、联调用例
- 运维:安装说明、目录与数据管理说明、故障排查手册