import numpy as np import re import os import argparse def natural_sort(l): convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] return sorted(l, key = alphanum_key) def angular_distance_np(R_hat, R): # measure the angular distance between two rotation matrice # R1,R2: [n, 3, 3] if R_hat.shape == (3,3): R_hat = R_hat[np.newaxis,:] if R.shape == (3,3): R = R[np.newaxis,:] n = R.shape[0] trace_idx = [0,4,8] trace = np.matmul(R_hat, R.transpose(0,2,1)).reshape(n,-1)[:,trace_idx].sum(1) metric = np.arccos(((trace - 1)/2).clip(-1,1)) / np.pi * 180.0 return metric def main(): parser = argparse.ArgumentParser(description='Rotation and translation metric.') parser.add_argument('--trans1', type=str) parser.add_argument('--trans2', type=str) args = parser.parse_args() transFiles1 = natural_sort([file for file in os.listdir(args.trans1) if (file.find("npy") != -1 )]) transFiles1 = [os.path.join(args.trans1, img) for img in transFiles1] transFiles2 = natural_sort([file for file in os.listdir(args.trans2) if (file.find("npy") != -1 )]) transFiles2 = [os.path.join(args.trans2, img) for img in transFiles2] # print(len(transFiles1), transFiles1) # print(len(transFiles2), transFiles2) for T1_file, T2_file in zip(transFiles1, transFiles2): T1 = np.load(T1_file) T2 = np.load(T2_file) print("Shapes: ", T1.shape, T2.shape) for i in range(T1.shape[2]): R1 = T1[:3, :3, i] R2 = T2[:3, :3, i] t1 = T1[:4, -1, i] t2 = T2[:4, -1, i] R_norm = angular_distance_np(R1.reshape(1,3,3), R2.reshape(1,3,3))[0] print("R norm:", R_norm) exit(1) if __name__ == "__main__": main()