返回博客
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 组对比:

维度实验数核心变量
损失函数对比3MSE / 分解 / 自适应
CMA-ES 进化优化4decay / guide / meta / loss_net
传感器对比2LiDAR / 融合
模型架构对比2注意力 / 轻量化

每组实验大约跑 16-20 小时(单 GPU)。现在 3080 被毕设训练占着,跑实验靠抢显存窗口期。

当前进度

  • 物理仿真核心
  • PyTorch3D 渲染集成
  • 策略网络架构
  • CMA-ES 四种模式
  • LiDAR / 融合传感器
  • 可视化评估系统
  • 全量实验跑完
  • 论文撰写

下一篇:CMA-ES 如何用来进化损失函数权重——为什么不用梯度下降来学?