Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions critical/README.md
Original file line number Diff line number Diff line change
@@ -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
47 changes: 47 additions & 0 deletions critical/__init__.py
Original file line number Diff line number Diff line change
@@ -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,
)
64 changes: 64 additions & 0 deletions critical/carla_config.py
Original file line number Diff line number Diff line change
@@ -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"
51 changes: 51 additions & 0 deletions critical/dqn_config.py
Original file line number Diff line number Diff line change
@@ -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
55 changes: 55 additions & 0 deletions critical/ppo_config.py
Original file line number Diff line number Diff line change
@@ -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