RL-frenet-trajectory-planning-in-CARLA RL-Frenet Trajectory Planning in CARLA - 项目架构与核心算法一、项目概述本项目是一个基于 CARLA 自动驾驶模拟器的端到端深度强化学习框架结合了Frenet 坐标系轨迹规划和深度强化学习算法实现了自动驾驶车辆的长期和短期规划。核心论文An End-to-end Deep Reinforcement Learning Approach for the Long-term Short-term Planning on the Frenet Space二、项目架构2.1 整体架构图┌─────────────────────────────────────────────────────────────────────────────┐ │ CARLA Simulator │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ World (地图、障碍物、交通参与者) │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ └───────────────────────────────┬─────────────────────────────────────────────┘ │ (Observation: 车辆状态、环境感知) ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ RL Agent (强化学习代理) │ │ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Gym Environment Wrapper │ │ │ │ - 状态空间定义 (Observation Space) │ │ │ │ - 动作空间定义 (Action Space) │ │ │ │ - 奖励函数设计 (Reward Function) │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Reinforcement Learning Algorithms │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ DDPG │ │ TRPO │ │ A2C │ │ PPO2 │ │ ACER │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ └───────────┴───────────┴───────────┴───────────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ │ │ Policy Network │ │ │ │ │ │ - MLP/CNN 特征提取 │ │ │ │ │ │ - Actor: 动作输出 (车道变更、目标速度) │ │ │ │ │ │ - Critic: 值函数评估 │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ (Action: 车道变更、目标速度) │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ Local Planner (局部规划器) │ │ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Frenet Optimal Trajectory Planner │ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ │ │ 1. Cubic Spline 全局路径拟合 │ │ │ │ │ │ 2. Frenet 状态估计 (s, s_d, s_dd, d, d_d, d_dd) │ │ │ │ │ │ 3. 候选轨迹生成 (五次/四次多项式) │ │ │ │ │ │ 4. 碰撞检测与可行性筛选 │ │ │ │ │ │ 5. 最优轨迹选择 (代价函数) │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ (最优轨迹: 全局坐标路径) │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ Low Level Controller (低级控制器) │ │ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ VehiclePIDController │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ │ │ PIDLongitudinal │ │ PIDLateral │ │ │ │ │ │ - 油门/刹车控制 │ │ - 方向盘控制 │ │ │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ (Control Command) │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ CARLA Vehicle Actor │ │ - apply_control() 执行控制指令 │ │ - get_location() 获取车辆位置 │ │ - get_transform() 获取车辆变换 │ └─────────────────────────────────────────────────────────────────────────────┘2.2 文件夹结构RL-frenet-trajectory-planning-in-CARLA/ ├── agents/ # 核心代理模块 │ ├── __init__.py │ ├── local_planner/ # 局部轨迹规划器 │ │ ├── cubic_spline_planner.py # 三次样条曲线拟合 │ │ └── frenet_optimal_trajectory.py # Frenet最优轨迹生成 │ ├── low_level_controller/ # 低级控制器 │ │ └── controller.py # PID控制器实现 │ └── reinforcement_learning/ # 强化学习模块 │ └── stable_baselines/ # stable-baselines库集成 │ ├── __init__.py # RL算法导出 │ ├── a2c/ # A2C算法实现 │ ├── acer/ # ACER算法实现 │ ├── acktr/ # ACKTR算法实现 │ ├── common/ # 通用组件 │ │ ├── policies.py # 策略网络定义 │ │ ├── base_class.py # RL模型基类 │ │ ├── distributions.py # 概率分布 │ │ ├── runners.py # 环境运行器 │ │ └── vec_env/ # 向量环境 │ └── ... # 其他算法 ├── tools/ # 工具模块 │ ├── cfgs/ # 配置文件 │ │ └── config.yaml # 环境与RL配置 │ └── modules.py # 模块包装器 ├── carla_gym/ # CARLA Gym环境接口 │ └── envs/ # 环境定义 ├── run.py # 训练/测试入口 ├── monitor_plot.py # 结果可视化 ├── config.py # 配置加载 └── README.md # 项目说明三、核心算法组件详解3.1 Cubic Spline Planner (三次样条规划器)文件位置agents/local_planner/cubic_spline_planner.py作用将离散的全局路径点拟合成平滑的连续曲线用于后续的 Frenet 坐标系转换和轨迹生成。核心类类名功能关键方法Spline一维三次样条calc(t)- 计算位置calcd(t)- 计算一阶导数calcdd(t)- 计算二阶导数Spline2D二维三次样条calc_position(s)- 计算(x,y)位置calc_yaw(s)- 计算航向角calc_curvature(s)- 计算曲率Spline3D三维三次样条calc_position(s)- 计算(x,y,z)位置calc_pitch(s)- 计算俯仰角算法原理给定一系列控制点(x, y)通过求解线性方程组得到样条曲线系数使用自然边界条件端点二阶导数为0曲线表达式y(x) a bx cx² dx³关键代码Spline2D.calc_yaw()通过一阶导数计算航向角defcalc_yaw(self,s):dxself.sx.calcd(s)dyself.sy.calcd(s)yawmath.atan2(dy,dx)returnyaw3.2 Frenet Optimal Trajectory Planner (Frenet最优轨迹规划器)文件位置agents/local_planner/frenet_optimal_trajectory.py作用在 Frenet 坐标系下生成多条候选轨迹通过代价函数选择最优轨迹。核心类类名功能关键属性quintic_polynomial五次多项式横向运动a0-a5- 多项式系数quartic_polynomial四次多项式纵向运动a0-a4- 多项式系数Frenet_pathFrenet路径数据结构s,d- Frenet坐标x,y- 全局坐标FrenetPlannerFrenet规划器主类轨迹生成、碰撞检测、最优选择Frenet 坐标系s沿参考路径的纵向距离d垂直于参考路径的横向偏移状态向量[s, s_d, s_dd, d, d_d, d_dd]轨迹生成流程1. 全局路径拟合 (Spline3D) ↓ 2. Frenet状态估计 (基于车辆当前位置) ↓ 3. 候选轨迹生成 (横向五次多项式 纵向四次多项式) ↓ 4. Frenet→全局坐标转换 ↓ 5. 曲率计算 ↓ 6. 可行性筛选 (速度/加速度/曲率/碰撞检测) ↓ 7. 最优轨迹选择 (代价函数最小化)代价函数cf KLAT * cd KLON * cv cd (横向代价) KJ * Jp KT * Ti KD * (d_final - target_d)² cv (纵向代价) KJ * Js KT * Ti KD * (v_final - target_v)² 其中 - Jp/Js横向/纵向加加速度的平方和 (舒适性) - Ti轨迹时间 (效率) - d_final - target_d横向偏移误差 (准确性) - v_final - target_v速度误差 (准确性)关键方法方法功能estimate_frenet_state()根据车辆状态估计当前 Frenet 坐标calc_frenet_paths()生成候选 Frenet 轨迹集合calc_global_paths()Frenet→全局坐标转换check_collision()碰撞检测frenet_optimal_planning()完整的最优轨迹规划流程run_step_single_path()基于 RL 动作生成单条轨迹3.3 Low Level Controller (低级控制器)文件位置agents/low_level_controller/controller.py作用将规划器输出的轨迹转换为车辆控制指令油门、刹车、方向盘。核心类类名功能参数VehiclePIDController车辆PID控制器组合整合横向纵向控制PIDLongitudinalController纵向PID控制器K_P40.0, K_D0.1, K_I4PIDLateralController横向PID控制器K_P0.3, K_D0.0, K_I0.0PIDCrossTrackController横向偏差PID控制可配置参数IntelligentDriverModel智能驾驶员模型(巡航控制)基于IDM模型纵向控制逻辑def_pid_control(self,target_speed,current_speed):_e(target_speed-current_speed)# 速度误差_de(e_buffer[-1]-e_buffer[-2])/dt# 误差变化率_iesum(e_buffer)*dt# 误差积分throttleK_P*_eK_D*_de/dtK_I*_ie*dtreturnclip(throttle,0.0,1.0)横向控制逻辑通过计算车辆朝向向量与目标点向量的夹角作为控制误差使用叉积判断左右方向输出方向盘转角 [-1, 1]3.4 Reinforcement Learning Algorithms (强化学习算法)文件位置agents/reinforcement_learning/stable_baselines/支持算法算法类型适用场景DDPG连续动作空间连续控制任务TRPO策略优化稳定收敛A2C优势演员-评论家高效训练PPO2近端策略优化稳定高效ACER样本高效减少样本消耗A2C 算法核心实现(a2c/a2c.py)损失函数loss pg_loss - entropy * ent_coef vf_loss * vf_coef 其中 - pg_loss -E[advantage * log_prob] (策略梯度损失) - vf_loss MSE(value_prediction, target_value) (值函数损失) - entropy 策略熵 (鼓励探索)训练流程1. 收集 n_steps 步的轨迹数据 2. 计算 discounted rewards (GAE) 3. 计算优势函数 advantage rewards - values 4. 更新策略网络和值网络 5. 重复直到达到总步数策略网络(common/policies.py)网络类型功能nature_cnnNature论文CNN结构 (图像处理)sequence_1d_cnn1D序列CNN (时序数据)sequence_1d_cnn_ego_bypass_tc带ego旁路的1D CNNmlp_extractorMLP特征提取器四、数据流与交互流程4.1 训练模式数据流CARLA环境 → Observation → Gym环境包装 → RL算法 → Action ↑ │ │ ▼ apply_control ← ControlCommand ← LowLevelController ← Trajectory ← LocalPlanner4.2 关键数据结构Observation (状态空间)车辆自身状态位置、速度、加速度、航向角周围车辆状态相对距离、相对速度Frenet 状态s, s_d, s_dd, d, d_d, d_dd全局路径信息目标路径点Action (动作空间)change_lane车道变更 (-1左, 0保持, 1右)target_speed目标速度Reward (奖励函数)前进奖励沿路径方向的位移效率奖励速度接近目标速度舒适性奖励平滑驾驶惩罚大加速度安全性奖励碰撞惩罚车道保持奖励保持在车道内五、关键配置与参数5.1 配置文件位置tools/cfgs/config.yaml环境和 RL 算法配置5.2 核心参数CARLA 仿真参数参数默认值说明DT0.05仿真时间步长(秒)LANE_WIDTH3.5车道宽度(米)局部规划器参数参数默认值说明MAX_SPEED150/3.6最大速度(米/秒)MAX_ACCEL4.0最大加速度(米/秒²)MAX_CURVATURE1.0最大曲率(1/米)MAXT6.0最大预测时间(秒)MINT3.0最小预测时间(秒)代价函数权重参数默认值说明KJ0.1加加速度权重KT0.1时间权重KD1.0偏移权重KLAT1.0横向代价权重KLON1.0纵向代价权重六、运行方式6.1 训练命令# Terminal 1: 启动 CARLA 服务器./CarlaUE4.sh -carla-server-fps20-world-port2000# Terminal 2: 启动训练python3 run.py--cfg_filetools/cfgs/config.yaml--agent_id1--envCarlaGymEnv-v16.2 测试命令# 使用预训练模型测试python3 run.py--agent_id1--envCarlaGymEnv-v1--test--play_mode16.3 预训练模型Agent ID算法1DDPG2TRPO3A2C4PPO2七、核心设计亮点Frenet 坐标系规划将复杂的二维轨迹规划分解为独立的纵向和横向规划问题简化了问题复杂度多项式轨迹生成使用五次/四次多项式保证轨迹及其导数的连续性提高驾驶舒适性端到端 RL 集成将 RL 的高层决策车道变更、目标速度与传统规划器结合兼顾学习能力和安全性模块化设计各组件职责清晰易于替换和扩展Gym 环境封装符合 OpenAI Gym 标准接口便于切换不同 RL 算法八、参考文献Werling, M., et al. “Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame.” 2010.Moghadam, M., et al. “An End-to-end Deep Reinforcement Learning Approach for the Long-term Short-term Planning on the Frenet Space.” arXiv:2011.13098, 2020.Schulman, J., et al. “Proximal Policy Optimization Algorithms.” arXiv:1707.06347, 2017.Lillicrap, T. P., et al. “Continuous Control with Deep Reinforcement Learning.” arXiv:1509.02971, 2015.