Waymo Open Dataset 仿真智能体挑战赛教程:从数据加载到结果提交
概述
本文将深入解析Waymo Open Dataset中的仿真智能体(Sim Agents)挑战赛教程,帮助读者理解如何利用该数据集进行智能体行为仿真。教程涵盖了从数据加载、简单策略实现、可视化展示到最终结果提交的完整流程。
环境准备
首先需要安装Waymo Open Dataset的TensorFlow支持库:
!pip install waymo-open-dataset-tf-2-12-0==1.6.7
然后导入必要的Python库:
import os
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from waymo_open_dataset.protos import scenario_pb2
from waymo_open_dataset.protos import sim_agents_submission_pb2
from waymo_open_dataset.utils import trajectory_utils
from waymo_open_dataset.utils.sim_agents import submission_specs
from waymo_open_dataset.utils.sim_agents import visualizations
数据加载与准备
数据集路径配置
需要设置数据集文件的路径,教程中使用验证集(validation set)进行演示:
DATASET_FOLDER = '/waymo_open_dataset_'
VALIDATION_FILES = os.path.join(DATASET_FOLDER, 'validation.tfrecord*')
加载单个场景
filenames = tf.io.matching_files(VALIDATION_FILES)
dataset = tf.data.TFRecordDataset(filenames)
dataset_iterator = dataset.as_numpy_iterator()
bytes_example = next(dataset_iterator)
scenario = scenario_pb2.Scenario.FromString(bytes_example)
仿真参数配置
挑战赛对仿真过程有明确要求,这些参数可以通过submission_specs模块获取:
challenge_type = submission_specs.ChallengeType.SIM_AGENTS
submission_config = submission_specs.get_submission_config(challenge_type)
print(f'仿真步数: {submission_config.n_simulation_steps}')
print(f'每步持续时间: {submission_config.step_duration_seconds}秒')
print(f'每个场景的并行仿真次数: {submission_config.n_rollouts}')
仿真实现
确定需要仿真的对象
sim_agent_ids = submission_specs.get_sim_agent_ids(scenario, challenge_type)
print(f'需要仿真的对象ID: {sim_agent_ids}')
简单策略实现
教程展示了一个基于线性外推的简单策略:
def simulate_with_extrapolation(scenario):
# 加载并预处理轨迹数据
logged_trajectories = trajectory_utils.ObjectTrajectories.from_scenario(scenario)
logged_trajectories = logged_trajectories.gather_objects_by_id(
tf.convert_to_tensor(sim_agent_ids))
# 计算最后速度作为动作
states = tf.stack([logged_trajectories.x, logged_trajectories.y,
logged_trajectories.z, logged_trajectories.heading], axis=-1)
last_velocities = states[:, -1, :3] - states[:, -2, :3]
# 添加噪声创建多个仿真
simulated_states = tf.tile(states[tf.newaxis, :, -1:, :],
[submission_config.n_rollouts, 1, 1, 1])
for _ in range(submission_config.n_simulation_steps):
current_state = simulated_states[:, :, -1, :]
next_state = current_state + last_velocities[None, :, :]
simulated_states = tf.concat([simulated_states, next_state[:, :, None, :]], axis=2)
return logged_trajectories, simulated_states[:, :, 1:, :]
结果可视化
使用Matplotlib对仿真结果进行可视化:
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
visualizations.get_animated_states(
fig, ax, scenario,
simulated_states[0, :, :, 0], # x坐标
simulated_states[0, :, :, 1], # y坐标
simulated_states[0, :, :, 3], # 朝向
lengths, widths)
结果提交格式
仿真结果需要按照特定协议格式进行封装:
SimulatedTrajectory: 单个对象的仿真轨迹JointScene: 单个仿真中的所有对象轨迹ScenarioRollouts: 一个场景的所有并行仿真SimAgentsChallengeSubmission: 完整提交文件
封装函数示例:
def joint_scene_from_states(simulated_states, scenario):
joint_scene = sim_agents_submission_pb2.JointScene()
for obj_idx in range(simulated_states.shape[1]):
traj = joint_scene.simulated_trajectories.add()
traj.object_id = sim_agent_ids[obj_idx]
for step in range(simulated_states.shape[2]):
point = traj.waypoints.add()
point.center_x = simulated_states[0, obj_idx, step, 0]
point.center_y = simulated_states[0, obj_idx, step, 1]
point.center_z = simulated_states[0, obj_idx, step, 2]
point.heading = simulated_states[0, obj_idx, step, 3]
return joint_scene
总结
本教程展示了Waymo Open Dataset仿真智能体挑战赛的基本流程,从数据加载到简单策略实现,再到结果可视化与提交。虽然示例中使用的线性外推策略较为简单,但为开发者提供了构建更复杂仿真系统的基础框架。实际参赛时,开发者需要设计更加智能的策略来生成更真实、多样化的行为仿真。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



