Files
MAGAIL4AutoDrive/README.md

86 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 快速使用指南
当前已初步实现`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辆"
### 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=红灯
- **优势**:双重保障机制,优先用高效方法,失败时自动切换到兜底方案,确保所有场景都能正确获取红绿灯信息
### 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, # 最大车辆数
# 其他配置...
}
```