from __future__ import annotations import os import uuid import numpy as np from nuplan.planning.scenario_builder.nuplan_db.nuplan_scenario_builder import NuPlanScenarioBuilder from nuplan.planning.scenario_builder.nuplan_db.nuplan_scenario_utils import ScenarioMapping from nuplan.planning.scenario_builder.scenario_filter import ScenarioFilter from nuplan.planning.utils.multithreading.worker_utils import worker_map from navsim.planning.simulation.planner.pdm_planner.utils.pdm_geometry_utils import \ convert_absolute_to_relative_se2_array from navsim.planning.utils.multithreading.worker_ray_no_torch import RayDistributedNoTorch def get_local_ego_poses(scenarios): results = [] thread_id = str(uuid.uuid4()) for idx, scenario in enumerate(scenarios): print( f"Processing scenario {idx + 1} / {len(scenarios)} in thread_id={thread_id}" ) init_ego_state = scenario.initial_ego_state future_traj = scenario.get_ego_future_trajectory(0, 4) local_ego_poses = convert_absolute_to_relative_se2_array( init_ego_state.center, np.array([tmp.center.serialize() for tmp in future_traj], dtype=np.float64) ) results.append(local_ego_poses[None].astype(np.float32)) return results def main(): root = '/mnt/g' split = 'test' logs = os.listdir(f'{root}/nuplan/nuplan-v1.1/splits/{split}') logs = [tmp.replace('.db', '') for tmp in logs] navsim_logs = [log.replace('.pkl', '') for log in os.listdir(f'{root}/navsim/navsim_logs/{split}')] start_idx = 400000 end_idx = 600000 save_dir = './traj_local' os.makedirs(save_dir, exist_ok=True) save_file = f'{save_dir}/{split}-pt3.npy' logs = list(set(logs) & set(navsim_logs)) print(f'total logs: {len(logs)}') filter = ScenarioFilter( None, None, logs, None, None, None, None, None, False, False, False ) worker = RayDistributedNoTorch(threads_per_node=16) builder = NuPlanScenarioBuilder( data_root=f'{root}/nuplan/', map_root=f'{root}/nuplan/maps', sensor_root=f'{root}/nuplan/', db_files=f'{root}/nuplan/nuplan-v1.1/splits/{split}', map_version='nuplan-maps-v1.0', scenario_mapping=ScenarioMapping({}, 0.5) ) scenarios = builder.get_scenarios(filter, worker) print(f'total scenarios: {len(scenarios)}, now: {start_idx} to {end_idx}') all_ego_poses = worker_map(worker, get_local_ego_poses, scenarios[start_idx:end_idx]) all_ego_poses = np.concatenate(all_ego_poses, axis=0) print(f'save to: {save_file}') np.save(save_file, all_ego_poses) print(all_ego_poses.shape) if __name__ == '__main__': main()