Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
EPlanVisualizer
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
嵇洲
EPlanVisualizer
Commits
2d8936ef
Commit
2d8936ef
authored
Mar 16, 2026
by
fenghen777
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
docs: add backend tech selection document
parent
be696eb6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
135 additions
and
0 deletions
+135
-0
后端技术选型.md
docs/后端技术选型.md
+135
-0
No files found.
docs/后端技术选型.md
0 → 100644
View file @
2d8936ef
# 仿真后端技术选型分析
> 目标:为 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 (序列化)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment