''' Tools for Manipulating and Converting 3D Rotations By Omid Alemi Created: June 12, 2017 Adapted from that matlab file... ''' import math import numpy as np def deg2rad(x): return x/180*math.pi class Rotation(): def __init__(self,rot, param_type, **params): self.rotmat = [] if param_type == 'euler': self._from_euler(rot[0],rot[1],rot[2], params) def _from_euler(self, alpha, beta, gamma, params): '''Expecting degress''' if params['from_deg']==True: alpha = deg2rad(alpha) beta = deg2rad(beta) gamma = deg2rad(gamma) Rx = np.asarray([[1, 0, 0], [0, math.cos(alpha), -math.sin(alpha)], [0, math.sin(alpha), math.cos(alpha)] ]) Ry = np.asarray([[math.cos(beta), 0, math.sin(beta)], [0, 1, 0], [-math.sin(beta), 0, math.cos(beta)]]) Rz = np.asarray([[math.cos(gamma), -math.sin(gamma), 0], [math.sin(gamma), math.cos(gamma), 0], [0, 0, 1]]) self.rotmat = np.matmul(np.matmul(Rz, Ry), Rx).T def get_euler_axis(self): R = self.rotmat theta = math.acos((self.rotmat.trace() - 1) / 2) axis = np.asarray([R[2,1] - R[1,2], R[0,2] - R[2,0], R[1,0] - R[0,1]]) axis = axis/(2*math.sin(theta)) return theta, axis def to_expmap(self): theta, axis = self.get_euler_axis() rot_arr = theta * axis if np.isnan(rot_arr).any(): rot_arr = [0, 0, 0] return rot_arr def to_euler(self): #TODO pass def to_quat(self): #TODO pass