import numpy as np import os, sys # add python path of src to sys.path src_path = os.path.join(__file__, *(['..'] * 2)) src_path = os.path.abspath(src_path) sys.path.insert(0, src_path) from utils.tools import read_ply # 毫米波坐标系为右手坐标系。 # 毫米波设备分别绕xyz轴的旋转角度分别为 alpha, beta, gamma # 左乘旋转矩阵分别为 Rx_alpha, Ry_beta, Rz_gamma # Rx_alpha = [[1,0,0],[0,np.cos(alpha),np.sin(alpha)],[0,-np.sin(alpha),np.cos(alpha)]] # Ry_beta = [[np.cos(beta),0,-np.sin(beta)],[0,1,0],[np.sin(beta),0,np.cos(beta)]] # Rz_gamma = [[np.cos(gamma),np.sin(gamma),0],[-np.sin(gamma),np.cos(gamma),0],[0,0,1]] def get_rotation_matrix(alpha_degree,beta_degree,gamma_degree,verbose=0): """generate a rotation matrix from the specific angel """ rad_list = [] for i, angle in enumerate([alpha_degree,beta_degree,gamma_degree]): if np.abs(float(angle))>360: raise ValueError(f"incorrect angle value: value in [-360,360] is excepted, but {angle} is offered.") rad_list.append(np.pi * float(angle) / 180) alpha = rad_list[0] Rx_alpha = np.matrix([[1,0,0], [0,np.cos(rad_list[0]),np.sin(alpha)], [0,-np.sin(alpha),np.cos(alpha)]]) beta = rad_list[1] Ry_beta = np.matrix([[np.cos(beta),0,-np.sin(beta)], [0,1,0], [np.sin(beta),0,np.cos(beta)]]) gamma = rad_list[2] Rz_gamma = np.matrix([[np.cos(gamma),np.sin(gamma),0], [-np.sin(gamma),np.cos(gamma),0], [0,0,1]]) rotation_matrix = Rx_alpha * Ry_beta * Rz_gamma if verbose == 1: print(f"\n{alpha_degree}, rad {alpha}, Rx_alpha \n", Rx_alpha) print(f"\n{beta_degree}, {beta}, Ry_beta \n", Ry_beta) print(f"\n{gamma_degree}, {gamma}, Rz_gamma\n",Rz_gamma) print("\n rotation matrix\n",rotation_matrix) else: pass return rotation_matrix def compose_ply(muti_ply_with_angle: list): ply_nums = len(muti_ply_with_angle) composed_ply_array = None for i, ply_with_angle in enumerate( muti_ply_with_angle): angle = ply_with_angle[:-1] ply = ply_with_angle[-1] if isinstance(ply,str): ply = read_ply(ply) rotation_matrix = get_rotation_matrix(angle[0],angle[1],angle[2]) # z = (X * Y^T)^T = (Y * X^T) # np.matmul(rotation_matrix,ply.transpose()).transpose() == np.matmul(ply,rotation_matrix) rotated_ply = np.matmul(ply,rotation_matrix) if i == 0: composed_ply_array = np.array(rotated_ply) else: temp = np.array(rotated_ply) composed_ply_array = np.concatenate((composed_ply_array,temp),axis= 0 ) composed_ply_array = composed_ply_array.reshape(-1,3) return composed_ply_array