| | import copy |
| | import numpy as np |
| | from pathlib import Path |
| | from trajdata import MapAPI, VectorMap |
| | from trajdata.caching.df_cache import DataFrameCache |
| | from trajdata.dataset_specific.opendrive import parse_maps |
| | from mmdet3d_plugin.datasets.carla.trajdata_rasterizer import rasterize |
| | from PIL import Image |
| | from trajdata.utils import map_utils |
| |
|
| | patch_size = (102.4, 102.4) |
| | canvas_size = (1024, 1024) |
| |
|
| | def carla_init_mapping(): |
| | assert canvas_size[0] == canvas_size[1], "not square" |
| | assert patch_size[0] == patch_size[1], "not square" |
| | pixel_per_meter = canvas_size[0] / patch_size[0] |
| | |
| |
|
| | |
| | map_data: Dict[str, Dict] = {} |
| | map_cache_dir = "./data" |
| | town_name_list = [ |
| | |
| | |
| | |
| | |
| | "Town05", |
| | |
| | |
| | |
| | |
| | ] |
| |
|
| | |
| | map_api = MapAPI(map_cache_dir) |
| | for town_name in town_name_list: |
| | map_id = f"carla:{town_name}" |
| |
|
| | |
| | if not (Path(map_cache_dir) / f"carla/maps/{town_name}.pb").exists(): |
| | print(f"Attempt to parse CARLA map for {town_name}.") |
| | |
| | |
| | |
| | parse_maps.parse_maps( |
| | maps_dir_or_file=str( |
| | Path(os.environ["CARLA_ROOT"]) |
| | / f"CarlaUE4/Content/Carla/Maps/OpenDrive/{town_name}.xodr" |
| | ), |
| | trajdata_cache_dir=map_cache_dir, |
| | ) |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | vec_map_tmp = map_api.get_map( |
| | map_id, |
| | incl_road_lanes=True, |
| | incl_road_areas=True, |
| | incl_ped_crosswalks=True, |
| | incl_ped_walkways=True, |
| | ) |
| | |
| | |
| | |
| |
|
| | |
| | map_img, polylines, raster_from_world = rasterize( |
| | vec_map=vec_map_tmp, |
| | resolution=pixel_per_meter, |
| | return_tf_mat=True, |
| | incl_centerlines=False, |
| | incl_lane_edges=False, |
| | area_color=(255, 255, 255), |
| | edge_color=(255, 0, 0), |
| | incl_lane_area=True, |
| | incl_ego_location=False, |
| | incl_ped_walkway=False, |
| | incl_ped_crosswalk=False, |
| | debug=False, |
| | ) |
| |
|
| | |
| | map_data[map_id] = { |
| | "vec_map": vec_map_tmp, |
| | "polylines": polylines, |
| | "raster_from_world": raster_from_world, |
| | "map_img": map_img, |
| | } |
| |
|
| | return map_data |
| |
|
| | def get_carla_map_rasterize_semantic(maps, sample_token, input_dict): |
| | |
| | town_id = sample_token.split('Town')[-1] |
| | town_id = town_id.split('_')[0] |
| | map_id: str = f"carla:Town{town_id}" |
| | map_mask = copy.copy(maps[map_id]["map_img"]) |
| | raster_from_world: np.ndarray = maps[map_id][ |
| | "raster_from_world" |
| | ] |
| |
|
| | |
| | map_mask = np.max(map_mask, axis=2) |
| | map_mask = (map_mask * 255).astype("uint8") |
| | map_mask = Image.fromarray(map_mask) |
| |
|
| | |
| | |
| | |
| | lidar_world: np.ndarray = copy.deepcopy( |
| | input_dict["l2g_t"][:, :2].numpy() |
| | ) |
| | lidar_world[0, -1] *= -1 |
| | lidar_raster: np.ndarray = map_utils.transform_points( |
| | lidar_world, raster_from_world |
| | )[ |
| | 0 |
| | ] |
| |
|
| | |
| | |
| | map_mask = map_mask.crop( |
| | ( |
| | lidar_raster[0] - int(canvas_size[0] / 2 * 1.5), |
| | lidar_raster[1] - int(canvas_size[1] / 2 * 1.5), |
| | lidar_raster[0] + int(canvas_size[0] / 2 * 1.5), |
| | lidar_raster[1] + int(canvas_size[1] / 2 * 1.5), |
| | ) |
| | ) |
| |
|
| | |
| | yaw_angle_ego_global = copy.copy(input_dict["can_bus"][-1]) |
| | yaw_angle_ego_global = -1 * yaw_angle_ego_global |
| | map_mask = map_mask.rotate(yaw_angle_ego_global) |
| |
|
| | |
| | map_mask = map_mask.crop( |
| | ( |
| | int(canvas_size[0] * 0.25), |
| | int(canvas_size[1] * 0.25), |
| | int(canvas_size[0] * 1.25), |
| | int(canvas_size[1] * 1.25), |
| | ) |
| | ) |
| | map_mask = (np.array(map_mask) / 255).astype("uint8") |
| | map_mask = map_mask.reshape( |
| | (1, map_mask.shape[0], map_mask.shape[1]) |
| | ) |
| |
|
| | return map_mask |
| |
|