R3PM-Net / tools /transformations.py
YasiiKB's picture
initial commit
97aa5af verified
import numpy as np
import open3d as o3d
def validate_rotation(rotation):
# Check if the rotation matrix is valid (orthogonal and determinant = 1)
is_orthogonal = np.allclose(np.dot(rotation[:3, :3], rotation[:3, :3].T), np.eye(3))
is_determinant_one = np.isclose(np.linalg.det(rotation[:3, :3]), 1)
return is_orthogonal and is_determinant_one
def random_translation(translation_range):
return np.random.uniform(translation_range[0], translation_range[1], size=3)
def create_transformation(x_angle, y_angle, z_angle, translation_range):
'''
Generate a random transformation matrix with given rotation angles and translation range using open3d methods.
Args:
x_angle (float): Rotation angle around the x-axis in degrees.
y_angle (float): Rotation angle around the y-axis in degrees.
z_angle (float): Rotation angle around the z-axis in degrees.
translation_range (list): Range for random translation [min, max].
Returns:
np.ndarray: A 4x4 transformation matrix.
'''
x_angle = np.deg2rad(x_angle)
y_angle = np.deg2rad(y_angle)
z_angle = np.deg2rad(z_angle)
rotation = o3d.geometry.get_rotation_matrix_from_zxy([z_angle, y_angle, x_angle])
translation = random_translation(translation_range)
# Create a 4x4 transformation matrix
random_transformation = np.eye(4)
random_transformation[:3, :3] = rotation
random_transformation[:3, 3] = translation
return random_transformation