| import numpy as np |
| import open3d as o3d |
|
|
| def validate_rotation(rotation): |
| |
| 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) |
|
|
| |
| random_transformation = np.eye(4) |
| random_transformation[:3, :3] = rotation |
| random_transformation[:3, 3] = translation |
| |
| return random_transformation |