Files
MAGAIL4AutoDrive/README.md

86 lines
7.0 KiB
Markdown
Raw Normal View History

2025-09-28 22:58:55 +08:00
# MAGAIL4AutoDrive
### 1.1 环境搭建
环境核心代码封装于`Env`文件夹,通过运行`run_multiagent_env.py`即可启动多智能体交互环境,该脚本的核心功能为读取各智能体(车辆)的动作指令,并将其传入`env.step()`方法中完成仿真执行。
**性能优化版本:** 针对原始版本FPS低15帧和CPU利用率不足的问题已提供多个优化版本
- `run_multiagent_env_fast.py` - 激光雷达优化版30-60 FPS2-4倍提升⭐推荐
- `run_multiagent_env_parallel.py` - 多进程并行版300-600 steps/s总吞吐量充分利用多核CPU⭐⭐推荐
- 详见 `Env/QUICK_START.md` 快速使用指南
2025-09-28 22:58:55 +08:00
当前已初步实现`Env.senario_env.MultiAgentScenarioEnv.reset()`车辆生成函数,具体逻辑如下:首先读取专家数据集中各车辆的初始位姿信息;随后对原始数据进行清洗,剔除车辆 Agent 实例信息,记录核心参数(车辆 ID、初始生成位置、朝向角、生成时间戳、目标终点坐标最后调用`_spawn_controlled_agents()`函数,依据清洗后的参数在指定时间、指定位置生成搭载自动驾驶算法的可控车辆。
**✅ 已解决:车辆生成位置偏差问题**
- **问题描述**:部分车辆生成于草坪、停车场等非车道区域,原因是专家数据记录误差或停车场特殊标注
- **解决方案**:实现了`_is_position_on_lane()`车道区域检测机制和`_filter_valid_spawn_positions()`过滤函数
- 检测逻辑:通过`point_on_lane()`判断位置是否在车道上支持容差参数默认3米处理边界情况
- 双重检测:优先使用精确检测,失败时使用容差范围检测,确保车道边缘车辆不被误过滤
- 自动过滤:在`reset()`时自动过滤非车道区域车辆,并输出过滤统计信息
- **配置参数**
- `filter_offroad_vehicles=True`:启用/禁用车道过滤功能
- `lane_tolerance=3.0`:车道检测容差(米),可根据场景调整
- `max_controlled_vehicles=10`:限制最大车辆数(可选)
- **使用示例**:在环境配置中设置上述参数即可自动启用,运行时会显示过滤信息(如"过滤5辆保留45辆"
2025-09-28 22:58:55 +08:00
### 1.2 观测获取
观测信息采集功能通过`Env.senario_env.MultiAgentScenarioEnv._get_all_obs()`函数实现,该函数支持遍历所有可控车辆并采集多维度观测数据,当前已实现的观测维度包括:车辆实时位置坐标、朝向角、行驶速度、雷达扫描点云(含障碍物与车道线特征)、导航信息(因场景复杂度较低,暂采用目标终点坐标直接作为导航输入)。
**✅ 已解决:红绿灯信息采集问题**
- **问题描述**
- 问题1部分红绿灯状态值为`None`,导致异常或错误判断
- 问题2车道分段设计时部分区域车辆无法匹配到红绿灯
- **解决方案**:实现了`_get_traffic_light_state()`优化方法,采用多级检测策略
- **方法1优先**:从车辆导航模块`vehicle.navigation.current_lane`获取当前车道,直接查询红绿灯状态(高效,自动处理车道分段)
- **方法2兜底**:遍历所有车道,通过`point_on_lane()`判断车辆位置,查找对应红绿灯(处理导航失败情况)
- **异常处理**:对状态为`None`的情况返回0无红绿灯所有异常均有try-except保护确保不会中断程序
- **返回值规范**0=无红绿灯/未知, 1=绿灯, 2=黄灯, 3=红灯
- **优势**:双重保障机制,优先用高效方法,失败时自动切换到兜底方案,确保所有场景都能正确获取红绿灯信息
2025-09-28 22:58:55 +08:00
### 1.3 算法模块
本方案的核心创新点在于对 GAIL 算法的判别器进行改进,使其适配多智能体场景下 “输入长度动态变化”(车辆数量不固定)的特性,实现对整体交互场景的分类判断,进而满足多智能体自动驾驶环境的训练需求。算法核心代码封装于`Algorithm.bert.Bert`类,具体实现逻辑如下:
1. 输入层处理:输入数据为维度`(N, input_dim)`的矩阵(其中`N`为当前场景车辆数量,`input_dim`为单车辆固定观测维度),初始化`Bert`类时需设置`input_dim`,确保输入维度匹配;
2. 嵌入层与位置编码:通过`projection`线性投影层将单车辆观测维度映射至预设的嵌入维度(`embed_dim`),随后叠加可学习的位置编码(`pos_embed`),以捕捉观测序列的时序与空间关联信息;
3. Transformer 特征提取:嵌入后的特征向量输入至多层`Transformer`网络(层数由`num_layers`参数控制),完成高阶特征交互与抽象;
4. 分类头设计:提供两种特征聚合与分类方案:若开启`CLS`模式,在嵌入层前拼接 1 个可学习的`CLS`标记,最终取`CLS`标记对应的特征向量输入全连接层完成分类;若关闭`CLS`模式,则对`Transformer`输出的所有车辆特征向量进行序列维度均值池化,再将池化后的全局特征输入全连接层。分类器支持可选的`Tanh`激活函数,以适配不同场景下的输出分布需求。
### 1.4 动作执行
在当前环境测试阶段,暂沿用腾达的动作执行框架:为每辆可控车辆分配独立的`policy`模型,将单车辆观测数据输入对应`policy`得到动作指令后,传入`env.step()`完成仿真;同时在`before_step`阶段调用`_set_action()`函数,将动作指令绑定至车辆实例,最终由 MetaDrive 仿真系统完成物理动力学计算与场景渲染。
后续优化方向为构建 "参数共享式统一模型框架",具体设计如下:所有车辆共用 1 个`policy`模型,通过参数共享机制实现模型的全局统一维护。该框架具备三重优势:一是避免多车辆独立模型带来的训练偏差(如不同模型训练程度不一致);二是解决车辆数量动态变化时的模型管理问题(车辆新增无需额外初始化模型,车辆减少不丢失模型训练信息);三是支持动作指令的并行计算,可显著提升每一步决策的迭代效率,适配大规模多智能体交互场景的训练需求。
---
## 问题解决总结
### ✅ 已完成的优化
1. **车辆生成位置偏差** - 实现车道区域检测和自动过滤,配置参数:`filter_offroad_vehicles`, `lane_tolerance`, `max_controlled_vehicles`
2. **红绿灯信息采集** - 采用双重检测策略(导航模块+遍历兜底处理None状态和车道分段问题
3. **性能优化** - 提供多个优化版本fast/parallelFPS从15提升到30-60支持多进程充分利用CPU
### 🧪 测试方法
```bash
# 测试车道过滤和红绿灯检测
python Env/test_lane_filter.py
# 运行标准版本(带过滤)
python Env/run_multiagent_env.py
# 运行高性能版本
python Env/run_multiagent_env_fast.py
```
### 📝 配置示例
```python
config = {
# 车道过滤
"filter_offroad_vehicles": True, # 启用车道过滤
"lane_tolerance": 3.0, # 容差范围(米)
"max_controlled_vehicles": 10, # 最大车辆数
# 其他配置...
}
```