基于深度强化学习的车辆轨迹跟踪控制(端到端)
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(如果碰撞)
各奖励项说明
-
横向误差奖励(R_lateral)
- 公式:
R_lateral = REWARD_LATERAL_GAIN * exp(-3 * lateral_error) - 作用:鼓励车辆贴近中心线
- 特点:指数衰减,对偏离中心线敏感
- 调参建议:
- 调大(>5.0):更强调贴近中心线,策略更保守
- 调小(❤️.0):对横向误差不敏感,策略更激进
- 建议范围:3.0 ~ 8.0
- 公式:
-
航向误差奖励(R_heading)
- 公式:
R_heading = REWARD_HEADING_GAIN * cos(heading_error) - 作用:鼓励车辆航向与赛道切线对齐
- 特点:余弦函数,平滑过渡
- 调参建议:
- 调大(>3.0):更强调航向对齐,转向更平滑
- 调小(<1.5):对航向误差不敏感,可能抖动
- 建议范围:1.5 ~ 4.0
- 公式:
-
转向惩罚(R_steer)
- 公式:
R_steer = REWARD_STEER_PENALTY * |delta| - 作用:鼓励小转角,提高控制平滑性
- 特点:线性惩罚,转角越大惩罚越大
- 调参建议:
- 调大(>1.5):鼓励小转角,控制更平滑但可能反应慢
- 调小(<0.5):允许大转角,控制更灵活但可能抖动
- 建议范围:0.5 ~ 2.0
- 公式:
-
碰撞惩罚(R_collision)
- 公式:碰撞时直接设置
reward = REWARD_COLLISION - 作用:强烈惩罚碰撞,鼓励避免碰撞
- 特点:覆盖其他奖励项,立即终止 episode
- 调参建议:
- 调大(<-15):强烈惩罚碰撞,但可能导致梯度稀疏
- 调小(>-5):碰撞惩罚不足,可能频繁碰撞
- 建议范围:-15 ~ -5
- 公式:碰撞时直接设置
-
完赛奖励(R_finish)
- 公式:完成赛道时
reward += REWARD_FINISH_BONUS - 作用:鼓励完成任务,提供正向激励
- 特点:仅在完成赛道时添加,不影响中途奖励
- 调参建议:
- 调大(>30):强烈鼓励完成任务,但可能忽视中途质量
- 调小(<10):完赛激励不足,可能难以完成任务
- 建议范围:10 ~ 30
- 公式:完成赛道时
奖励函数调参策略
- 初期训练:适当增大
REWARD_LATERAL_GAIN和REWARD_HEADING_GAIN,引导智能体快速学习基本跟踪 - 稳定训练:平衡各项权重,避免过度偏向某一项
- 精细调优:根据实际表现微调权重,例如:
- 如果车辆频繁碰撞:增大
REWARD_COLLISION绝对值 - 如果控制抖动:增大
REWARD_STEER_PENALTY - 如果无法完成任务:增大
REWARD_FINISH_BONUS
- 如果车辆频繁碰撞:增大
性能评估详解
评估指标说明
测试完成后,系统自动计算并输出以下性能指标:
-
平均横向误差(Mean Lateral Error)
- 单位:米(m)
- 定义:车辆到参考路径的平均距离(绝对值)
- 计算公式:
mean(|lateral_error|) - 评估标准:越小越好,理想值 < 0.2 m
- 物理意义:衡量车辆是否贴近中心线
-
平均航向误差(Mean Heading Error)
- 单位:度(deg)
- 定义:车辆航向与参考路径切向的平均偏差(绝对值)
- 计算公式:
mean(|heading_error|) - 评估标准:越小越好,理想值 < 2.0 deg
- 物理意义:衡量车辆航向是否对齐赛道
-
转角标准差(Steer Angle Standard Deviation)
- 单位:度(deg)
- 定义:转向角序列的标准差
- 计算公式:
std(steer_angles) - 评估标准:越小越好,理想值 < 5.0 deg
- 物理意义:衡量控制稳定性,标准差小表示转角波动小
-
转角平滑性(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
调参指南
训练不收敛
症状:训练曲线波动大,奖励不上升或下降
解决方案:
- 降低学习率:减小
LR(DQN)或DDPG_ACTOR_LR/DDPG_CRITIC_LR(DDPG) - 增大批大小:增大
BATCH_SIZE(DQN)或DDPG_BATCH_SIZE(DDPG),提高训练稳定性 - 调整探索策略:
- DQN:增大
EPSILON_DECAY,延长探索时间 - DDPG:增大
DDPG_NOISE_STD,增强探索
- DQN:增大
- 检查奖励权重:确保奖励权重合理,避免某项权重过大导致训练不稳定
控制抖动
症状:测试时车辆转向角频繁变化,控制不平滑
解决方案:
- 增大转向惩罚:增大
REWARD_STEER_PENALTY,鼓励小转角 - 使用 DDPG:DDPG 输出连续动作,控制更平滑
- 调整车辆参数:减小
VEHICLE_MAX_STEER_DEG,限制最大转角 - 增加航向奖励:增大
REWARD_HEADING_GAIN,鼓励航向对齐
频繁碰撞
症状:测试时车辆频繁撞到赛道边界
解决方案:
- 增大碰撞惩罚:增大
REWARD_COLLISION绝对值,强烈惩罚碰撞 - 增大横向奖励:增大
REWARD_LATERAL_GAIN,更强调贴近中心线 - 使用简单赛道:先用
circle或sine赛道测试,验证模型是否正常 - 检查模型加载:确保
--algo参数与模型对应
无法完成任务
症状:训练后车辆无法完成赛道,经常超时
解决方案:
- 增加训练回合数:增大
EPISODES_MAP中的对应值 - 增大完赛奖励:增大
REWARD_FINISH_BONUS,鼓励完成任务 - 调整探索策略:确保有足够的探索,发现完成任务的方法
- 使用简单赛道:先用
circle赛道训练,验证算法是否正常工作
收敛速度慢
症状:训练曲线上升缓慢,需要很长时间才能收敛
解决方案:
- 增大学习率:适当增大
LR或DDPG_ACTOR_LR/DDPG_CRITIC_LR - 减小批大小:减小
BATCH_SIZE,加快更新频率 - 调整目标网络更新频率:
- DQN:减小
TARGET_UPDATE,更频繁更新目标网络 - DDPG:增大
DDPG_TAU,更快跟随在线网络
- DQN:减小
- 优化奖励函数:调整奖励权重,使奖励信号更清晰
常见问题
Q1: 训练时奖励一直很低,怎么办?
可能原因:
- 奖励权重配置不合理
- 学习率过大或过小
- 探索不足,无法发现好的策略
- 赛道难度过高
解决方案:
- 检查奖励权重配置(
REWARD_LATERAL_GAIN、REWARD_HEADING_GAIN等) - 尝试调整学习率(
LR或DDPG_ACTOR_LR/DDPG_CRITIC_LR) - 增加训练回合数(
EPISODES_MAP) - 检查赛道难度是否过高(可先用
circle赛道测试) - 检查探索策略参数(
EPSILON_DECAY、DDPG_NOISE_STD等)
Q2: 测试时车辆频繁碰撞,怎么办?
可能原因:
- 模型未正确加载或算法不匹配
- 赛道难度过高
- 车辆参数不合理
- 模型训练不充分
解决方案:
- 检查模型是否正确加载(
--algo参数需与模型对应) - 尝试使用更简单的赛道(
circle或sine) - 检查车辆参数是否合理(
VEHICLE_MAX_STEER_DEG、MAX_SPEED等) - 检查训练曲线,确认模型是否收敛
- 尝试重新训练,增加训练回合数
Q3: 如何对比不同算法的性能?
对比方法:
-
使用相同的训练条件:
- 相同的训练回合数
- 相同的超参数(如果可能)
- 相同的赛道和车辆参数
-
查看训练曲线:
- 对比收敛速度(奖励上升速度)
- 对比最终奖励水平
- 对比训练稳定性(曲线波动程度)
-
查看测试性能指标:
- 平均横向误差(越小越好)
- 平均航向误差(越小越好)
- 转角标准差(越小越好)
- 转角平滑性(越小越好)
-
查看可视化结果:
- 对比 GIF 动画,观察控制质量
- 对比轨迹是否平滑
- 对比是否成功完成任务
Q4: 如何自定义赛道?
方法 1:修改现有赛道参数
- 修改
src/config.py中的赛道参数- 圆形赛道:
CIRCLE_RADIUS - 正弦赛道:
SINE_X_START、SINE_X_END、SINE_AMPLITUDE、SINE_PERIODS - 复合赛道:
COMP_L1、COMP_R1、COMP_L2等 - 掉头赛道:
TURN_L1、TURN_R1、TURN_L2等
- 圆形赛道:
方法 2:添加新赛道类型
- 在
src/track.py的build_track函数中添加新的赛道类型 - 参考现有赛道的实现方式
- 在
config.py中添加对应的参数配置
Q5: 如何继续训练已保存的模型?
当前限制:
- 当前版本不支持直接继续训练
- 需要重新训练,但可以加载模型权重作为初始化
实现继续训练的方法:
- 修改
main.py的train函数 - 在创建智能体后,加载已保存的模型权重
- 继续训练循环,从上次停止的地方继续
示例代码:
# 在 train() 函数中,创建智能体后添加:
if os.path.exists(model_path):
agent.load_model(model_path)
print(f"已加载模型: {model_path},继续训练...")
Q6: 如何在不同赛道间迁移模型?
迁移策略:
- 直接测试:在简单赛道上训练的模型,可以在更复杂的赛道上测试
- 微调训练:在复杂赛道上继续训练,使用较小的学习率
- 重新训练:在不同赛道上重新训练,获得最佳性能
注意事项:
- 不同赛道的难度差异较大,直接迁移可能效果不佳
- 建议在目标赛道上重新训练或微调
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 智能体)
数据流
-
训练流程:
环境初始化 → 智能体选择动作 → 环境执行动作 → 计算奖励 → 存储经验 → 更新网络 → 重复 -
测试流程:
加载模型 → 环境初始化 → 智能体推理动作 → 环境执行动作 → 渲染帧 → 生成 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:降低优势估计的方差
扩展与定制
添加新算法
- 在
src/目录下创建新算法文件(如src/ppo.py) - 实现智能体类,包含
__init__、act、store_transition、update、save_model、load_model方法 - 在
main.py中添加算法导入和实例化逻辑 - 在
config.py中添加算法超参数 - 更新
README.md和doc/QUICK_START.md
添加新赛道
- 在
src/track.py的build_track函数中添加新赛道类型 - 实现赛道几何生成逻辑(中心线、切向角、内外边界、终点线)
- 在
config.py中添加赛道参数 - 更新
README.md中的赛道说明
修改奖励函数
- 在
src/env.py的step或step_continuous函数中修改奖励计算逻辑 - 在
config.py中添加新的奖励权重参数 - 更新
README.md中的奖励函数说明
修改车辆模型
- 在
src/vehicle.py中修改车辆动力学模型 - 在
config.py中添加新的车辆参数 - 更新相关文档说明
性能优化建议
训练加速
- 使用 GPU:自动检测 CUDA,显著加速训练
- 减小批大小:虽然可能影响稳定性,但可以加快更新频率
- 减少训练回合数:仅用于快速测试,不建议用于最终训练
- 优化网络结构:减小网络层数和宽度,加快前向传播
内存优化
- 减小经验池大小:减少
MEMORY_SIZE或DDPG_MEMORY_SIZE - 减小批大小:减少
BATCH_SIZE或DDPG_BATCH_SIZE - 减少采样点数:减少赛道采样点数(
SINE_SAMPLES、COMP_SAMPLES_PER_SEG等)
稳定性提升
- 梯度裁剪:已实现,防止梯度爆炸
- 目标网络:DQN 和 DDPG 都使用目标网络,保持稳定
- KL 约束:TRPO 使用 KL 约束,保证单调改进
- 奖励归一化:可以添加奖励归一化,提高训练稳定性
贡献与反馈
欢迎提交 Issue 和 Pull Request,共同完善项目!
贡献方式:
- 报告 Bug:在 GitHub Issues 中提交问题报告
- 提出建议:在 GitHub Issues 中提出功能建议
- 提交代码:Fork 项目,创建分支,提交 Pull Request
- 完善文档:改进 README、注释、文档等
代码规范:
- 遵循 PEP 8 Python 代码规范
- 添加详细的中文注释
- 保持代码风格一致
许可证
本项目采用 MIT 许可证,详见 LICENSE 文件。
致谢
感谢所有为强化学习和车辆控制领域做出贡献的研究者和开发者!
使用场景与案例
场景 1:算法对比研究
目标:对比 DQN、DDPG、TRPO 三种算法的性能
步骤:
- 使用相同的训练条件训练三种算法
- 对比训练曲线,分析收敛速度
- 对比测试性能指标,评估控制质量
- 查看 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:超参数调优
目标:优化算法性能,提高控制质量
步骤:
- 确定调优目标(例如:减少横向误差、提高控制平滑性)
- 修改
config.py中的相关超参数 - 重新训练模型
- 测试并评估性能改进
- 迭代调优,直到达到目标
调优建议:
- 一次只调整一个或少数几个参数
- 记录每次调优的结果,便于对比
- 使用默认参数作为基准,逐步优化
场景 3:新赛道测试
目标:测试算法在新赛道上的泛化能力
步骤:
- 在简单赛道上训练模型(例如:
sine) - 修改
config.py中的TRACK_MODE为复杂赛道(例如:composite) - 测试模型在新赛道上的表现
- 分析性能差异,评估泛化能力
注意事项:
- 不同赛道的难度差异较大,可能需要重新训练或微调
- 建议先在简单赛道上训练,再在复杂赛道上测试
场景 4:教学演示
目标:用于强化学习课程教学,展示算法原理
步骤:
- 使用默认参数快速训练模型
- 展示训练曲线,说明收敛过程
- 展示 GIF 动画,说明控制效果
- 讲解代码实现,说明算法原理
教学要点:
- 强调算法差异(离散 vs 连续动作)
- 说明探索策略(epsilon-greedy vs 高斯噪声)
- 解释奖励函数设计
- 展示性能评估指标
最佳实践
训练最佳实践
-
从简单开始:
- 先用
circle赛道快速验证代码是否正常工作 - 再用
sine赛道进行正式训练 - 最后在复杂赛道上测试泛化能力
- 先用
-
监控训练过程:
- 定期查看训练曲线,判断是否收敛
- 关注奖励变化趋势,而非单个回合的奖励
- 如果奖励长期不上升,考虑调整超参数
-
保存中间结果:
- 定期保存模型权重,避免训练中断导致丢失
- 保存奖励历史 CSV,便于后续分析
- 记录超参数配置,便于复现结果
-
合理设置训练回合数:
- DQN/DDPG:建议 2000-3000 回合
- TRPO:建议 5000-8000 回合(on-policy 算法需要更多回合)
- 可根据训练曲线判断是否需要更多回合
测试最佳实践
-
使用评估模式:
- 测试时使用
eval_mode=True,无探索,保证可重复性 - 多次测试结果应该一致(如果随机初始化,结果可能略有差异)
- 测试时使用
-
多赛道测试:
- 在训练赛道上测试,验证基本功能
- 在其他赛道上测试,评估泛化能力
- 对比不同赛道上的性能差异
-
性能指标分析:
- 关注多个指标,而非单一指标
- 横向误差和航向误差反映跟踪精度
- 转角标准差和平滑性反映控制质量
- 综合考虑各项指标,评估整体性能
调参最佳实践
-
系统性调参:
- 先调整奖励权重,确保奖励信号合理
- 再调整学习率,平衡收敛速度和稳定性
- 最后调整其他超参数,精细优化
-
记录调参历史:
- 记录每次调参的参数值和结果
- 便于对比不同配置的效果
- 避免重复尝试无效的配置
-
使用默认参数作为起点:
- 默认参数经过调优,适合大多数场景
- 在默认参数基础上微调,而非大幅改动
- 除非有明确目标,否则不建议大幅修改
故障排除详细步骤
问题 1:训练时程序崩溃
排查步骤:
-
检查依赖安装:
python -c "import torch; import numpy; import matplotlib; import imageio; from PIL import Image; print('依赖检查通过')" -
检查 Python 版本:
python --version # 应该是 3.8 或更高 -
检查内存使用:
- 减小经验池大小(
MEMORY_SIZE或DDPG_MEMORY_SIZE) - 减小批大小(
BATCH_SIZE或DDPG_BATCH_SIZE) - 减少赛道采样点数
- 减小经验池大小(
-
查看错误信息:
- 仔细阅读错误堆栈,定位问题
- 检查是否是参数配置错误
- 检查是否是文件路径错误
问题 2:训练曲线异常
排查步骤:
-
检查奖励权重:
- 确保奖励权重合理,避免某项权重过大
- 检查奖励函数是否正常计算
-
检查探索策略:
- DQN:检查 epsilon 衰减是否正常
- DDPG:检查噪声衰减是否正常
- TRPO:检查策略熵是否正常
-
检查学习率:
- 学习率过大可能导致训练不稳定
- 学习率过小可能导致收敛缓慢
- 建议使用默认学习率,或小幅调整
-
检查网络结构:
- 确保网络结构合理
- 检查是否有梯度消失或爆炸
问题 3:测试时性能不佳
排查步骤:
-
检查模型加载:
- 确认模型文件存在
- 确认
--algo参数与模型对应 - 检查模型是否完整加载(无错误信息)
-
检查训练质量:
- 查看训练曲线,确认模型是否收敛
- 查看最终奖励水平,判断训练是否充分
- 如果训练不充分,增加训练回合数
-
检查测试条件:
- 确认测试赛道与训练赛道是否匹配
- 如果测试赛道更复杂,可能需要重新训练
- 检查车辆参数是否合理
-
对比不同算法:
- 如果某个算法性能不佳,尝试其他算法
- 不同算法适合不同场景,选择最适合的算法
更新日志
2026-01-06
- 初始版本发布
- 支持 DQN、DDQN、DDPG、TD3、SAC、A2C、A3C、TRPO、PPO、GRPO 十种算法
- 支持四种赛道类型(circle、sine、composite、turnaround)
- 完整的训练、测试、可视化功能
- 详细的中文注释和文档
- 完整的性能评估和故障排除指南
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)