无人机导航强化学习对比实验(uav_rl_benchmark)
在完全相同的环境与接口下,回答两个问题:
- 同模型不同 RL 算法:PPO / SAC / TD3 哪个学得快、学得好、飞得稳?
- 同算法不同网络结构:MLP 加宽(
[256,256])与加深([64,64,64])比基准([64,64])值不值?
环境直接复用 uav_ppo_nav 的 NavEnv(不复制、不改动),
所以比出来的差异只反映算法或结构的差别。
1. 实验设计
1.1 对比矩阵
| 维度 | 取值 | 说明 |
|---|---|---|
| 算法 | ppo / sac / td3 |
同一结构 [64,64]、同一步数预算 |
| 结构 | [64,64] / [256,256] / [64,64,64] |
同一算法(PPO) |
| 种子 | 0 / 1 / 2 | 每个配置重复 3 次,报告取均值 ± 标准差 |
| 预算 | 100 000 步 / 配置 | 三种算法一致 —— 对比的是样本效率,不是"谁训得久" |
| 环境 | 场地 ±10 m、16 个障碍、目标 2~8 m | 与 uav_ppo_nav 部署时的密度一致 |
1.2 公平性约定
- 同一学习率
3e-4、同一折扣0.99、同一批大小256; - 同一网络结构:SB3 的 SAC/TD3 默认是
[256,256],若不统一,差异里会混进 「网络更大」这个与算法无关的因素; - 同一批评估任务:固定
seed的 100 个回合,全部用确定性动作(取策略均值,不采样); - 其余保持 SB3 默认(SAC 自动熵调节、TD3 目标策略平滑等)—— 这些正是各算法的特征。
1.3 为什么不能只看成功率
只比成功率会漏掉两类实际不可用的策略:能到但绕远路、能到但抖得厉害。因此记录:
| 指标 | 含义 |
|---|---|
success_rate / crash_rate / timeout_rate |
到达 / 碰撞或越界 / 超时(三者之和 = 1) |
mean_steps |
回合平均步数 |
path_efficiency |
直线距离 / 实际飞行路程(0~1,越接近 1 越直;原地不动记 0) |
action_smoothness |
相邻两步动作的 L2 距离均值(越小越平滑) |
train_fps / train_time_s |
训练吞吐与墙钟时间(不同算法的训练成本差异极大) |
path_efficiency的"原地不动记 0"是本地测试抓出来的:最初实现用min(1.0, 直线/路程),悬停时路程为 0 导致除零后被截成满分 1.00 —— 不动的无人机反而拿到最优路径效率。已修正并有测试锁定。
2. 运行
pip install "stable-baselines3" "gymnasium" numpy pandas matplotlib
cd src/air/uav_rl_benchmark/scripts
python3 main.py --sweep # 完整矩阵
python3 main.py --algo sac --arch 64,64 --seeds 0 --steps 100000
python3 main.py --report # 由已有结果重画表格与图表(不重新训练)
ROS 方式(后台跑并在 /benchmark/status 播报进度):
roslaunch uav_rl_benchmark main.launch
roslaunch uav_rl_benchmark main.launch steps:=200000
⚠️ 这是离线训练任务,需要
torch/stable-baselines3。只装了 ROS 的机器上, 节点会在/benchmark/status报ERROR并退出(不静默失败)。
3. 结果
共 15 组配置:3 种算法 × 3 种网络结构 × 每配置 3 个随机种子;每组训练 100 000 步, 16 个障碍,最终在固定 100 个回合上以确定性动作评估。
3.1 同结构([64,64])、不同算法
| 算法 | 成功率 | 碰撞率 | 超时率 | 平均步数 | 路径效率 | 动作平滑度 | 训练速度 |
|---|---|---|---|---|---|---|---|
| PPO | 33% ± 7% | 22% | 45% | 195.8 | 0.81 | 0.117 | 1039 步/秒 |
| SAC | 23% ± 10% | 6% | 70% | 297.1 | 0.39 | 0.517 | 122 步/秒 |
| TD3 | 7% ± 3% | 6% | 86% | 354.1 | 0.35 | 0.696 | 185 步/秒 |
3.2 同算法(PPO)、不同网络结构
| 结构 | 成功率 | 平均步数 | 路径效率 | 动作平滑度 | 训练耗时 |
|---|---|---|---|---|---|
[64,64](基准) |
33% ± 7% | 195.8 | 0.81 | 0.117 | 96 s |
[256,256](加宽) |
34% ± 2% | 191.2 | 0.66 | 0.194 | 110 s |
[64,64,64](加深) |
37% ± 8% | 189.1 | 0.76 | 0.161 | 105 s |





4. 结论与讨论
4.1 算法层面(结构统一为 [64,64])
- PPO 在样本效率上明显领先:同样 10 万步,成功率 33% vs SAC 23% vs TD3 7%。
- PPO 的「飞行质量」优势比成功率更大:路径效率 0.81 vs 0.39 / 0.35 (接近直线 vs 绕来绕去),动作平滑度 0.117 vs 0.517 / 0.696(抖动是 PPO 的 4~6 倍)。 这正是只看成功率会漏掉的部分 —— SAC/TD3 能到达目标,但飞得又绕又抖。
- 「碰撞率低」是个陷阱:SAC/TD3 的碰撞率(6%)反而低于 PPO(22%),但超时率高达 70% / 86%。碰撞少不等于更安全,而是「不敢动」 —— 这类结论必须结合超时率一起读。
- 训练成本差 8.5 倍:PPO 平均 1039 步/秒,SAC 仅 122 步/秒(off-policy 每步都要做 梯度更新)。同样墙钟时间里 PPO 能多跑近一个数量级的样本。
显著性说明(重要):从学习曲线看,PPO 与 SAC 的误差带大面积重叠 (PPO 33%±7% vs SAC 23%±10%,训练到 6 万步时 SAC 甚至反超)。 因此「PPO 比 SAC 成功率更高」这一点在 3 个种子下尚未统计分离,只能说"趋势如此"。 但下面这些差异远超噪声,是可靠的结论: 路径效率
0.81 vs 0.39、动作平滑度0.117 vs 0.517、训练速度1039 vs 122 步/秒; TD3 的成功率7%与 PPO/SAC 完全不在一个量级,也是明确的。
4.2 结构层面(算法统一为 PPO)
加深([64,64,64])成功率最高(37%),基准 [64,64] 路径效率与平滑度最好(0.81 / 0.117),
加宽([256,256])路径效率最差(0.66)。
⚠️ 但这个差异不显著:三种结构的成功率极差仅 4 个百分点,而种子间标准差平均 达 6 个百分点 —— 在只有 3 个种子的情况下不足以判定哪种结构更优,差异落在噪声范围内。 要下结论需要更多种子(如 10 个)或更长的训练预算。 本实验如实报告这一点,而不是挑一个「最好看」的结构宣称它最优。
4.3 已知局限(如实说明)
- 100k 步下三种算法都没有收敛:
uav_ppo_nav用 40 万步可达 78% 成功率,而本实验中 最高只有 33%。因此本实验比较的是样本效率(同样预算下谁学得快), 不是各算法的性能上限 —— 要谈上限需要各算法都训到收敛。 - 未做逐算法调参:为公平起见统一了学习率
3e-4、批大小256、网络结构与步数预算, 并沿用 SB3 默认超参。off-policy 的 SAC/TD3 对超参更敏感,其表现很可能被默认超参低估。 这是本实验的已知局限,也是后续可改进的方向。 - 仅 3 个种子:单种子波动可达 ±10 个百分点,报告中所有数值都是 3 种子的均值 ± 标准差。