# Copyright (c) Meta Platforms, Inc. and affiliates. from pathlib import Path import numpy as np from scipy.spatial.transform import Rotation from ...utils.geo import Projection split_files = ["test1_files.txt", "test2_files.txt", "train_files.txt"] def parse_gps_file(path, projection: Projection = None): with open(path, "r") as fid: lat, lon, _, roll, pitch, yaw, *_ = map(float, fid.read().split()) latlon = np.array([lat, lon]) R_world_gps = Rotation.from_euler("ZYX", [yaw, pitch, roll]).as_matrix() t_world_gps = None if projection is None else np.r_[projection.project(latlon), 0] return latlon, R_world_gps, t_world_gps def parse_split_file(path: Path): with open(path, "r") as fid: info = fid.read() names = [] shifts = [] for line in info.split("\n"): if not line: continue name, *shift = line.split() names.append(tuple(name.split("/"))) if len(shift) > 0: assert len(shift) == 3 shifts.append(np.array(shift, float)) shifts = None if len(shifts) == 0 else np.stack(shifts) return names, shifts def parse_calibration_file(path): calib = {} with open(path, "r") as fid: for line in fid.read().split("\n"): if not line: continue key, *data = line.split(" ") key = key.rstrip(":") if key.startswith("R"): data = np.array(data, float).reshape(3, 3) elif key.startswith("T"): data = np.array(data, float).reshape(3) elif key.startswith("P"): data = np.array(data, float).reshape(3, 4) calib[key] = data return calib def get_camera_calibration(calib_dir, cam_index: int): calib_path = calib_dir / "calib_cam_to_cam.txt" calib_cam = parse_calibration_file(calib_path) P = calib_cam[f"P_rect_{cam_index:02}"] K = P[:3, :3] size = np.array(calib_cam[f"S_rect_{cam_index:02}"], float).astype(int) camera = { "model": "PINHOLE", "width": size[0], "height": size[1], "params": K[[0, 1, 0, 1], [0, 1, 2, 2]], } t_cam_cam0 = P[:3, 3] / K[[0, 1, 2], [0, 1, 2]] R_rect_cam0 = calib_cam["R_rect_00"] calib_gps_velo = parse_calibration_file(calib_dir / "calib_imu_to_velo.txt") calib_velo_cam0 = parse_calibration_file(calib_dir / "calib_velo_to_cam.txt") R_cam0_gps = calib_velo_cam0["R"] @ calib_gps_velo["R"] t_cam0_gps = calib_velo_cam0["R"] @ calib_gps_velo["T"] + calib_velo_cam0["T"] R_cam_gps = R_rect_cam0 @ R_cam0_gps t_cam_gps = t_cam_cam0 + R_rect_cam0 @ t_cam0_gps return camera, R_cam_gps, t_cam_gps