Files
MAGAIL4AutoDrive/README.md

402 lines
11 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 - 多智能体自动驾驶环境
基于 MetaDrive 的多智能体自动驾驶仿真与回放环境,支持 Waymo Open Dataset 的专家轨迹回放和自定义策略仿真。
## 📋 目录
- [项目简介](#项目简介)
- [功能特性](#功能特性)
- [环境要求](#环境要求)
- [安装步骤](#安装步骤)
- [快速开始](#快速开始)
- [使用指南](#使用指南)
- [项目结构](#项目结构)
- [配置说明](#配置说明)
- [常见问题](#常见问题)
## 项目简介
MAGAIL4AutoDrive 是一个基于 MetaDrive 0.4.3 的多智能体自动驾驶环境专为模仿学习Imitation Learning和强化学习Reinforcement Learning研究设计。项目支持从真实世界数据集如 Waymo Open Dataset中加载场景并提供两种核心运行模式
- **回放模式Replay Mode**:严格按照专家轨迹回放,用于数据可视化和验证
- **仿真模式Simulation Mode**:使用自定义策略控制车辆,用于算法训练和测试
## 功能特性
### 核心功能
-**多智能体支持**:同时控制多辆车辆进行协同仿真
-**专家轨迹回放**:精确回放 Waymo 数据集中的专家驾驶行为
-**自定义策略接口**灵活接入各种控制策略IDM、RL 等)
-**智能车道过滤**:自动过滤不在车道上的异常车辆
-**场景时长控制**:支持使用数据集原始场景时长或自定义 horizon
-**丰富的传感器**LiDAR、侧向检测器、车道线检测器、相机、仪表盘
### 高级特性
- 🎯 指定场景 ID 运行
- 🔄 自动场景切换(修复版)
- 📊 详细的调试日志输出
- 🚗 车辆动态生成与管理
- 🎮 支持可视化渲染和无头运行
## 环境要求
### 系统要求
- **操作系统**Ubuntu 18.04+ / macOS 10.14+ / Windows 10+
- **Python 版本**3.8 - 3.10
- **GPU**:可选,但推荐使用(用于加速渲染)
### 依赖库
```
metadrive-simulator==0.4.3
numpy>=1.19.0
pygame>=2.0.0
```
## 安装步骤
### 1. 创建 Conda 环境
```
conda create -n metadrive python=3.10
conda activate metadrive
```
### 2. 安装 MetaDrive
```
pip install metadrive-simulator==0.4.3
```
### 3. 克隆项目
```
git clone https://github.com/your-username/MAGAIL4AutoDrive.git
cd MAGAIL4AutoDrive/Env
```
### 4. 准备数据集
将 Waymo 数据集转换为 MetaDrive 格式并放置在项目目录下:
```
MAGAIL4AutoDrive/Env/
├── exp_converted/
│ ├── scenario_0/
│ ├── scenario_1/
│ └── ...
```
## 快速开始
### 回放模式(推荐先尝试)
```
# 使用场景原始时长回放第一个场景
python run_multiagent_env.py --mode replay --episodes 1 --use_scenario_duration
# 回放指定场景
python run_multiagent_env.py --mode replay --scenario_id 0 --use_scenario_duration
# 回放多个场景
python run_multiagent_env.py --mode replay --episodes 3 --use_scenario_duration
```
### 仿真模式
```
# 使用默认策略运行仿真
python run_multiagent_env.py --mode simulation --episodes 1
# 无渲染运行(加速训练)
python run_multiagent_env.py --mode simulation --episodes 5 --no_render
```
## 使用指南
### 命令行参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `--mode` | str | simulation | 运行模式:`replay``simulation` |
| `--data_dir` | str | 当前目录 | Waymo 数据目录路径 |
| `--episodes` | int | 1 | 运行回合数 |
| `--horizon` | int | 300 | 每回合最大步数 |
| `--no_render` | flag | False | 禁用渲染(加速运行) |
| `--debug` | flag | False | 启用调试模式 |
| `--scenario_id` | int | None | 指定场景 ID |
| `--use_scenario_duration` | flag | False | 使用场景原始时长 |
| `--no_vehicles` | flag | False | 禁止生成车辆 |
| `--no_pedestrians` | flag | False | 禁止生成行人 |
| `--no_cyclists` | flag | False | 禁止生成自行车 |
### 回放模式详解
回放模式严格按照专家轨迹回放车辆状态,不涉及物理引擎控制。主要用途:
- 数据集可视化
- 验证数据质量
- 生成演示视频
```bash
# 完整参数示例
python run_multiagent_env.py \
--mode replay \
--episodes 1 \
--use_scenario_duration \
--debug
# 仅回放车辆,禁止行人和自行车
python run_multiagent_env.py \
--mode replay \
--use_scenario_duration \
--no_pedestrians \
--no_cyclists
```
**重要提示**:回放模式建议始终启用 `--use_scenario_duration`,否则会出现场景播放完后继续运行的问题。
### 仿真模式详解
仿真模式使用自定义策略控制车辆,适合算法开发和测试:
```bash
# 基础仿真
python run_multiagent_env.py --mode simulation
# 长时间训练(无渲染)
python run_multiagent_env.py \
--mode simulation \
--episodes 100 \
--horizon 500 \
--no_render
# 仅车辆仿真(用于专注车车交互场景)
python run_multiagent_env.py \
--mode simulation \
--no_pedestrians \
--no_cyclists
```
### 自定义策略
修改 `simple_idm_policy.py` 或创建新的策略类:
```python
class CustomPolicy:
def __init__(self, **kwargs):
# 初始化策略参数
pass
def act(self, observation=None):
# 返回动作 [steering, acceleration]
# steering: [-1, 1]
# acceleration: [-1, 1]
return [0.0, 0.5]
```
`run_multiagent_env.py` 中使用:
```
from custom_policy import CustomPolicy
env = MultiAgentScenarioEnv(
config={...},
agent2policy=CustomPolicy()
)
```
## 项目结构
```
MAGAIL4AutoDrive/Env/
├── run_multiagent_env.py \# 主运行脚本
├── scenario_env.py \# 多智能体场景环境
├── replay_policy.py \# 专家轨迹回放策略
├── simple_idm_policy.py \# IDM 策略实现
├── utils.py \# 工具函数
├── ENHANCED_USAGE_GUIDE.md \# 详细使用指南
├── README.md \# 本文档
└── exp_converted/ \# Waymo 数据集(需自行准备)
├── scenario_0/
├── scenario_1/
└── ...
```
### 核心文件说明
**run_multiagent_env.py**
- 主入口脚本
- 处理命令行参数
- 管理回放和仿真两种模式的运行逻辑
**scenario_env.py**
- 自定义多智能体环境类
- 车辆生成与管理
- 车道过滤逻辑
- 观测空间定义
**replay_policy.py**
- 专家轨迹回放策略
- 逐帧状态查询
- 轨迹完成判断
**simple_idm_policy.py**
- 简单的恒速策略示例
- 可作为自定义策略的模板
## 配置说明
### 环境配置参数
`scenario_env.py``default_config()` 中可修改:
```python
config.update(dict(
data_directory=None, # 数据目录
num_controlled_agents=3, # 可控车辆数量(仅仿真模式)
horizon=1000, # 最大步数
filter_offroad_vehicles=True, # 是否过滤车道外车辆
lane_tolerance=3.0, # 车道容差(米)
replay_mode=False, # 是否为回放模式
specific_scenario_id=None, # 指定场景 ID
use_scenario_duration=False, # 使用场景原始时长
# 对象类型过滤选项
spawn_vehicles=True, # 是否生成车辆
spawn_pedestrians=True, # 是否生成行人
spawn_cyclists=True, # 是否生成自行车
))
```
### 传感器配置
默认启用的传感器(可在环境初始化时修改):
- **LiDAR**80 条激光,探测距离 30 米
- **侧向检测器**10 条激光,探测距离 8 米
- **车道线检测器**10 条激光,探测距离 3 米
- **主相机**:分辨率 1200x900
- **仪表盘**:车辆状态信息
## 常见问题
### Q1: 回放模式为什么超出数据集的最大帧数还在继续?
**A**: 需要添加 `--use_scenario_duration` 参数。修复版本已在 `scenario_env.py` 中添加了自动检测机制。
### Q2: 如何切换不同的场景?
**A**:
- 方法一:使用 `--scenario_id` 指定场景
- 方法二:使用 `--episodes N` 自动遍历 N 个场景
### Q3: 为什么有些车辆没有出现?
**A**: 启用了车道过滤功能(`filter_offroad_vehicles=True`),不在车道上的车辆会被过滤。可以通过设置 `lane_tolerance` 调整容差或关闭此功能。
### Q4: 如何提高运行速度?
**A**:
- 使用 `--no_render` 禁用可视化
- 减少 `num_controlled_agents` 数量
- 使用 GPU 加速
### Q5: 如何控制场景中的对象类型?
**A**: 使用对象过滤参数:
```bash
# 仅车辆,无行人和自行车
python run_multiagent_env.py --mode replay --no_pedestrians --no_cyclists
# 仅行人和自行车,无车辆(特殊场景)
python run_multiagent_env.py --mode replay --no_vehicles
# 调试模式查看过滤统计
python run_multiagent_env.py --mode replay --debug --no_pedestrians
```
### Q6: 为什么有些车辆生成在空中?
**A**: 已在 v1.2.0 中修复。现在所有车辆位置都只使用 2D 坐标x, yz 坐标设为 0让 MetaDrive 自动处理高度,确保车辆贴在地面上。
### Q7: 如何导出观测数据?
**A**: 在 `run_multiagent_env.py` 中添加数据保存逻辑:
```python
import pickle
obs_data = []
while True:
obs, rewards, dones, infos = env.step(actions)
obs_data.append(obs)
if dones["__all__"]:
break
with open('observations.pkl', 'wb') as f:
pickle.dump(obs_data, f)
```
## 更新日志
### v1.2.0 (2025-10-26)
- ✅ 修复车辆生成高度问题(车辆悬空)
- ✅ 添加对象类型过滤功能(车辆/行人/自行车)
- ✅ 新增命令行参数:`--no_vehicles``--no_pedestrians``--no_cyclists`
- ✅ 改进调试信息输出,显示各类型对象统计
- ✅ 优化位置处理逻辑,只使用 2D 坐标避免高度问题
### v1.1.0 (2025-10-26)
- ✅ 修复回放模式超出场景时长问题
- ✅ 添加场景自动切换功能
- ✅ 改进 `replay_policy.py`,新增 `is_finished()` 方法
- ✅ 优化 `scenario_env.py` 的 done 判断逻辑
- ✅ 修复多回合运行时的对象清理问题
### v1.0.0 (初始版本)
- 基础多智能体环境实现
- 回放和仿真两种模式
- 车道过滤功能
- Waymo 数据集支持
## 贡献指南
欢迎提交 Issue 和 Pull Request
### 提交 Issue
- 请详细描述问题和复现步骤
- 附上运行日志和错误信息
- 说明运行环境OS、Python 版本等)
### 提交 PR
- Fork 本项目
- 创建特性分支:`git checkout -b feature/your-feature`
- 提交更改:`git commit -m 'Add some feature'`
- 推送分支:`git push origin feature/your-feature`
- 提交 Pull Request
## 许可证
本项目基于 MIT 许可证开源。
## 致谢
- [MetaDrive](https://github.com/metadriverse/metadrive) - 优秀的驾驶仿真平台
- [Waymo Open Dataset](https://waymo.com/open/) - 高质量的自动驾驶数据集
## 联系方式
如有问题或建议,请通过以下方式联系:
- GitHub Issues: [项目 Issues 页面]
- Email: huangfukk@xxx.com
---
**Happy Driving! 🚗💨**