# 智能电动汽车数字孪生系统开发技术方案(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 自动生成) - **实时通讯**:WebSocket(FastAPI 原生或 Starlette WebSocket),用于状态/传感数据/事件推送 - **进程内并发**:asyncio + 线程池/进程池(适配阻塞型硬件 SDK) - **持久化**:PostgreSQL18 + TimescaleDB(用于实时采集数据的时序存储)+ SQLAlchemy(ORM/迁移支持) - **文件存储**:本地文件系统(与数据库元数据关联) - **打包**: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/`:静态文件访问映射(对标 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 的建议一致,采用“根目录 + 仿真记录分层”的稳定结构: ``` / / / 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) **控制屏(操作与管理)** - 场景配置 - 仿真场景:城市道路/高速公路/山区道路/乡村道路/校园道路 - 气象:晴/雨/雪/雾等;时段:黎明/正午/黄昏/夜间 - 车辆颜色:红/白/黑;最高限速:100–180 km/h - 仿真时长:5–60 分钟;驾驶员选择:人员/账号绑定 - 车辆传感器校正:自检/校正 - 场景推送:下发到车载屏与显示大屏 - 仿真控制:开始仿真 / 结束仿真 - 系统配置:功能介绍(文字)、端口与路径等基础配置入口 - 用户配置:角色与权限配置;用户与角色选择 - 数据查询:系统日志查询;仿真记录查询 - 数据分析:车辆数据分析、故障模拟诊断、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 维护环形缓冲(例如 100–300ms)平衡抖动与延迟 ## 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/消息体/端口/参数)、联调用例 - 运维:安装说明、目录与数据管理说明、故障排查手册