RL-DQN-Vehicle

基于深度强化学习的车辆横向控制示例,支持离散/连续动作(DQN、DDQN、DDPG、TD3、SAC、A2C、A3C、TRPO、PPO、GRPO),附赛道预览与可视化。

项目简介

本项目实现了一个完整的强化学习车辆横向控制系统,使用深度强化学习算法训练智能体在自定义赛道上进行轨迹跟踪。项目支持多种强化学习算法(DQN、DDQN、DDPG、TD3、SAC、A2C、A3C、TRPO、PPO、GRPO)和多种赛道类型(圆形、正弦、复合、掉头),提供了完整的训练、测试、可视化和性能评估功能。

项目特点:

  • 完整实现:从环境设计到算法实现,从训练到测试,提供完整的工作流程
  • 代码规范:详细的中文注释,清晰的代码结构,便于理解和学习
  • 易于扩展:模块化设计,便于添加新算法、新赛道、新功能
  • 文档完善:详细的 README 和快速开始指南,降低使用门槛

核心特性:

  • 🚗 车辆模型:基于自行车运动学模型,实现真实的车辆动力学仿真
    • 支持位置、航向、速度、转向角等状态更新
    • 提供车辆绘制功能,支持可视化
    • 车辆参数可配置(轴距、车宽、最大转向角等)
  • 🛣️ 多种赛道:支持圆形、正弦、复合、掉头四种赛道类型,可自定义参数
    • 圆形赛道:最简单,适合快速测试
    • 正弦赛道:训练时默认使用,难度适中
    • 复合赛道:包含直线和圆弧,难度较高
    • 掉头赛道:包含半圆掉头,难度最高
  • 🤖 多种算法:支持 10 种强化学习算法
    • 离散动作空间:DQN、DDQN、A2C、A3C、TRPO、PPO、GRPO
    • 连续动作空间:DDPG、TD3、SAC
    • DQN:适合初学者,训练稳定,易于理解
    • DDQN:解决 Q 值高估问题,性能通常优于 DQN
    • DDPG:控制平滑,转角连续,适合实际应用
    • TD3:DDPG 的改进版本,训练更稳定
    • SAC:最大熵强化学习,探索更充分,鲁棒性更强
    • A2C:标准策略梯度,实现简单
    • A3C:A2C 的异步版本(本实现为单 worker 版本)
    • TRPO:训练稳定,理论保证,适合理论研究
    • PPO:实现简单,性能通常与 TRPO 相当或更好
    • GRPO:无需价值网络,实现更简单
  • 📊 完整可视化:训练曲线、全局轨迹 GIF、信息视图 GIF、性能指标评估
    • 训练曲线:实时显示奖励变化,自动过滤异常值
    • 全局轨迹 GIF:显示车辆在赛道上的全局运动
    • 信息视图 GIF:显示局部视角和误差曲线
    • 性能指标:自动计算并输出多项评估指标
  • ⚙️ 灵活配置:所有超参数集中在 config.py,便于调优和实验
    • 算法选择、赛道模式、车辆参数、环境参数、奖励权重、超参数等
    • 所有参数都有详细注释,说明用途和调参建议

适用场景:

  • 📚 教学演示:用于强化学习课程教学,展示算法原理和实现
  • 🔬 算法研究:对比不同算法的性能,研究算法改进
  • 🛠️ 工程应用:作为车辆横向控制的参考实现,可扩展到实际应用
  • 🎓 学习实践:学习强化学习算法,理解代码实现细节

功能概览

赛道类型

  • circle:圆形赛道,最简单,适合快速测试和算法验证
  • sine:正弦赛道,训练时默认使用,难度适中,适合学习轨迹跟踪
  • composite:复合赛道,包含直线和多个四分之一圆弧,难度较高,测试算法泛化能力
  • turnaround:掉头赛道,包含半圆掉头,难度最高,测试算法在复杂场景下的表现

强化学习算法

  • dqn(Deep Q-Network):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:epsilon-greedy(逐步衰减)
    • 特点:适合初学者,训练稳定,易于理解
    • 适用场景:快速验证、算法对比、教学演示
  • ddqn(Double Deep Q-Network):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:epsilon-greedy(逐步衰减)
    • 特点:解决 Q 值高估问题,性能通常优于 DQN
    • 适用场景:算法对比、性能优化
  • ddpg(Deep Deterministic Policy Gradient):

    • 动作空间:连续(直接输出转向角,范围 [-30°, 30°])
    • 探索策略:高斯噪声(逐步衰减)
    • 特点:控制更平滑,转角连续变化,无抖动
    • 适用场景:实际应用、平滑控制需求
  • td3(Twin Delayed Deep Deterministic Policy Gradient):

    • 动作空间:连续(直接输出转向角,范围 [-30°, 30°])
    • 探索策略:高斯噪声(逐步衰减)
    • 特点:DDPG 的改进版本,Twin Critic + 延迟策略更新,训练更稳定
    • 适用场景:实际应用、稳定训练需求
  • sac(Soft Actor-Critic):

    • 动作空间:连续(直接输出转向角,范围 [-30°, 30°])
    • 探索策略:最大熵强化学习,随机策略
    • 特点:探索更充分,鲁棒性更强,训练更稳定
    • 适用场景:复杂环境、高探索需求
  • a2c(Advantage Actor-Critic):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:策略熵正则化
    • 特点:标准策略梯度,实现简单,比 TRPO 更简单
    • 适用场景:快速验证、算法对比
  • a3c(Asynchronous Advantage Actor-Critic):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:策略熵正则化
    • 特点:A2C 的异步版本(本实现为单 worker 版本)
    • 适用场景:快速验证、算法对比
  • trpo(Trust Region Policy Optimization):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:策略熵正则化
    • 特点:训练更稳定,理论保证单调改进
    • 适用场景:稳定训练、理论研究、高可靠性需求
  • ppo(Proximal Policy Optimization):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:策略熵正则化
    • 特点:裁剪机制,实现简单,性能通常与 TRPO 相当或更好
    • 适用场景:稳定训练、实际应用
  • grpo(Group Relative Policy Optimization):

    • 动作空间:离散(17 个预定义转向角)
    • 探索策略:策略熵正则化
    • 特点:无需价值网络,组内相对基线,实现更简单
    • 适用场景:快速验证、简化实现

可视化功能

  • 训练曲线:实时显示每回合奖励,自动过滤碰撞惩罚和低异常值,便于观察收敛趋势
  • 全局轨迹 GIF:显示整个赛道和车辆轨迹,便于观察全局表现
  • 信息视图 GIF:显示局部视角和误差曲线(横向误差、航向误差、转向角),便于观察细节
  • 性能指标:自动计算并输出平均横向误差、平均航向误差、转角标准差、转角平滑性

环境要求

Python 版本

  • Python ≥ 3.8(推荐 3.8-3.10)
  • 需要支持 PyTorch 和相关依赖库

依赖库

  • numpy:数值计算,用于数组操作和数学运算
  • torch:PyTorch 深度学习框架,用于神经网络训练和推理
  • matplotlib:绘图库,用于训练曲线和赛道可视化
  • imageio:图像处理库,用于生成 GIF 动画
  • Pillow:图像处理库,用于图像格式转换

安装方法

# 方法 1:使用 requirements.txt(推荐)
pip install -r requirements.txt

# 方法 2:手动安装(若无 requirements.txt)
pip install numpy torch matplotlib imageio Pillow

# 方法 3:使用 conda(可选)
conda install numpy matplotlib pillow
conda install pytorch -c pytorch
pip install imageio

GPU 支持(可选)

  • 项目自动检测 CUDA,如果可用则使用 GPU 加速训练
  • 无 GPU 时自动使用 CPU,不影响功能
  • 推荐使用 GPU 以加速训练(特别是 TRPO 算法)

快速上手

1. 训练模型

训练智能体学习轨迹跟踪策略,生成模型权重和训练曲线。

# DQN 算法训练(离散动作)
python main.py --mode train --algo dqn

# DDQN 算法训练(离散动作,解决 Q 值高估问题)
python main.py --mode train --algo ddqn

# DDPG 算法训练(连续动作)
python main.py --mode train --algo ddpg

# TD3 算法训练(连续动作,DDPG 的改进版本)
python main.py --mode train --algo td3

# SAC 算法训练(连续动作,最大熵强化学习)
python main.py --mode train --algo sac

# A2C 算法训练(离散动作,标准策略梯度)
python main.py --mode train --algo a2c

# A3C 算法训练(离散动作,A2C 的异步版本)
python main.py --mode train --algo a3c

# TRPO 算法训练(离散动作)
python main.py --mode train --algo trpo

# PPO 算法训练(离散动作,裁剪机制)
python main.py --mode train --algo ppo

# GRPO 算法训练(离散动作,无需价值网络)
python main.py --mode train --algo grpo

输出文件:

  • 模型权重:model/<algo>_autodrive.pth(所有算法)
  • 训练曲线:result/training_curve_<algo>.png(所有算法)
  • 奖励历史:result/train_data/reward_history_<algo>.csv(所有算法)

可选参数:

  • --model_path yourname.pth:自定义模型保存路径
  • --algo dqn/ddpg/trpo:指定算法(覆盖 config.py 中的 ALGORITHM

训练说明:

  • 训练时强制使用正弦赛道(sine),训练结束后恢复原配置
  • 训练回合数:
    • DQN/DDQN/DDPG/TD3/SAC:默认 2000 回合(off-policy 算法)
    • A2C/A3C/PPO/GRPO:默认 3000 回合(on-policy 算法)
    • TRPO:默认 5000 回合(on-policy 算法,需要更多回合)
  • 训练过程中每 100 回合打印一次平均奖励(可在 config.py 中修改 LOG_INTERVAL

2. 测试模型

加载训练好的模型,在环境中运行推理,生成可视化 GIF 和性能指标。

# DQN 算法测试
python main.py --mode test --algo dqn --model_path model/dqn_autodrive.pth

# DDQN 算法测试
python main.py --mode test --algo ddqn --model_path model/ddqn_autodrive.pth

# DDPG 算法测试
python main.py --mode test --algo ddpg --model_path model/ddpg_autodrive.pth

# TD3 算法测试
python main.py --mode test --algo td3 --model_path model/td3_autodrive.pth

# SAC 算法测试
python main.py --mode test --algo sac --model_path model/sac_autodrive.pth

# A2C 算法测试
python main.py --mode test --algo a2c --model_path model/a2c_autodrive.pth

# A3C 算法测试
python main.py --mode test --algo a3c --model_path model/a3c_autodrive.pth

# TRPO 算法测试
python main.py --mode test --algo trpo --model_path model/trpo_autodrive.pth

# PPO 算法测试
python main.py --mode test --algo ppo --model_path model/ppo_autodrive.pth

# GRPO 算法测试
python main.py --mode test --algo grpo --model_path model/grpo_autodrive.pth

输出文件:

  • 全局视图 GIF:result/display_global_<algo>.gif(所有算法)
  • 信息视图 GIF:result/display_info_<algo>.gif(所有算法)
  • 性能指标:控制台输出平均横向误差、平均航向误差、转角标准差、转角平滑性

测试说明:

  • 测试时使用评估模式(eval_mode=True),无探索,保证可重复性
  • 测试赛道使用 config.py 中的 TRACK_MODE(默认 composite
  • 每隔 5 步采样一帧,生成 GIF 动画(减少文件大小)

3. 赛道预览

仅绘制赛道几何,不进行训练或测试,用于检查赛道配置是否正确。

# 弹窗显示赛道预览
python main.py --mode preview

# 保存赛道预览到文件
python main.py --mode preview --preview_path result/track_preview.png

输出说明:

  • 显示赛道几何:内外边界、中心线、终点线、起点标记
  • 可用于验证赛道参数配置是否正确

4. 绘制奖励曲线

从保存的奖励历史 CSV 文件绘制奖励曲线,便于分析训练收敛趋势。

# 绘制任意算法的奖励曲线(默认忽略碰撞惩罚)
python main.py --mode plot_rewards --algo <algo>

# 显示完整奖励数据(包括碰撞)
python main.py --mode plot_rewards --algo <algo> --no-ignore-collision

输出文件:

  • 奖励曲线:result/reward_curve_saved_dqn_nocollision.png / result/reward_curve_saved_ddpg_nocollision.png / result/reward_curve_saved_trpo_nocollision.png
  • 完整数据:result/reward_curve_saved_dqn.png(使用 --no-ignore-collision 时)

绘图说明:

  • 默认过滤碰撞惩罚(奖励 ≤ REWARD_COLLISION)和低异常值(5 分位以下)
  • 便于观察整体收敛趋势,不被异常值干扰
  • 使用 --no-ignore-collision 可查看完整原始数据

5. 完整流程(训练 + 测试)

一次性完成训练和测试,适合快速验证算法效果。

# 训练并测试任意算法
python main.py --mode both --algo <algo>

说明:

  • --mode both 等价于先执行 --mode train 再执行 --mode test
  • 使用默认模型文件名,训练后自动加载进行测试

更多细节可见 doc/QUICK_START.md

配置入口

所有配置参数集中在 src/config.py,便于统一管理和调优。

算法选择

ALGORITHM = "td3"  # 可选: "dqn" / "ddqn" / "ddpg" / "td3" / "sac" / "a2c" / "a3c" / "trpo" / "ppo" / "grpo"
  • 可通过命令行参数 --algo 覆盖默认算法
  • 不同算法使用不同的超参数和训练回合数

赛道模式

TRACK_MODE = "composite"  # 可选: "circle" / "sine" / "composite" / "turnaround"
  • 训练时强制使用 sine 赛道,测试时使用配置的赛道模式
  • 不同赛道类型有不同的几何参数(半径、长度、采样点数等)

车辆参数

  • VEHICLE_L:轴距(前后轮距离,米)
  • VEHICLE_W:车宽(米)
  • VEHICLE_MAX_STEER_DEG:最大转向角(度)
  • MAX_SPEED:速度上限(米/秒)

环境参数

  • ROAD_WIDTH:道路宽度(米)
  • MAX_STEPS:每局最大步数
  • DT:仿真步长(秒)

奖励权重

  • REWARD_LATERAL_GAIN:横向误差奖励权重
  • REWARD_HEADING_GAIN:航向误差奖励权重
  • REWARD_STEER_PENALTY:转向惩罚权重
  • REWARD_COLLISION:碰撞惩罚值
  • REWARD_FINISH_BONUS:完赛奖励加成

算法超参数

  • DQN/DDQN:学习率、批大小、经验池大小、epsilon 衰减、目标网络更新频率等
  • DDPG:Actor/Critic 学习率、软更新系数、高斯噪声参数等
  • TD3:Actor/Critic 学习率、软更新系数、策略更新频率、目标策略平滑等
  • SAC:Actor/Critic 学习率、软更新系数、温度参数、自动温度调整等
  • A2C/A3C:策略/价值网络学习率、GAE 参数、熵正则化系数、梯度裁剪等
  • TRPO:KL 约束、共轭梯度迭代次数、GAE 参数、价值网络学习率等
  • PPO:策略/价值网络学习率、裁剪参数、更新轮数、GAE 参数等
  • GRPO:策略网络学习率、更新轮数、KL 正则化系数、熵正则化系数等

重要提示:

  • 调整超参数后需重新训练模型
  • 建议先使用默认参数,熟悉流程后再调优
  • 所有参数都有详细注释,说明调参建议和影响

目录速览

RL-DQN-Vehicle/
├── main.py                 # CLI 入口,训练/测试/预览/绘图调度
├── src/
│   ├── config.py          # 全局配置中心(算法/赛道/车辆/奖励/超参)
│   ├── env.py             # 轨迹跟踪环境(状态/奖励/碰撞/终点判定/渲染)
│   ├── track.py            # 赛道几何生成(circle/sine/composite/turnaround)
│   ├── vehicle.py          # 车辆模型(自行车运动学模型/绘制工具)
│   ├── dqn.py              # DQN 智能体实现(离散动作,epsilon-greedy)
│   ├── ddqn.py             # DDQN 智能体实现(离散动作,Double Q-Learning)
│   ├── ddpg.py             # DDPG 智能体实现(连续动作,高斯噪声)
│   ├── td3.py              # TD3 智能体实现(连续动作,Twin Critic + 延迟策略更新)
│   ├── sac.py              # SAC 智能体实现(连续动作,最大熵强化学习)
│   ├── a2c.py              # A2C 智能体实现(离散动作,标准策略梯度)
│   ├── a3c.py              # A3C 智能体实现(离散动作,异步标准策略梯度)
│   ├── trpo.py             # TRPO 智能体实现(离散动作,KL 约束)
│   ├── ppo.py              # PPO 智能体实现(离散动作,裁剪机制)
│   └── grpo.py             # GRPO 智能体实现(离散动作,组内相对基线)
├── doc/
│   └── QUICK_START.md      # 详细入门说明文档
├── model/                  # 模型权重存放目录(自动创建)
│   ├── dqn_autodrive.pth
│   ├── ddqn_autodrive.pth
│   ├── ddpg_autodrive.pth
│   ├── td3_autodrive.pth
│   ├── sac_autodrive.pth
│   ├── a2c_autodrive.pth
│   ├── a3c_autodrive.pth
│   ├── trpo_autodrive.pth
│   ├── ppo_autodrive.pth
│   └── grpo_autodrive.pth
└── result/                 # 结果输出目录(自动创建)
    ├── train_data/         # 训练数据(奖励历史 CSV)
    ├── training_curve_*.png # 训练曲线图
    ├── reward_curve_saved_*.png # 奖励曲线图
    ├── display_global_*.gif # 全局轨迹 GIF
    └── display_info_*.gif   # 信息视图 GIF

核心文件说明

  • main.py

    • 命令行入口,解析参数并调用相应功能
    • 支持训练、测试、预览、绘图四种模式
    • 根据算法自动选择对应的智能体实现
  • src/config.py

    • 全局配置中心,集中管理所有参数
    • 包含算法选择、赛道模式、车辆参数、环境参数、奖励权重、超参数等
    • 所有参数都有详细注释,说明用途和调参建议
  • src/env.py

    • 实现轨迹跟踪环境(类似 OpenAI Gym)
    • 提供状态计算、奖励函数、碰撞检测、终点判定、渲染等功能
    • 支持离散动作(step)和连续动作(step_continuous
  • src/track.py

    • 赛道几何生成模块
    • 支持四种赛道类型,输出中心线、切向角、内外边界、终点线
    • 所有赛道参数可在 config.py 中配置
  • src/vehicle.py

    • 车辆模型实现(自行车运动学模型)
    • 提供车辆状态更新、角度归一化、车辆绘制等功能
    • 车辆参数可在 config.py 中配置
  • src/dqn.py / src/ddqn.py / src/ddpg.py / src/td3.py / src/sac.py / src/a2c.py / src/a3c.py / src/trpo.py / src/ppo.py / src/grpo.py

    • 十种强化学习算法的完整实现
    • 包含网络定义、智能体类、训练/推理逻辑、模型保存/加载等
    • 所有超参数从 config.py 读取

可视化与结果文件

训练曲线

  • 文件路径result/training_curve_<algo>.png
  • 内容:训练过程中每回合的总奖励曲线
  • 特点:自动过滤碰撞惩罚和低异常值,便于观察收敛趋势
  • 用途:评估训练效果,判断是否收敛

奖励曲线(从 CSV 绘制)

  • 文件路径result/reward_curve_saved_<algo>_nocollision.png
  • 内容:从保存的奖励历史 CSV 文件绘制的奖励曲线
  • 特点:默认忽略碰撞惩罚,可查看完整数据(使用 --no-ignore-collision
  • 用途:分析训练收敛趋势,对比不同算法的表现

全局轨迹 GIF

  • 文件路径result/display_global_<algo>.gif
  • 内容:显示整个赛道和车辆轨迹的动画
  • 特点:每隔 5 步采样一帧,显示车辆在赛道上的全局运动
  • 用途:观察车辆是否成功完成赛道,评估轨迹质量

信息视图 GIF

  • 文件路径result/display_info_<algo>.gif
  • 内容:左侧显示车辆局部视角,右侧显示三个误差曲线(横向误差、航向误差、转向角)
  • 特点:同时显示车辆状态和误差信息,便于观察细节
  • 用途:分析控制质量,评估误差大小和平滑性

性能指标(控制台输出)

测试完成后自动输出以下性能指标:

  • 平均横向误差:车辆到参考路径的平均距离(米),越小越好
  • 平均航向误差:车辆航向与参考路径切向的平均偏差(度),越小越好
  • 转角标准差:转向角的标准差(度),越小越好,表示控制更稳定
  • 转角平滑性:转向角一阶差分绝对值均值(度),越小越好,表示控制更平滑

奖励历史 CSV

  • 文件路径result/train_data/reward_history_<algo>.csv
  • 内容:每回合的总奖励(逗号分隔,每行一个值)
  • 用途:用于后续分析和自定义绘图

算法对比

算法 动作空间 探索策略 训练稳定性 控制平滑性 适用场景
DQN 离散(17 个动作) epsilon-greedy 中等 中等(可能抖动) 快速验证、教学演示
DDQN 离散(17 个动作) epsilon-greedy 中等 中等(可能抖动) 算法对比、性能优化
DDPG 连续(直接输出转角) 高斯噪声 中等 高(平滑连续) 实际应用、平滑控制
TD3 连续(直接输出转角) 高斯噪声 高(平滑连续) 实际应用、稳定训练
SAC 连续(直接输出转角) 最大熵强化学习 高(平滑连续) 复杂环境、高探索需求
A2C 离散(17 个动作) 策略熵正则化 中等 中等 快速验证、算法对比
A3C 离散(17 个动作) 策略熵正则化 中等 中等 快速验证、算法对比
TRPO 离散(17 个动作) 策略熵正则化 高(理论保证) 中等 稳定训练、理论研究
PPO 离散(17 个动作) 策略熵正则化 中等 稳定训练、实际应用
GRPO 离散(17 个动作) 策略熵正则化 中等 中等 快速验证、简化实现

选择建议:

  • 初学者:推荐 DQN,易于理解,训练稳定
  • 算法对比:推荐 DDQN,解决 Q 值高估问题,性能通常优于 DQN
  • 实际应用(连续动作):推荐 TD3 或 SAC,控制平滑,训练更稳定
  • 实际应用(离散动作):推荐 PPO,实现简单,性能通常与 TRPO 相当或更好
  • 稳定训练:推荐 TRPO,理论保证,训练更稳定
  • 快速验证:推荐 A2C 或 GRPO,实现简单,训练快速

命令行参数详解

通用参数

  • --mode:运行模式

    • train:仅训练,生成模型和训练曲线
    • test:仅测试,加载模型并生成 GIF 和性能指标
    • both:先训练再测试,完整流程
    • preview:仅预览赛道几何,不进行训练或测试
    • plot_rewards:从保存的奖励 CSV 文件绘制曲线
  • --algo:选择算法(可选)

    • dqn:Deep Q-Network,离散动作
    • ddqn:Double Deep Q-Network,离散动作
    • ddpg:Deep Deterministic Policy Gradient,连续动作
    • td3:Twin Delayed Deep Deterministic Policy Gradient,连续动作
    • sac:Soft Actor-Critic,连续动作
    • a2c:Advantage Actor-Critic,离散动作
    • a3c:Asynchronous Advantage Actor-Critic,离散动作
    • trpo:Trust Region Policy Optimization,离散动作
    • ppo:Proximal Policy Optimization,离散动作
    • grpo:Group Relative Policy Optimization,离散动作
    • 如果未指定,使用 config.py 中的 ALGORITHM 默认值
  • --model_path:模型路径(可选)

    • 训练时:模型保存路径(未指定则使用默认文件名)
    • 测试时:模型加载路径(未指定则使用默认文件名)
    • 支持绝对路径、相对路径(相对于 model/ 目录)

训练模式参数

  • --model_path:自定义模型保存路径
    • 示例:--model_path my_model_dqn.pth
    • 未指定时使用默认路径:model/<algo>_autodrive.pth

测试模式参数

  • --model_path:模型加载路径(必需)
    • 示例:--model_path model/dqn_autodrive.pth
    • 必须与 --algo 参数对应的算法匹配

预览模式参数

  • --preview_path:保存路径(可选)
    • 示例:--preview_path result/track_preview.png
    • 未指定时弹窗显示,不保存文件

绘图模式参数

  • --reward_csv:奖励 CSV 文件路径(可选)

    • 示例:--reward_csv result/train_data/reward_history_dqn.csv
    • 未指定时使用默认路径:result/train_data/reward_history_<algo>.csv
  • --ignore_collision / --no-ignore-collision:是否忽略碰撞惩罚

    • 默认:--ignore_collision(忽略碰撞惩罚和低异常值)
    • 使用 --no-ignore-collision 查看完整原始数据

奖励函数详解

奖励函数设计用于引导智能体学习轨迹跟踪任务,综合考虑多个目标。

奖励函数公式

R = R_lateral + R_heading - R_steer + R_finish(如果完成)或 R_collision(如果碰撞)

各奖励项说明

  1. 横向误差奖励(R_lateral)

    • 公式:R_lateral = REWARD_LATERAL_GAIN * exp(-3 * lateral_error)
    • 作用:鼓励车辆贴近中心线
    • 特点:指数衰减,对偏离中心线敏感
    • 调参建议:
      • 调大(>5.0):更强调贴近中心线,策略更保守
      • 调小(❤️.0):对横向误差不敏感,策略更激进
      • 建议范围:3.0 ~ 8.0
  2. 航向误差奖励(R_heading)

    • 公式:R_heading = REWARD_HEADING_GAIN * cos(heading_error)
    • 作用:鼓励车辆航向与赛道切线对齐
    • 特点:余弦函数,平滑过渡
    • 调参建议:
      • 调大(>3.0):更强调航向对齐,转向更平滑
      • 调小(<1.5):对航向误差不敏感,可能抖动
      • 建议范围:1.5 ~ 4.0
  3. 转向惩罚(R_steer)

    • 公式:R_steer = REWARD_STEER_PENALTY * |delta|
    • 作用:鼓励小转角,提高控制平滑性
    • 特点:线性惩罚,转角越大惩罚越大
    • 调参建议:
      • 调大(>1.5):鼓励小转角,控制更平滑但可能反应慢
      • 调小(<0.5):允许大转角,控制更灵活但可能抖动
      • 建议范围:0.5 ~ 2.0
  4. 碰撞惩罚(R_collision)

    • 公式:碰撞时直接设置 reward = REWARD_COLLISION
    • 作用:强烈惩罚碰撞,鼓励避免碰撞
    • 特点:覆盖其他奖励项,立即终止 episode
    • 调参建议:
      • 调大(<-15):强烈惩罚碰撞,但可能导致梯度稀疏
      • 调小(>-5):碰撞惩罚不足,可能频繁碰撞
      • 建议范围:-15 ~ -5
  5. 完赛奖励(R_finish)

    • 公式:完成赛道时 reward += REWARD_FINISH_BONUS
    • 作用:鼓励完成任务,提供正向激励
    • 特点:仅在完成赛道时添加,不影响中途奖励
    • 调参建议:
      • 调大(>30):强烈鼓励完成任务,但可能忽视中途质量
      • 调小(<10):完赛激励不足,可能难以完成任务
      • 建议范围:10 ~ 30

奖励函数调参策略

  1. 初期训练:适当增大 REWARD_LATERAL_GAINREWARD_HEADING_GAIN,引导智能体快速学习基本跟踪
  2. 稳定训练:平衡各项权重,避免过度偏向某一项
  3. 精细调优:根据实际表现微调权重,例如:
    • 如果车辆频繁碰撞:增大 REWARD_COLLISION 绝对值
    • 如果控制抖动:增大 REWARD_STEER_PENALTY
    • 如果无法完成任务:增大 REWARD_FINISH_BONUS

性能评估详解

评估指标说明

测试完成后,系统自动计算并输出以下性能指标:

  1. 平均横向误差(Mean Lateral Error)

    • 单位:米(m)
    • 定义:车辆到参考路径的平均距离(绝对值)
    • 计算公式:mean(|lateral_error|)
    • 评估标准:越小越好,理想值 < 0.2 m
    • 物理意义:衡量车辆是否贴近中心线
  2. 平均航向误差(Mean Heading Error)

    • 单位:度(deg)
    • 定义:车辆航向与参考路径切向的平均偏差(绝对值)
    • 计算公式:mean(|heading_error|)
    • 评估标准:越小越好,理想值 < 2.0 deg
    • 物理意义:衡量车辆航向是否对齐赛道
  3. 转角标准差(Steer Angle Standard Deviation)

    • 单位:度(deg)
    • 定义:转向角序列的标准差
    • 计算公式:std(steer_angles)
    • 评估标准:越小越好,理想值 < 5.0 deg
    • 物理意义:衡量控制稳定性,标准差小表示转角波动小
  4. 转角平滑性(Steer Angle Smoothness)

    • 单位:度(deg)
    • 定义:转向角一阶差分绝对值均值
    • 计算公式:mean(|diff(steer_angles)|)
    • 评估标准:越小越好,理想值 < 3.0 deg
    • 物理意义:衡量控制平滑性,平滑性小表示转角变化小

性能指标解读

  • 优秀表现:平均横向误差 < 0.15 m,平均航向误差 < 1.5 deg,转角标准差 < 4.0 deg,转角平滑性 < 2.5 deg
  • 良好表现:平均横向误差 < 0.25 m,平均航向误差 < 3.0 deg,转角标准差 < 8.0 deg,转角平滑性 < 5.0 deg
  • 需要改进:平均横向误差 > 0.3 m,平均航向误差 > 5.0 deg,转角标准差 > 10.0 deg,转角平滑性 > 8.0 deg

调参指南

训练不收敛

症状:训练曲线波动大,奖励不上升或下降

解决方案:

  1. 降低学习率:减小 LR(DQN)或 DDPG_ACTOR_LR / DDPG_CRITIC_LR(DDPG)
  2. 增大批大小:增大 BATCH_SIZE(DQN)或 DDPG_BATCH_SIZE(DDPG),提高训练稳定性
  3. 调整探索策略
    • DQN:增大 EPSILON_DECAY,延长探索时间
    • DDPG:增大 DDPG_NOISE_STD,增强探索
  4. 检查奖励权重:确保奖励权重合理,避免某项权重过大导致训练不稳定

控制抖动

症状:测试时车辆转向角频繁变化,控制不平滑

解决方案:

  1. 增大转向惩罚:增大 REWARD_STEER_PENALTY,鼓励小转角
  2. 使用 DDPG:DDPG 输出连续动作,控制更平滑
  3. 调整车辆参数:减小 VEHICLE_MAX_STEER_DEG,限制最大转角
  4. 增加航向奖励:增大 REWARD_HEADING_GAIN,鼓励航向对齐

频繁碰撞

症状:测试时车辆频繁撞到赛道边界

解决方案:

  1. 增大碰撞惩罚:增大 REWARD_COLLISION 绝对值,强烈惩罚碰撞
  2. 增大横向奖励:增大 REWARD_LATERAL_GAIN,更强调贴近中心线
  3. 使用简单赛道:先用 circlesine 赛道测试,验证模型是否正常
  4. 检查模型加载:确保 --algo 参数与模型对应

无法完成任务

症状:训练后车辆无法完成赛道,经常超时

解决方案:

  1. 增加训练回合数:增大 EPISODES_MAP 中的对应值
  2. 增大完赛奖励:增大 REWARD_FINISH_BONUS,鼓励完成任务
  3. 调整探索策略:确保有足够的探索,发现完成任务的方法
  4. 使用简单赛道:先用 circle 赛道训练,验证算法是否正常工作

收敛速度慢

症状:训练曲线上升缓慢,需要很长时间才能收敛

解决方案:

  1. 增大学习率:适当增大 LRDDPG_ACTOR_LR / DDPG_CRITIC_LR
  2. 减小批大小:减小 BATCH_SIZE,加快更新频率
  3. 调整目标网络更新频率
    • DQN:减小 TARGET_UPDATE,更频繁更新目标网络
    • DDPG:增大 DDPG_TAU,更快跟随在线网络
  4. 优化奖励函数:调整奖励权重,使奖励信号更清晰

常见问题

Q1: 训练时奖励一直很低,怎么办?

可能原因:

  • 奖励权重配置不合理
  • 学习率过大或过小
  • 探索不足,无法发现好的策略
  • 赛道难度过高

解决方案:

  • 检查奖励权重配置(REWARD_LATERAL_GAINREWARD_HEADING_GAIN 等)
  • 尝试调整学习率(LRDDPG_ACTOR_LR / DDPG_CRITIC_LR
  • 增加训练回合数(EPISODES_MAP
  • 检查赛道难度是否过高(可先用 circle 赛道测试)
  • 检查探索策略参数(EPSILON_DECAYDDPG_NOISE_STD 等)

Q2: 测试时车辆频繁碰撞,怎么办?

可能原因:

  • 模型未正确加载或算法不匹配
  • 赛道难度过高
  • 车辆参数不合理
  • 模型训练不充分

解决方案:

  • 检查模型是否正确加载(--algo 参数需与模型对应)
  • 尝试使用更简单的赛道(circlesine
  • 检查车辆参数是否合理(VEHICLE_MAX_STEER_DEGMAX_SPEED 等)
  • 检查训练曲线,确认模型是否收敛
  • 尝试重新训练,增加训练回合数

Q3: 如何对比不同算法的性能?

对比方法:

  1. 使用相同的训练条件

    • 相同的训练回合数
    • 相同的超参数(如果可能)
    • 相同的赛道和车辆参数
  2. 查看训练曲线

    • 对比收敛速度(奖励上升速度)
    • 对比最终奖励水平
    • 对比训练稳定性(曲线波动程度)
  3. 查看测试性能指标

    • 平均横向误差(越小越好)
    • 平均航向误差(越小越好)
    • 转角标准差(越小越好)
    • 转角平滑性(越小越好)
  4. 查看可视化结果

    • 对比 GIF 动画,观察控制质量
    • 对比轨迹是否平滑
    • 对比是否成功完成任务

Q4: 如何自定义赛道?

方法 1:修改现有赛道参数

  • 修改 src/config.py 中的赛道参数
    • 圆形赛道:CIRCLE_RADIUS
    • 正弦赛道:SINE_X_STARTSINE_X_ENDSINE_AMPLITUDESINE_PERIODS
    • 复合赛道:COMP_L1COMP_R1COMP_L2
    • 掉头赛道:TURN_L1TURN_R1TURN_L2

方法 2:添加新赛道类型

  • src/track.pybuild_track 函数中添加新的赛道类型
  • 参考现有赛道的实现方式
  • config.py 中添加对应的参数配置

Q5: 如何继续训练已保存的模型?

当前限制:

  • 当前版本不支持直接继续训练
  • 需要重新训练,但可以加载模型权重作为初始化

实现继续训练的方法:

  1. 修改 main.pytrain 函数
  2. 在创建智能体后,加载已保存的模型权重
  3. 继续训练循环,从上次停止的地方继续

示例代码:

# 在 train() 函数中,创建智能体后添加:
if os.path.exists(model_path):
    agent.load_model(model_path)
    print(f"已加载模型: {model_path},继续训练...")

Q6: 如何在不同赛道间迁移模型?

迁移策略:

  1. 直接测试:在简单赛道上训练的模型,可以在更复杂的赛道上测试
  2. 微调训练:在复杂赛道上继续训练,使用较小的学习率
  3. 重新训练:在不同赛道上重新训练,获得最佳性能

注意事项:

  • 不同赛道的难度差异较大,直接迁移可能效果不佳
  • 建议在目标赛道上重新训练或微调

Q7: 训练时间需要多久?

时间估算:

  • DQN/DDQN/DDPG/TD3/SAC:约 30-60 分钟(2000 回合,CPU)
  • A2C/A3C/PPO/GRPO:约 1-2 小时(3000 回合,CPU)
  • TRPO:约 2-4 小时(5000 回合,CPU)

加速方法:

  • 使用 GPU 可显著加速(特别是 TRPO)
  • 减少训练回合数(仅用于快速测试)
  • 减小批大小(可能影响稳定性)

Q8: 如何保存和加载自定义模型?

保存模型:

python main.py --mode train --algo dqn --model_path my_custom_model.pth

加载模型:

python main.py --mode test --algo dqn --model_path my_custom_model.pth

注意事项:

  • 模型文件名需与算法对应
  • 保存路径可以是绝对路径或相对路径(相对于 model/ 目录)

代码结构详解

模块依赖关系

main.py
  ├── src/config.py (配置参数)
  ├── src/env.py (环境)
  │     ├── src/track.py (赛道生成)
  │     └── src/vehicle.py (车辆模型)
  ├── src/dqn.py (DQN 智能体)
  ├── src/ddpg.py (DDPG 智能体)
  └── src/trpo.py (TRPO 智能体)

数据流

  1. 训练流程

    环境初始化 → 智能体选择动作 → 环境执行动作 → 计算奖励 → 存储经验 → 更新网络 → 重复
    
  2. 测试流程

    加载模型 → 环境初始化 → 智能体推理动作 → 环境执行动作 → 渲染帧 → 生成 GIF → 计算性能指标
    

关键数据结构

  • 状态(State)[横向偏移/路宽, 航向偏差/π],归一化到 [-1, 1] 范围
  • 动作(Action)
    • DQN/TRPO:离散动作索引(0 到 16,对应 17 个预定义转向角)
    • DDPG:连续转角(弧度,范围 [-action_limit, action_limit])
  • 奖励(Reward):标量,综合考虑横向误差、航向误差、转向惩罚等
  • 经验(Transition)(state, action, reward, next_state, done) 元组

数学原理简介

强化学习基础

马尔可夫决策过程(MDP)

  • 状态空间 S:车辆相对于赛道的状态(横向偏移、航向偏差)
  • 动作空间 A:转向角(离散或连续)
  • 奖励函数 R:根据状态和动作计算奖励
  • 状态转移 P:车辆动力学模型决定下一状态

价值函数

  • 状态价值函数 V(s):从状态 s 开始,遵循策略 π 的期望累积奖励
  • 动作价值函数 Q(s,a):在状态 s 执行动作 a,然后遵循策略 π 的期望累积奖励
  • 最优策略:选择使 Q(s,a) 最大的动作

DQN 算法原理

核心思想:使用深度神经网络近似 Q 函数

关键公式

  • TD 目标y = r + γ * max_a' Q_target(s',a')
  • 损失函数L = SmoothL1Loss(Q(s,a), y)
  • 动作选择a = argmax_a Q(s,a)(利用)或随机(探索)

关键技术

  • 经验回放:打破时间相关性,提高样本效率
  • 目标网络:提供稳定的 TD 目标,避免自举带来的不稳定性
  • epsilon-greedy:平衡探索与利用

DDPG 算法原理

核心思想:Actor-Critic 架构,Actor 输出确定性动作,Critic 评估 Q 值

关键公式

  • TD 目标y = r + γ * Q'(s', μ'(s'))
  • Critic 损失L_critic = MSE(Q(s,a), y)
  • Actor 损失L_actor = -Q(s, μ(s))(最大化 Q 值)
  • 软更新θ' ← τθ + (1-τ)θ',其中 τ 很小(5e-3)

关键技术

  • 确定性策略:相同状态总是输出相同动作
  • 高斯噪声探索:训练时在策略输出上叠加噪声
  • 软更新:目标网络缓慢跟随在线网络,保持稳定

TRPO 算法原理

核心思想:在 KL 散度约束下最大化策略性能,保证单调改进

关键公式

  • Surrogate 目标L(θ) = E[ratio * A],其中 ratio = π_new(a|s) / π_old(a|s)
  • KL 约束KL(π_old || π_new) ≤ δ
  • GAE 优势估计A_t = δ_t + (γλ)δ_{t+1} + (γλ)²δ_{t+2} + ...

关键技术

  • 共轭梯度:高效求解 KL 约束下的搜索方向
  • 线搜索:找到满足改进条件的最大步长
  • GAE:降低优势估计的方差

扩展与定制

添加新算法

  1. src/ 目录下创建新算法文件(如 src/ppo.py
  2. 实现智能体类,包含 __init__actstore_transitionupdatesave_modelload_model 方法
  3. main.py 中添加算法导入和实例化逻辑
  4. config.py 中添加算法超参数
  5. 更新 README.mddoc/QUICK_START.md

添加新赛道

  1. src/track.pybuild_track 函数中添加新赛道类型
  2. 实现赛道几何生成逻辑(中心线、切向角、内外边界、终点线)
  3. config.py 中添加赛道参数
  4. 更新 README.md 中的赛道说明

修改奖励函数

  1. src/env.pystepstep_continuous 函数中修改奖励计算逻辑
  2. config.py 中添加新的奖励权重参数
  3. 更新 README.md 中的奖励函数说明

修改车辆模型

  1. src/vehicle.py 中修改车辆动力学模型
  2. config.py 中添加新的车辆参数
  3. 更新相关文档说明

性能优化建议

训练加速

  1. 使用 GPU:自动检测 CUDA,显著加速训练
  2. 减小批大小:虽然可能影响稳定性,但可以加快更新频率
  3. 减少训练回合数:仅用于快速测试,不建议用于最终训练
  4. 优化网络结构:减小网络层数和宽度,加快前向传播

内存优化

  1. 减小经验池大小:减少 MEMORY_SIZEDDPG_MEMORY_SIZE
  2. 减小批大小:减少 BATCH_SIZEDDPG_BATCH_SIZE
  3. 减少采样点数:减少赛道采样点数(SINE_SAMPLESCOMP_SAMPLES_PER_SEG 等)

稳定性提升

  1. 梯度裁剪:已实现,防止梯度爆炸
  2. 目标网络:DQN 和 DDPG 都使用目标网络,保持稳定
  3. KL 约束:TRPO 使用 KL 约束,保证单调改进
  4. 奖励归一化:可以添加奖励归一化,提高训练稳定性

贡献与反馈

欢迎提交 Issue 和 Pull Request,共同完善项目!

贡献方式:

  • 报告 Bug:在 GitHub Issues 中提交问题报告
  • 提出建议:在 GitHub Issues 中提出功能建议
  • 提交代码:Fork 项目,创建分支,提交 Pull Request
  • 完善文档:改进 README、注释、文档等

代码规范:

  • 遵循 PEP 8 Python 代码规范
  • 添加详细的中文注释
  • 保持代码风格一致

许可证

本项目采用 MIT 许可证,详见 LICENSE 文件。

致谢

感谢所有为强化学习和车辆控制领域做出贡献的研究者和开发者!

使用场景与案例

场景 1:算法对比研究

目标:对比 DQN、DDPG、TRPO 三种算法的性能

步骤:

  1. 使用相同的训练条件训练三种算法
  2. 对比训练曲线,分析收敛速度
  3. 对比测试性能指标,评估控制质量
  4. 查看 GIF 动画,观察控制平滑性

示例命令:

# 训练三种算法
python main.py --mode train --algo dqn
python main.py --mode train --algo ddpg
python main.py --mode train --algo trpo

# 测试并对比性能
python main.py --mode test --algo dqn --model_path model/dqn_autodrive.pth
python main.py --mode test --algo ddpg --model_path model/ddpg_autodrive.pth
python main.py --mode test --algo trpo --model_path model/trpo_autodrive.pth

场景 2:超参数调优

目标:优化算法性能,提高控制质量

步骤:

  1. 确定调优目标(例如:减少横向误差、提高控制平滑性)
  2. 修改 config.py 中的相关超参数
  3. 重新训练模型
  4. 测试并评估性能改进
  5. 迭代调优,直到达到目标

调优建议:

  • 一次只调整一个或少数几个参数
  • 记录每次调优的结果,便于对比
  • 使用默认参数作为基准,逐步优化

场景 3:新赛道测试

目标:测试算法在新赛道上的泛化能力

步骤:

  1. 在简单赛道上训练模型(例如:sine
  2. 修改 config.py 中的 TRACK_MODE 为复杂赛道(例如:composite
  3. 测试模型在新赛道上的表现
  4. 分析性能差异,评估泛化能力

注意事项:

  • 不同赛道的难度差异较大,可能需要重新训练或微调
  • 建议先在简单赛道上训练,再在复杂赛道上测试

场景 4:教学演示

目标:用于强化学习课程教学,展示算法原理

步骤:

  1. 使用默认参数快速训练模型
  2. 展示训练曲线,说明收敛过程
  3. 展示 GIF 动画,说明控制效果
  4. 讲解代码实现,说明算法原理

教学要点:

  • 强调算法差异(离散 vs 连续动作)
  • 说明探索策略(epsilon-greedy vs 高斯噪声)
  • 解释奖励函数设计
  • 展示性能评估指标

最佳实践

训练最佳实践

  1. 从简单开始

    • 先用 circle 赛道快速验证代码是否正常工作
    • 再用 sine 赛道进行正式训练
    • 最后在复杂赛道上测试泛化能力
  2. 监控训练过程

    • 定期查看训练曲线,判断是否收敛
    • 关注奖励变化趋势,而非单个回合的奖励
    • 如果奖励长期不上升,考虑调整超参数
  3. 保存中间结果

    • 定期保存模型权重,避免训练中断导致丢失
    • 保存奖励历史 CSV,便于后续分析
    • 记录超参数配置,便于复现结果
  4. 合理设置训练回合数

    • DQN/DDPG:建议 2000-3000 回合
    • TRPO:建议 5000-8000 回合(on-policy 算法需要更多回合)
    • 可根据训练曲线判断是否需要更多回合

测试最佳实践

  1. 使用评估模式

    • 测试时使用 eval_mode=True,无探索,保证可重复性
    • 多次测试结果应该一致(如果随机初始化,结果可能略有差异)
  2. 多赛道测试

    • 在训练赛道上测试,验证基本功能
    • 在其他赛道上测试,评估泛化能力
    • 对比不同赛道上的性能差异
  3. 性能指标分析

    • 关注多个指标,而非单一指标
    • 横向误差和航向误差反映跟踪精度
    • 转角标准差和平滑性反映控制质量
    • 综合考虑各项指标,评估整体性能

调参最佳实践

  1. 系统性调参

    • 先调整奖励权重,确保奖励信号合理
    • 再调整学习率,平衡收敛速度和稳定性
    • 最后调整其他超参数,精细优化
  2. 记录调参历史

    • 记录每次调参的参数值和结果
    • 便于对比不同配置的效果
    • 避免重复尝试无效的配置
  3. 使用默认参数作为起点

    • 默认参数经过调优,适合大多数场景
    • 在默认参数基础上微调,而非大幅改动
    • 除非有明确目标,否则不建议大幅修改

故障排除详细步骤

问题 1:训练时程序崩溃

排查步骤:

  1. 检查依赖安装

    python -c "import torch; import numpy; import matplotlib; import imageio; from PIL import Image; print('依赖检查通过')"
    
  2. 检查 Python 版本

    python --version  # 应该是 3.8 或更高
    
  3. 检查内存使用

    • 减小经验池大小(MEMORY_SIZEDDPG_MEMORY_SIZE
    • 减小批大小(BATCH_SIZEDDPG_BATCH_SIZE
    • 减少赛道采样点数
  4. 查看错误信息

    • 仔细阅读错误堆栈,定位问题
    • 检查是否是参数配置错误
    • 检查是否是文件路径错误

问题 2:训练曲线异常

排查步骤:

  1. 检查奖励权重

    • 确保奖励权重合理,避免某项权重过大
    • 检查奖励函数是否正常计算
  2. 检查探索策略

    • DQN:检查 epsilon 衰减是否正常
    • DDPG:检查噪声衰减是否正常
    • TRPO:检查策略熵是否正常
  3. 检查学习率

    • 学习率过大可能导致训练不稳定
    • 学习率过小可能导致收敛缓慢
    • 建议使用默认学习率,或小幅调整
  4. 检查网络结构

    • 确保网络结构合理
    • 检查是否有梯度消失或爆炸

问题 3:测试时性能不佳

排查步骤:

  1. 检查模型加载

    • 确认模型文件存在
    • 确认 --algo 参数与模型对应
    • 检查模型是否完整加载(无错误信息)
  2. 检查训练质量

    • 查看训练曲线,确认模型是否收敛
    • 查看最终奖励水平,判断训练是否充分
    • 如果训练不充分,增加训练回合数
  3. 检查测试条件

    • 确认测试赛道与训练赛道是否匹配
    • 如果测试赛道更复杂,可能需要重新训练
    • 检查车辆参数是否合理
  4. 对比不同算法

    • 如果某个算法性能不佳,尝试其他算法
    • 不同算法适合不同场景,选择最适合的算法

更新日志

2026-01-06

  • 初始版本发布
  • 支持 DQN、DDQN、DDPG、TD3、SAC、A2C、A3C、TRPO、PPO、GRPO 十种算法
  • 支持四种赛道类型(circle、sine、composite、turnaround)
  • 完整的训练、测试、可视化功能
  • 详细的中文注释和文档
  • 完整的性能评估和故障排除指南
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐