好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 LuLuWuWei1120 于 2026-5-4 21:08 编辑
之前做了一个简单的纯模拟三体运动(虽然还遗留了一些bug)。花了点时间,修复了bug,并加入了一些新功能。添加了csv日志系统,python绘图(基于csv日志文件),简单的神经网络训练(自动生成dt),自动dt(基于神经网络生成)。为分化职能,添加了DataFormatter格式化字符串,SimulationIO专门负责各种IO输入输出,以及一系列新增功能的配套文件,并且优化了ui表现。话不多说先看图。
纯ui
ui&blender界面
python绘图1
python绘图2
纯blender
csv数据2
csv数据1
以下是README.md文件
[C] 纯文本查看 复制代码 # 三体模拟器 (Three-Body Simulator)
C++17 三体问题物理模拟器,支持 TCP 数据导出、CSV 日志记录、日志可视化分析及 AI 自动调步。
## 功能特性
- **物理引擎**:支持 Euler、Verlet、RK4 等多种积分器
- **TCP 通信**:双端口架构
- 12345 端口:发送位置数据到 Blender 可视化
- 12346 端口:AI 自动调步通信(C++ 作为客户端连接到 Python AI 服务器)
- **CSV 日志**:记录每帧的位置、速度、加速度、能量、dt 等完整信息
- **日志可视化**:使用 matplotlib 绘制轨迹、能量、速度、dt 曲线
- **AI 自动调步**:使用 PyTorch 训练神经网络,自动调整时间步长 dt
## 项目架构
```
ThreeBody/
├── main.cpp # 入口
├── CMakeLists.txt # 构建脚本
├── README.md # 本文件
├── run.sh # 一键启动脚本
├── blenderClient.py # Blender 可视化客户端
│
├── utils/ # 工具模块
│ ├── Vec3.h # 三维向量
│ └── Config.h # 配置参数
│
├── physics/ # 物理引擎
│ ├── Body.h/.cpp # 天体数据
│ ├── PhysicsEngine.h/.cpp # 力计算与能量
│ └── Integrator.h/.cpp # 数值积分器
│
├── sim/ # 模拟核心
│ ├── Simulation.h/.cpp # 模拟主循环
│ ├── SimulationIO.h/.cpp # TCP/CSV 导出管理
│ └── DataFormatter.h/.cpp # 数据格式化
│
├── tcp/ # 网络通信
│ ├── TcpExporter.h/.cpp # TCP 服务器导出(Blender 用)
│ └── TcpClient.h/.cpp # TCP 客户端(AI 用)
│
├── log/ # 日志模块
│ ├── CsvLogger.h/.cpp # CSV 写入
│ └── StatusLog.h/.cpp # 状态日志
│
├── ui/ # 用户界面
│ └── UserInterface.h/.cpp # 交互菜单与启动配置
│
├── script/ # Python 辅助脚本
│ ├── plot_csv.py # CSV 日志绘图
│ ├── ai_server.py # AI dt 推理服务
│ ├── train_model.py # 模型训练
│ └── create_placeholder_model.py # 创建占位模型
│
└── models/ # AI 模型文件
└── auto_dt_model.pt # AI 调步模型
```
## 依赖
### C++
- C++17 编译器 (gcc/clang)
- CMake >= 3.14
- Boost.Asio (header-only, 1.70+)
### Python 3 (日志分析与 AI 模式)
- pandas
- matplotlib
- PyTorch (仅 AI 模式需要)
- Blender 3.x (仅可视化需要)
#### 安装 Python 依赖
```bash
# 基础依赖
pip install pandas matplotlib
# PyTorch (CPU 版本,推荐)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# 或者如果你有 NVIDIA GPU
# pip install torch torchvision torchaudio
```
## 快速开始
### 1. 编译项目
```bash
mkdir -p build && cd build
cmake ..
make -j$(nproc)
cd ..
```
或者使用一键脚本(会自动编译):
```bash
chmod +x run.sh
```
### 2. 生成占位 AI 模型(可选)
```bash
cd script
python create_placeholder_model.py
cd ..
```
这个模型会始终返回 dt=0.01,作为占位用。
### 3. 运行模拟
#### 方法 1:使用一键脚本(推荐)
```bash
# 完整模式(AI + Blender)
./run.sh
# 查看帮助
./run.sh --help
```
#### 方法 2:分步运行
**第一步**:启动 AI 服务器(新终端)
```bash
python script/ai_server.py
```
**第二步**:启动模拟器
```bash
cd build
./ThreeBody
```
**第三步**:在 Blender 中运行可视化(新终端打开 Blender)
```bash
blender
# 打开脚本标签,加载 blenderClient.py 并运行
```
## 使用说明
### 运行模拟器后,菜单选择
```
1. 随机模式 – 随机生成初始条件
2. 稳定模式 – 拉格朗日解、8字形解等已知稳定轨道
3. 自定义模式 – 手动输入每个天体的参数
4. 日志分析 – 选择已有 CSV 文件绘图
5. 退出
```
### 日志分析(CSV 绘图)
先运行模拟,生成 CSV 日志(自动保存在 `logs/`),然后:
```bash
# 在模拟器菜单选择 4
# 或者直接运行
python script/plot_csv.py logs/sim_202501011200.csv
```
生成的图像会保存到 `logs/plots/` 目录。
## AI 自动调步 (autoDt)
### 架构说明
- **C++ 端**:作为 TCP 客户端,连接到 127.0.0.1:12346
- **Python 端**:作为 TCP 服务器,监听 127.0.0.1:12346
### 通信协议
- **C++ → Python (每帧)**:一行 JSON 格式
```json
{
"dt": 0.01,
"energy": -100.0,
"bodies": [
{"pos": [x, y, z], "vel": [x, y, z], "acc": [x, y, z]},
...
]
}
```
- **Python → C++ (每帧响应)**:一行浮点数,例如 `0.015`
### 训练自定义模型
1. **收集数据**:运行模拟器,生成一些 CSV 日志
2. **训练模型**:
```bash
cd script
python train_model.py --csv ../logs/sim_*.csv --output ../models/auto_dt_model.pt --epochs 100
```
3. **重启 AI 服务器**:加载新模型
4. **运行模拟器**:使用新模型自动调整 dt
### 特征维度说明
- 输入维度:29 维
- 2 维:当前 dt、系统能量
- 27 维:3个天体 × (位置3维 + 速度3维 + 加速度3维)
- 输出维度:1 维,预测的 dt
## Blender 可视化
### 使用步骤
1. 打开 Blender
2. 切换到 Scripting 工作区
3. New 新建一个文本文件
4. 复制 `blenderClient.py` 内容,或直接用 Blender 打开该文件
5. 确保 C++ 模拟器正在运行(或已准备好)
6. 点击 Run Script 运行
7. 启动 C++ 模拟,球体会自动更新位置
### 注意事项
- Blender 是 TCP 客户端,连接到 C++ 的 12345 端口
- 三个球体分别用红、绿、蓝色表示
- 球体半径根据物理参数自动缩放
## 常见问题
### Q: 编译出错,找不到 Boost
A: 安装 Boost 库或使用系统包管理器
- Ubuntu/Debian: `sudo apt install libboost-all-dev`
- Fedora/CentOS: `sudo dnf install boost-devel`
### Q: 运行报错 "bind: Address already in use"
A: 关闭占用相关端口的进程
```bash
pkill -9 -f ThreeBody
pkill -9 -f ai_server
```
### Q: Blender 球体不移动
A: 检查连接顺序
1. 先启动 C++ 模拟器
2. 选择模式,初始化 TCP
3. 再在 Blender 中运行客户端脚本
### Q: AI 服务器提示找不到 torch
A: 安装 PyTorch,或使用虚拟环境
## 开发指南
### 项目结构说明
- **utils/**:基础工具类(Vec3、Config)
- **physics/**:物理引擎核心
- **sim/**:模拟控制和 IO
- **tcp/**:网络通信
- **ui/**:菜单和用户交互
- **log/**:日志处理
### 添加新功能
1. 添加新的积分器:在 `physics/Integrator.h/.cpp` 中继承并实现
2. 修改数据格式:在 `sim/DataFormatter.cpp` 中修改
3. 添加新的导出:继承或修改 `sim/SimulationIO`
## 许可证
本项目仅供学习和研究使用。
此次代码特意使用boost/asio网络库以确保跨平台性,但也因此需要额外配置asio库。此外,所需环境仅python,c/c++,pytorch以及可视化工具blender(只要以脚本模式打开blenderClient并运行即可),ai和可视化部分并非一定需要,可在config中调整,(哪怕不调整)直接运行应该也可以。
理论上来说,linux环境下可以直接编译运行,为方便运行额外配置了run.sh文件。至于windows等其它平台,应该需要修改CMakeLists.txt文件才能输出可执行文件(丢给ai应该不难),至于run.sh有效性未知。
完整项目及代码在此处。(Ps:本人测试动量的时候忘记把源代码中碰撞系数调回来了,如果碰撞系数太低了以目前的模拟精度好像不太行,建议调成1.0)
完成后让ai生成了注释,README.md等文件,可读性应该不差。
不废话了,希望你能玩得开心。
ThreeBody.zip
(1.8 MB, 下载次数: 18)
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|