diff --git a/critical/README.md b/critical/README.md new file mode 100644 index 00000000..c298eb85 --- /dev/null +++ b/critical/README.md @@ -0,0 +1,67 @@ +# 基于 CARLA 的极端驾驶仿真场景生成算法研究 +## 项目简介 + +研究并实现极端驾驶场景自动生成算法,定义 10 种典型危险驾驶场景,支持手动构建与强化学习(DQN / PPO 系列)自动生成对抗场景,输出标准 OpenSCENARIO (.xosc) 文件。 + +## 技术栈 + +- 仿真平台:hutb (CARLA 2.9.16) +- 语言:Python 3.7 +- 强化学习:DQN、Attention-DQN、PPO、Smooth-PPO +- 场景标准:ASAM OpenSCENARIO 1.2 + +## 项目结构 + +``` +├── config/ 全局固定参数 +├── env/ 仿真交互环境 + 通用奖励 +├── utils/ 工具函数(传感器/评估/几何) +├── scenarios/ 10 种危险场景定义 +├── rl_algorithms/ 强化学习算法 +├── experiments/ 训练/评估/对比入口 +├── osc_exporter/ OpenSCENARIO 导出 +├── tests/ 单元测试 +└── main.py 统一入口 +``` + +## 10 种危险场景 + +| # | 场景 | 类别 | 核心危险 | +|---|------|------|----------| +| 1 | 暴雨跟车 | 极端天气 | 湿滑路面 + 低能见度 | +| 2 | 浓雾巡航 | 极端天气 | 能见度 < 20m | +| 3 | 夜间黑暗行驶 | 极端天气 | 光照 5% | +| 4 | 前车急刹 | 车辆对抗 | 前车 -8m/s² 急刹 | +| 5 | 旁车加塞 | 车辆对抗 | 强行切入自车车道 | +| 6 | 行人横穿 | 行人危险 | 人行道突然横穿 | +| 7 | 鬼探头 | 行人危险 | 货车盲区突然冲出 | +| 8 | 行人闯红灯 | 行人危险 | 违规横穿 | +| 9 | 夜间行人横穿 | 多因素耦合 | 黑暗 + 行人 | +| 10 | 雾天鬼探头 | 多因素耦合 | 浓雾 + 盲区 | + +## 快速开始 + +```bash +# 1. 启动 CARLA 仿真器 +cd D:\hutb\hutb && CarlaUE4.exe + +# 2. 运行项目 +python main.py + +# 或命令行模式 +python main.py train --algo dqn --scenario rain_storm --episodes 500 +python main.py evaluate --algo smooth_ppo --scenario emergency_brake --model models/xxx.pth +python main.py export --scenario ghost_peek +python main.py test --suite all +``` + +## 环境要求 + +- Windows 10 / Ubuntu 18.04+ +- CARLA 0.9.16 (hutb 定制版) +- Python 3.7 +- PyTorch + NumPy + PyYAML + matplotlib + +## 百度网盘链接 +- 通过网盘分享的文件:carla +- 链接: https://pan.baidu.com/s/1PIzndyc4LrLxvKNImyH9CA?pwd=shju 提取码: shju \ No newline at end of file diff --git a/critical/__init__.py b/critical/__init__.py new file mode 100644 index 00000000..f4aec1c6 --- /dev/null +++ b/critical/__init__.py @@ -0,0 +1,47 @@ +# config/__init__.py +# 全局配置模块统一入口 —— 仅导出公共固定参数 + +from .carla_config import ( + CARLA_HOST, CARLA_PORT, CARLA_TIMEOUT, + SYNC_MODE, SIMULATION_FPS, FIXED_DELTA_SECONDS, + EGO_VEHICLE_BLUEPRINT, ADV_VEHICLE_BLUEPRINT, + DEFAULT_SPAWN_INDEX, + COLLISION_THRESHOLD, MIN_SAFE_DISTANCE, VEHICLE_MAX_SPEED, + RGB_CAMERA_CONFIG, LIDAR_CONFIG, SENSOR_UPDATE_FPS, + MAX_EPISODE_STEPS, EPISODE_TIMEOUT, + COLLISION_PENALTY, SUCCESS_REWARD, + RESULTS_DIR, MODELS_DIR, LOGS_DIR, + SCENARIOS_OUTPUT_DIR, EVALUATION_OUTPUT_DIR, + COMPARISON_OUTPUT_DIR, PLOTS_OUTPUT_DIR, +) + +from .dqn_config import ( + STATE_SIZE as DQN_STATE_SIZE, + ACTION_SIZE as DQN_ACTION_SIZE, + HIDDEN_SIZES as DQN_HIDDEN_SIZES, + ATTENTION_HEAD_DIM, NUM_ATTENTION_HEADS, ATTENTION_DROPOUT, + LEARNING_RATE as DQN_LR, GAMMA as DQN_GAMMA, + TAU as DQN_TAU, TARGET_UPDATE_FREQ, + MEMORY_SIZE, BATCH_SIZE as DQN_BATCH_SIZE, MIN_REPLAY_SIZE, + EPSILON_START, EPSILON_MIN, EPSILON_DECAY, + TRAIN_EVERY_N_STEPS as DQN_TRAIN_EVERY, + MAX_EPISODES as DQN_MAX_EPISODES, + SAVE_EVERY_N_EPISODES as DQN_SAVE_EVERY, + LOG_EVERY_N_EPISODES as DQN_LOG_EVERY, +) + +from .ppo_config import ( + STATE_SIZE as PPO_STATE_SIZE, + ACTION_SIZE as PPO_ACTION_SIZE, ACTION_STD, + HIDDEN_SIZES as PPO_HIDDEN_SIZES, + ACTOR_HIDDEN, CRITIC_HIDDEN, ACTIVATION as PPO_ACTIVATION, + GAMMA as PPO_GAMMA, LAMBDA as PPO_LAMBDA, + EPS_CLIP, UPDATE_EVERY as PPO_UPDATE_EVERY, + UPDATE_POLICY_TIMES, BATCH_SIZE as PPO_BATCH_SIZE, + LR_ACTOR, LR_CRITIC, + SMOOTH_ENABLED, SMOOTH_EPS_LOW, SMOOTH_EPS_HIGH, SMOOTH_BETA, + VALUE_LOSS_COEF, ENTROPY_COEF, MAX_GRAD_NORM, + MAX_EPISODES as PPO_MAX_EPISODES, + SAVE_EVERY_N_EPISODES as PPO_SAVE_EVERY, + LOG_EVERY_N_EPISODES as PPO_LOG_EVERY, +) diff --git a/critical/carla_config.py b/critical/carla_config.py new file mode 100644 index 00000000..4a88a243 --- /dev/null +++ b/critical/carla_config.py @@ -0,0 +1,64 @@ +# config/carla_config.py +# 全局固定参数:CARLA 连接、地图、车型、传感器通用配置、全局路径 +# 按 config/CLAUDE.md 规范 —— 不写入任何场景差异化内容 + +# ============================================================ +# 1. CARLA 连接公共参数 +# ============================================================ +CARLA_HOST = "localhost" +CARLA_PORT = 2000 +CARLA_TIMEOUT = 30.0 + +# 同步模式(强化学习训练必须) +SYNC_MODE = True +SIMULATION_FPS = 20 +FIXED_DELTA_SECONDS = 1.0 / SIMULATION_FPS + +# ============================================================ +# 2. 全局车辆公共参数 +# ============================================================ +EGO_VEHICLE_BLUEPRINT = "vehicle.tesla.model3" +ADV_VEHICLE_BLUEPRINT = "vehicle.audi.a2" + +# 全局默认生成点索引(场景可覆盖) +DEFAULT_SPAWN_INDEX = 0 + +# 碰撞检测阈值 & 控制频率(所有场景共用) +COLLISION_THRESHOLD = 1.5 # 碰撞判定距离 (m) +MIN_SAFE_DISTANCE = 3.0 # 最小安全距离 (m) +VEHICLE_MAX_SPEED = 80.0 # 最高速度 (km/h) + +# ============================================================ +# 3. 全局传感器公共参数 +# ============================================================ +RGB_CAMERA_CONFIG = { + "image_size_x": "640", + "image_size_y": "480", + "fov": "90.0", +} + +LIDAR_CONFIG = { + "points_per_second": "100000", + "range": "50.0", +} + +SENSOR_UPDATE_FPS = 20 # 传感器采集频率(全局统一) + +# ============================================================ +# 4. 训练全局参数(所有算法共用) +# ============================================================ +MAX_EPISODE_STEPS = 500 +EPISODE_TIMEOUT = 60.0 # 单集超时 (s) +COLLISION_PENALTY = -10.0 # 碰撞惩罚 +SUCCESS_REWARD = 10.0 # 安全完成奖励 + +# ============================================================ +# 5. 全局路径 +# ============================================================ +RESULTS_DIR = "results" +MODELS_DIR = "models" +LOGS_DIR = "logs" +SCENARIOS_OUTPUT_DIR = "results/scenarios" +EVALUATION_OUTPUT_DIR = "results/evaluation" +COMPARISON_OUTPUT_DIR = "results/comparison" +PLOTS_OUTPUT_DIR = "results/plots" diff --git a/critical/dqn_config.py b/critical/dqn_config.py new file mode 100644 index 00000000..72d7c171 --- /dev/null +++ b/critical/dqn_config.py @@ -0,0 +1,51 @@ +# config/dqn_config.py +# DQN / Attention-DQN 超参数配置 + +# ============================================================ +# 环境接口 +# ============================================================ +STATE_SIZE = 6 # [ego_x, ego_y, adv_x, adv_y, ego_speed, distance] +ACTION_SIZE = 4 # 0=无操作, 1=左转, 2=右转, 3=制动 + +# ============================================================ +# 网络结构 +# ============================================================ +HIDDEN_SIZES = [256, 256, 128] # 三层全连接隐藏层 +ACTIVATION = "relu" + +# ============================================================ +# Attention-DQN 专属 +# ============================================================ +ATTENTION_HEAD_DIM = 64 # 每个注意力头的维度 +NUM_ATTENTION_HEADS = 4 # 多头注意力头数 +ATTENTION_DROPOUT = 0.1 + +# ============================================================ +# 训练超参数 +# ============================================================ +LEARNING_RATE = 1e-3 +GAMMA = 0.95 # 折扣因子 +TAU = 0.005 # 目标网络软更新系数 +TARGET_UPDATE_FREQ = 100 # 每 N 步硬更新目标网络 + +# ============================================================ +# 经验回放池 +# ============================================================ +MEMORY_SIZE = 50000 # 回放池容量 +BATCH_SIZE = 128 +MIN_REPLAY_SIZE = 2000 # 开始训练前最少经验条数 + +# ============================================================ +# 探索策略 (ε-greedy) +# ============================================================ +EPSILON_START = 1.0 +EPSILON_MIN = 0.01 +EPSILON_DECAY = 0.995 # 每步乘以该系数 + +# ============================================================ +# 训练控制 +# ============================================================ +TRAIN_EVERY_N_STEPS = 4 # 每 N 步执行一次学习 +MAX_EPISODES = 500 +SAVE_EVERY_N_EPISODES = 100 +LOG_EVERY_N_EPISODES = 10 diff --git a/critical/ppo_config.py b/critical/ppo_config.py new file mode 100644 index 00000000..c5a8876c --- /dev/null +++ b/critical/ppo_config.py @@ -0,0 +1,55 @@ +# config/ppo_config.py +# PPO / Smooth-PPO 超参数配置 + +# ============================================================ +# 环境接口 +# ============================================================ +STATE_SIZE = 6 # [ego_x, ego_y, adv_x, adv_y, ego_speed, distance] +ACTION_SIZE = 4 # 0=无操作, 1=左转, 2=右转, 3=制动 +ACTION_STD = 0.5 # 连续动作空间下初始标准差(离散动作为 softmax 温度) + +# ============================================================ +# 网络结构 (Actor-Critic) +# ============================================================ +HIDDEN_SIZES = [256, 256] # Actor 与 Critic 共享特征提取层 +ACTOR_HIDDEN = [128, 64] # Actor 头部 +CRITIC_HIDDEN = [128, 64] # Critic 头部 +ACTIVATION = "tanh" + +# ============================================================ +# PPO 核心超参数 +# ============================================================ +GAMMA = 0.99 # 折扣因子 +LAMBDA = 0.95 # GAE 平滑系数 +EPS_CLIP = 0.2 # PPO 标准裁剪范围 +UPDATE_EVERY = 2048 # 每收集多少步经验后执行一次策略更新 +UPDATE_POLICY_TIMES = 10 # 每次更新时对同一批数据重复训练轮数 +BATCH_SIZE = 64 # 小批量大小 + +# ============================================================ +# 学习率 +# ============================================================ +LR_ACTOR = 1e-4 +LR_CRITIC = 1e-3 + +# ============================================================ +# Smooth-PPO 专属参数(创新点) +# ============================================================ +SMOOTH_ENABLED = True +SMOOTH_EPS_LOW = 0.1 # 平滑裁剪下界 +SMOOTH_EPS_HIGH = 0.3 # 平滑裁剪上界 +SMOOTH_BETA = 0.5 # 平滑插值系数(0=标准, 1=全平滑) + +# ============================================================ +# 损失权重与正则化 +# ============================================================ +VALUE_LOSS_COEF = 0.5 # 价值损失权重 +ENTROPY_COEF = 0.01 # 熵正则化系数 +MAX_GRAD_NORM = 0.5 # 梯度裁剪阈值 + +# ============================================================ +# 训练控制 +# ============================================================ +MAX_EPISODES = 500 +SAVE_EVERY_N_EPISODES = 100 +LOG_EVERY_N_EPISODES = 10