无人机导航强化学习对比实验(uav_rl_benchmark)

在完全相同的环境与接口下,回答两个问题:

  1. 同模型不同 RL 算法:PPO / SAC / TD3 哪个学得快、学得好、飞得稳?
  2. 同算法不同网络结构: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])

  1. PPO 在样本效率上明显领先:同样 10 万步,成功率 33% vs SAC 23% vs TD3 7%。
  2. PPO 的「飞行质量」优势比成功率更大:路径效率 0.81 vs 0.39 / 0.35 (接近直线 vs 绕来绕去),动作平滑度 0.117 vs 0.517 / 0.696(抖动是 PPO 的 4~6 倍)。 这正是只看成功率会漏掉的部分 —— SAC/TD3 能到达目标,但飞得又绕又抖。
  3. 「碰撞率低」是个陷阱:SAC/TD3 的碰撞率(6%)反而低于 PPO(22%),但超时率高达 70% / 86%。碰撞少不等于更安全,而是「不敢动」 —— 这类结论必须结合超时率一起读。
  4. 训练成本差 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 种子的均值 ± 标准差。

5. 参考