|
|
|
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 = gt[i] |
|
gt_xyz = cur_gt[:3, 3] |
|
|
|
|
|
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 |
|
|
|
|