Spaces:
Running
Running
| 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 | |