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

更多推荐