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 运行模式:replaysimulation
--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 禁止生成自行车

回放模式详解

回放模式严格按照专家轨迹回放车辆状态,不涉及物理引擎控制。主要用途:

  • 数据集可视化
  • 验证数据质量
  • 生成演示视频
# 完整参数示例
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,否则会出现场景播放完后继续运行的问题。

仿真模式详解

仿真模式使用自定义策略控制车辆,适合算法开发和测试:

# 基础仿真
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 或创建新的策略类:

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.pydefault_config() 中可修改:

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,              # 是否生成自行车
))

传感器配置

默认启用的传感器(可在环境初始化时修改):

  • LiDAR80 条激光,探测距离 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: 使用对象过滤参数:

# 仅车辆,无行人和自行车
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 中添加数据保存逻辑:

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 许可证开源。

致谢

联系方式

如有问题或建议,请通过以下方式联系:


Happy Driving! 🚗💨

Description
No description provided
Readme 217 MiB
Languages
Python 100%