| import numpy as np |
| import pytest |
| import sapien |
| import torch |
| from transforms3d.euler import euler2quat |
|
|
| from mani_skill.utils.structs.pose import Pose |
|
|
|
|
| def test_pose_creation(): |
| pose = Pose.create_from_pq() |
| assert pose.raw_pose.shape == (1, 7) |
| assert isinstance(pose.raw_pose, torch.Tensor) |
| assert torch.isclose(pose.raw_pose, torch.tensor([[0, 0, 0, 1.0, 0, 0, 0]])).all() |
|
|
|
|
| def test_pose_create_with_p(): |
| pose = Pose.create_from_pq(p=[1, 0, 2]) |
| assert torch.isclose(pose.raw_pose, torch.tensor([[1, 0, 2, 1.0, 0, 0, 0]])).all() |
|
|
| pose = Pose.create_from_pq(p=[[1, 0, 2], [1, 0, -2]]) |
| assert torch.isclose( |
| pose.raw_pose, torch.tensor([[1, 0, 2, 1.0, 0, 0, 0], [1, 0, -2, 1.0, 0, 0, 0]]) |
| ).all() |
|
|
|
|
| def test_pose_create_with_q(): |
| w, x, y, z = euler2quat(0.3, 0.4, -0.2) |
| pose = Pose.create_from_pq(q=[w, x, y, z]) |
| assert torch.isclose( |
| pose.raw_pose, torch.tensor([[0, 0, 0, w, x, y, z]]).float() |
| ).all() |
|
|
| w, x, y, z = euler2quat(0.3, 0.4, -0.2) |
| w2, x2, y2, z2 = euler2quat(0.3, 0.4, -0.2) |
| pose = Pose.create_from_pq(p=[1, 2, 3], q=[[w, x, y, z], [w2, x2, y2, z2]]) |
| assert torch.isclose( |
| pose.raw_pose, |
| torch.tensor([[1, 2, 3, w, x, y, z], [1, 2, 3, w2, x2, y2, z2]]).float(), |
| ).all() |
|
|
|
|
| def test_pose_to_sapien_pose(): |
| p = [1, 2, 4] |
| q = euler2quat(0, -0.3, 1) |
| sapien_pose = sapien.Pose(p=p, q=q) |
| pose = Pose.create_from_pq(p=p, q=q) |
| assert isinstance(pose.sp, sapien.Pose) |
| assert np.all(pose.sp.p == sapien_pose.p) |
| assert np.all(pose.sp.q == sapien_pose.q) |
|
|
|
|
| def test_pose_mult(): |
| p = [1, 2, 4] |
| q = euler2quat(0, -0.3, 1) |
| sapien_pose = sapien.Pose(p=p, q=q) |
| pose = Pose.create_from_pq(p=p, q=q) |
|
|
| pose = pose * pose |
| sapien_pose = sapien_pose * sapien_pose |
| assert np.isclose(pose.sp.p, sapien_pose.p).all() |
| assert np.isclose(pose.sp.q, sapien_pose.q).all() |
|
|
| p = [[1, 2, 3], [-2.5, 3, 0]] |
| q = [euler2quat(0, -0.3, 1), euler2quat(0.9, 0.3, -1)] |
| sapien_pose1 = sapien.Pose(p=p[0], q=q[0]) |
| sapien_pose2 = sapien.Pose(p=p[1], q=q[1]) |
| pose = Pose.create_from_pq(p=p, q=q) |
| pose = pose * pose |
| sapien_pose1 = sapien_pose1 * sapien_pose1 |
| sapien_pose2 = sapien_pose2 * sapien_pose2 |
| for i, sp in enumerate([sapien_pose1, sapien_pose2]): |
| assert np.isclose(pose.p[i], sp.p).all() |
| assert np.isclose(pose.q[i], sp.q).all() |
|
|
|
|
| def test_pose_inv(): |
| p = [1, 2, 4] |
| q = euler2quat(0, -0.3, 1) |
| sapien_pose = sapien.Pose(p=p, q=q) |
| pose = Pose.create_from_pq(p=p, q=q) |
|
|
| pose = pose.inv() |
| sapien_pose = sapien_pose.inv() |
| assert np.isclose(pose.sp.p, sapien_pose.p).all() |
| assert np.isclose(pose.sp.q, sapien_pose.q).all() |
|
|
| p = [[1, 2, 3], [-2.5, 3, 0]] |
| q = [euler2quat(0, -0.3, 1), euler2quat(0.9, 0.3, -1)] |
| sapien_pose1 = sapien.Pose(p=p[0], q=q[0]) |
| sapien_pose2 = sapien.Pose(p=p[1], q=q[1]) |
| pose = Pose.create_from_pq(p=p, q=q) |
| pose = pose.inv() |
| sapien_pose1 = sapien_pose1.inv() |
| sapien_pose2 = sapien_pose2.inv() |
| for i, sp in enumerate([sapien_pose1, sapien_pose2]): |
| assert np.isclose(pose.p[i], sp.p).all() |
| assert np.isclose(pose.q[i], sp.q).all() |
|
|
|
|
| def test_pose_transformation_matrix(): |
| p = [1, 2, 4] |
| q = euler2quat(0, -0.3, 1) |
| sapien_pose = sapien.Pose(p=p, q=q) |
| pose = Pose.create_from_pq(p=p, q=q) |
|
|
| pose = pose.to_transformation_matrix() |
| sapien_pose = sapien_pose.to_transformation_matrix() |
| assert np.isclose(pose, sapien_pose).all() |
|
|
| p = [[1, 2, 3], [-2.5, 3, 0]] |
| q = [euler2quat(0, -0.3, 1), euler2quat(0.9, 0.3, -1)] |
| sapien_pose1 = sapien.Pose(p=p[0], q=q[0]) |
| sapien_pose2 = sapien.Pose(p=p[1], q=q[1]) |
| pose = Pose.create_from_pq(p=p, q=q) |
| pose = pose.to_transformation_matrix() |
| sapien_pose1 = sapien_pose1.to_transformation_matrix() |
| sapien_pose2 = sapien_pose2.to_transformation_matrix() |
| for i, sp in enumerate([sapien_pose1, sapien_pose2]): |
| assert np.isclose(pose[i], sp).all() |
|
|