Commit 2d8936ef authored by fenghen777's avatar fenghen777

docs: add backend tech selection document

parent be696eb6
# 仿真后端技术选型分析
> 目标:为 EPLAN Visualizer 前端项目构建仿真后端,支持 Modelica 模型编译执行、ROS2 半实物仿真通信、前端实时结果展示。
## 需求分析
| 需求 | 说明 |
|------|------|
| 仿真执行 | 接收前端 .mo 模型,调用 OpenModelica 编译和仿真 |
| 实时推送 | WebSocket 将仿真结果实时推送到前端图表 |
| ROS2 通信 | 作为半实物仿真的通信层,与实物控制器交互 |
| FMU 执行 | 加载 FMU 进行 co-simulation |
| 部署 | 裸机 + systemd 服务 |
## 候选框架对比
| 维度 | C++ Drogon | Go Fiber | Rust Axum | Python FastAPI | Java WebFlux |
|------|-----------|---------|----------|---------------|-------------|
| 裸性能 | 最高 | 高 | 极高 | 低 | 中 |
| WebSocket | 原生 | 原生 | 原生 | 原生 | 原生 |
| OpenModelica 集成 | C API 直连 | 命令行调用 | 命令行调用 | OMPython SDK | 命令行调用 |
| ROS2 集成 | rclcpp 原生 | 无官方支持 | 无官方支持 | rclpy (慢) | 无官方支持 |
| 实时性 | 可保证 | 一般 | 可保证 | 无法保证 | 无法保证 |
| 开发效率 | 中 | 高 | 低 | 最高 | 高 |
| 单进程架构 | 支持 | 需多进程 | 需多进程 | 需多进程 | 需多进程 |
## ROS2 集成分析
ROS2 原生语言为 C++,使用 rclcpp。C++ 后端的独特优势:
**C++ 单进程方案:**
```
单进程:
Drogon 线程池 --> HTTP/WebSocket
rclcpp 执行器 --> ROS2 pub/sub
OpenModelica C API --> 仿真执行
共享内存直接访问 --> 零延迟
```
**其他语言多进程方案:**
```
进程1: Web 后端 (Go/Python)
进程2: ROS2 节点 (C++)
进程3: omc 仿真
三者通过 IPC/Socket 通信 --> 复杂、延迟高
```
半实物仿真对延迟敏感,单进程架构优势明显。
## FMU 执行库对比:FMIL vs FMPy
| 维度 | FMIL (C) | FMPy (Python) |
|------|---------|--------------|
| 每步调用耗时 | 1-5us | 50-200us |
| 实时性 | 确定性延迟,无 GC | GC + 解释器抖动 |
| 与 C++ 集成 | 直接 #include | 需跨语言桥接 |
| ROS2 实时回调兼容 | 兼容 | 不兼容 |
| 适用场景 | 半实物仿真 | 离线分析/可视化 |
**结论:半实物仿真场景选 FMIL。**
## 最终选型
**C++ + Drogon + rclcpp + FMIL**
```
React 前端 (WebSocket)
|
Drogon 后端 (C++)
|
+-- FMIL: 加载 FMU, co-simulation (fmi2DoStep < 5us)
|
+-- rclcpp: ROS2 半实物通信
| +-- pub: 仿真输出 --> 实物控制器
| +-- sub: 传感器数据 --> 注入 FMU 输入
|
+-- OpenModelica C API: .mo 编译与仿真
|
+-- WebSocket: 推送结果 --> 前端图表
|
+-- MariaDB: 仿真记录/模型存储
```
### 选型理由
1. **语言统一** -- OpenModelica、ROS2、FMIL 原生语言均为 C/C++,单语言无桥接开销
2. **单进程架构** -- Web 服务 + ROS2 节点 + 仿真引擎在同一进程,共享内存零延迟
3. **实时保证** -- 无 GC 停顿,可对接 ROS2 实时调度 (SCHED_FIFO),满足半实物仿真约束
4. **部署简单** -- 编译为单二进制,systemd 管理即可
## 多进程仿真分析
### 纯软件仿真(可并行)
每个仿真进程加载各自的 FMU,独立内存空间,互不干扰,天然支持并行。
### 半实物仿真(需协调)
多进程并行存在以下问题:
| 问题 | 说明 |
|------|------|
| 时间同步 | 多个仿真进程各自步进,物理时间不一致 |
| 硬件竞争 | 多个进程争抢同一个 CAN/EtherCAT 接口 |
| CPU 争抢 | 多个 SCHED_FIFO 进程抢 RT 核,优先级反转风险 |
| 因果一致性 | 仿真 A 的输出是仿真 B 的输入时,步长必须对齐 |
解决方案:主从协调架构(FMI Co-Simulation 标准模式)
```
主协调进程 (Orchestrator)
|
+-- 统一时钟: 控制所有仿真的步进节奏
+-- 数据路由: 管理仿真之间的数据交换
|
+-- 仿真进程 A (电气子系统)
+-- 仿真进程 B (液压子系统)
+-- 仿真进程 C (控制逻辑)
```
### 场景建议
| 场景 | 方案 |
|------|------|
| 单一模型仿真 | 单进程 |
| 多学科联合仿真 | 单 RT 进程内顺序执行多 FMU |
| 多用户独立仿真 | 多进程,互不影响 |
| 半实物 + 多 FMU | 单 RT 进程 + 协调器保证时间同步 |
### JSON 库选择
Drogon 默认使用 jsoncpp,可通过 CMake 选项切换:
- 初期使用默认 jsoncpp(足够)
- 如需优化:`cmake .. -DUSE_NLOHMANN_JSON=ON`
- 大批量数据场景:考虑 simdjson (解析) + yyjson (序列化)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment