project
毕设记录:基于PyTorch3D的可微分无人机仿真平台
记录我的毕业设计——一个将可微分物理引擎与深度学习结合的无人机自主导航仿真平台,包含系统架构、梯度传播与训练流程的完整设计与实现过程。
By Arnold Kirk
注: 本文由 AI 助手(夜河阳)协助整理,基于项目实际代码和文档生成。
项目背景
毕设做的是无人机自主导航,方向是可微分物理仿真。
简单说就是:用一个能做反向传播的物理模拟器,让神经网络直接从物理约束里学怎么飞,而不是靠传统强化学习那种奖励信号一点一点试错。
参考了今年发在 Nature Machine Intelligence 上的 DiffPhysDrone(Zhang et al., 2025),他们证明了这条路跑得通。我的工作是在他们框架基础上,用 CMA-ES 进化算法 来自动优化损失函数权重——后面会单独写一篇说这个创新点。
系统架构
整个训练循环长这样:
相机位姿 (p, R)
↓
PyTorch3D 渲染器 → 深度图(观测)
↓(输入,切断梯度)
神经网络
CNN → GRU → FC → 动作
↓(梯度从这里流)
动作 → 可微分物理模拟 → 新状态 (p, v)
↓
损失函数
↓
backward()
核心是三个模块:
1. 可微分物理(drone_dynamics.py)
四旋翼动力学模型,包括:
- 推力计算和姿态求解
- 安全归一化(避免梯度爆炸)
- 碰撞检测(可微分)
这里踩了好几个坑,后面单独写一篇调试记录。
2. 渲染器(drone_renderer.py)
基于 PyTorch3D,把当前无人机位姿渲染成深度图,作为神经网络的视觉输入。
注意渲染调用要用 torch.no_grad() 包起来——PyTorch3D 的反向传播在某些相机位置下会产生 NaN 梯度,这是 PyTorch3D 本身的问题。
3. 策略网络(model.py)
深度图 → CNN → GRU → FC → 动作
动作空间是归一化的推力向量,直接输给物理模拟器。
传感器支持
除了深度相机,也实现了 LiDAR 传感器(lidar_sensor.py)和两者融合的方案,作为实验对比组之一。
训练设置
实验设计了 11 组对比:
| 维度 | 实验数 | 核心变量 |
|---|---|---|
| 损失函数对比 | 3 | MSE / 分解 / 自适应 |
| CMA-ES 进化优化 | 4 | decay / guide / meta / loss_net |
| 传感器对比 | 2 | LiDAR / 融合 |
| 模型架构对比 | 2 | 注意力 / 轻量化 |
每组实验大约跑 16-20 小时(单 GPU)。现在 3080 被毕设训练占着,跑实验靠抢显存窗口期。
当前进度
- 物理仿真核心
- PyTorch3D 渲染集成
- 策略网络架构
- CMA-ES 四种模式
- LiDAR / 融合传感器
- 可视化评估系统
- 全量实验跑完
- 论文撰写
下一篇:CMA-ES 如何用来进化损失函数权重——为什么不用梯度下降来学?