import numpy as np import utils.utils_poses.ATE.trajectory_utils as tu import utils.utils_poses.ATE.transformations as tf def rotation_error(pose_error): """Compute rotation error Args: pose_error (4x4 array): relative pose error Returns: rot_error (float): rotation error """ a = pose_error[0, 0] b = pose_error[1, 1] c = pose_error[2, 2] d = 0.5*(a+b+c-1.0) rot_error = np.arccos(max(min(d, 1.0), -1.0)) return rot_error def translation_error(pose_error): """Compute translation error Args: pose_error (4x4 array): relative pose error Returns: trans_error (float): translation error """ dx = pose_error[0, 3] dy = pose_error[1, 3] dz = pose_error[2, 3] trans_error = np.sqrt(dx**2+dy**2+dz**2) return trans_error def compute_rpe(gt, pred): trans_errors = [] rot_errors = [] for i in range(len(gt)-1): gt1 = gt[i] gt2 = gt[i+1] gt_rel = np.linalg.inv(gt1) @ gt2 pred1 = pred[i] pred2 = pred[i+1] pred_rel = np.linalg.inv(pred1) @ pred2 rel_err = np.linalg.inv(gt_rel) @ pred_rel trans_errors.append(translation_error(rel_err)) rot_errors.append(rotation_error(rel_err)) rpe_trans = np.mean(np.asarray(trans_errors)) rpe_rot = np.mean(np.asarray(rot_errors)) return rpe_trans, rpe_rot def compute_ATE(gt, pred): """Compute RMSE of ATE Args: gt: ground-truth poses pred: predicted poses """ errors = [] for i in range(len(pred)): # cur_gt = np.linalg.inv(gt_0) @ gt[i] cur_gt = gt[i] gt_xyz = cur_gt[:3, 3] # cur_pred = np.linalg.inv(pred_0) @ pred[i] cur_pred = pred[i] pred_xyz = cur_pred[:3, 3] align_err = gt_xyz - pred_xyz errors.append(np.sqrt(np.sum(align_err ** 2))) ate = np.sqrt(np.mean(np.asarray(errors) ** 2)) return ate