4.4 KiB
MAGAIL4AutoDrive
1.1 环境搭建
环境核心代码封装于Env文件夹,通过运行run_multiagent_env.py即可启动多智能体交互环境,该脚本的核心功能为读取各智能体(车辆)的动作指令,并将其传入env.step()方法中完成仿真执行。
当前已初步实现Env.senario_env.MultiAgentScenarioEnv.reset()车辆生成函数,具体逻辑如下:首先读取专家数据集中各车辆的初始位姿信息;随后对原始数据进行清洗,剔除车辆 Agent 实例信息,记录核心参数(车辆 ID、初始生成位置、朝向角、生成时间戳、目标终点坐标);最后调用_spawn_controlled_agents()函数,依据清洗后的参数在指定时间、指定位置生成搭载自动驾驶算法的可控车辆。
需解决的关键问题:部分车辆存在生成位置偏差(如生成于草坪区域),推测成因可能为专家数据记录误差或场景中模拟停车场区域的特殊标注。后续计划引入车道区域检测机制,通过判断车辆初始生成位置是否位于有效车道范围内,对非车道区域生成的车辆进行过滤,确保环境初始化的合理性。
1.2 观测获取
观测信息采集功能通过Env.senario_env.MultiAgentScenarioEnv._get_all_obs()函数实现,该函数支持遍历所有可控车辆并采集多维度观测数据,当前已实现的观测维度包括:车辆实时位置坐标、朝向角、行驶速度、雷达扫描点云(含障碍物与车道线特征)、导航信息(因场景复杂度较低,暂采用目标终点坐标直接作为导航输入)。
红绿灯信息采集机制需改进:当前方案通过 “车辆所属车道序号匹配对应红绿灯实例” 的逻辑获取信号灯状态,但存在两类问题:一是部分红绿灯实例的状态值为None;二是当单条车道存在分段设计时,部分区域的车辆会无法获取红绿灯状态。
1.3 算法模块
本方案的核心创新点在于对 GAIL 算法的判别器进行改进,使其适配多智能体场景下 “输入长度动态变化”(车辆数量不固定)的特性,实现对整体交互场景的分类判断,进而满足多智能体自动驾驶环境的训练需求。算法核心代码封装于Algorithm.bert.Bert类,具体实现逻辑如下:
- 输入层处理:输入数据为维度
(N, input_dim)的矩阵(其中N为当前场景车辆数量,input_dim为单车辆固定观测维度),初始化Bert类时需设置input_dim,确保输入维度匹配; - 嵌入层与位置编码:通过
projection线性投影层将单车辆观测维度映射至预设的嵌入维度(embed_dim),随后叠加可学习的位置编码(pos_embed),以捕捉观测序列的时序与空间关联信息; - Transformer 特征提取:嵌入后的特征向量输入至多层
Transformer网络(层数由num_layers参数控制),完成高阶特征交互与抽象; - 分类头设计:提供两种特征聚合与分类方案:若开启
CLS模式,在嵌入层前拼接 1 个可学习的CLS标记,最终取CLS标记对应的特征向量输入全连接层完成分类;若关闭CLS模式,则对Transformer输出的所有车辆特征向量进行序列维度均值池化,再将池化后的全局特征输入全连接层。分类器支持可选的Tanh激活函数,以适配不同场景下的输出分布需求。
1.4 动作执行
在当前环境测试阶段,暂沿用腾达的动作执行框架:为每辆可控车辆分配独立的policy模型,将单车辆观测数据输入对应policy得到动作指令后,传入env.step()完成仿真;同时在before_step阶段调用_set_action()函数,将动作指令绑定至车辆实例,最终由 MetaDrive 仿真系统完成物理动力学计算与场景渲染。
后续优化方向为构建 “参数共享式统一模型框架”,具体设计如下:所有车辆共用 1 个policy模型,通过参数共享机制实现模型的全局统一维护。该框架具备三重优势:一是避免多车辆独立模型带来的训练偏差(如不同模型训练程度不一致);二是解决车辆数量动态变化时的模型管理问题(车辆新增无需额外初始化模型,车辆减少不丢失模型训练信息);三是支持动作指令的并行计算,可显著提升每一步决策的迭代效率,适配大规模多智能体交互场景的训练需求。