Skip to content

Commit 17ff36c

Browse files
committed
add pose correctness tests
1 parent b6de85f commit 17ff36c

File tree

1 file changed

+84
-8
lines changed

1 file changed

+84
-8
lines changed

tests/python_tests/test_geometry.py

Lines changed: 84 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import numpy as np
44
import pytest
55
from scipy.spatial.transform import Rotation as Rot
6+
from scipy.spatial.transform import RigidTransform as Rigid
67

78
from genmetaballs._genmetaballs_bindings import geometry as geometry
89

@@ -32,16 +33,18 @@ def test_vec3d_repr_returns_valid_string() -> None:
3233
]
3334
)
3435
def test_vec3d_ops(rng: np.random.Generator, np_op, vec3d_op) -> None:
35-
_a, _b = rng.uniform(size=3), rng.uniform(size=3)
36-
a, b = geometry.Vec3D(*_a), geometry.Vec3D(*_b)
37-
c = vec3d_op(a, b)
38-
_c = np_op(_a, _b)
39-
assert np.allclose(_c, np.array([c.x, c.y, c.z]))
36+
_a, _b = rng.uniform(size=(100, 3)), rng.uniform(size=(100, 3))
37+
for i in range(100):
38+
a, b = geometry.Vec3D(*_a[i]), geometry.Vec3D(*_b[i])
39+
c = vec3d_op(a, b)
40+
_c = np_op(_a[i], _b[i])
41+
assert np.allclose(_c, np.array([c.x, c.y, c.z]))
4042

4143
def test_vec3d_dot(rng: np.random.Generator) -> None:
42-
_a, _b = rng.uniform(size=3), rng.uniform(size=3)
43-
a, b = geometry.Vec3D(*_a), geometry.Vec3D(*_b)
44-
assert np.allclose(np.dot(_a, _b), geometry.dot(a, b))
44+
_a, _b = rng.uniform(size=(100, 3)), rng.uniform(size=(100, 3))
45+
for i in range(100):
46+
a, b = geometry.Vec3D(*_a[i]), geometry.Vec3D(*_b[i])
47+
assert np.allclose(np.dot(_a[i], _b[i]), geometry.dot(a, b))
4548

4649
def test_rotation_apply(rng: np.random.Generator) -> None:
4750
quats = rng.uniform(-1, 1, size=(100, 4))
@@ -104,3 +107,76 @@ def test_rotation_inv(rng: np.random.Generator) -> None:
104107
rtol=1e-5,
105108
atol=1e-6,
106109
)
110+
111+
def test_pose_apply(rng: np.random.Generator) -> None:
112+
exp_coords = rng.uniform(size=(100, 6))
113+
vecs = rng.uniform(size=(100, 3))
114+
115+
for i in range(100):
116+
pose_scipy = Rigid.from_exp_coords(exp_coords[i])
117+
118+
pose_geom = geometry.Pose.from_components(
119+
rot=geometry.Rotation.from_quat(*pose_scipy.rotation.as_quat()),
120+
tran=geometry.Vec3D(*pose_scipy.translation),
121+
)
122+
vec_geom = geometry.Vec3D(*vecs[i])
123+
124+
result_scipy = pose_scipy.apply(vecs[i])
125+
result_geom = pose_geom.apply(vec_geom)
126+
127+
assert np.allclose(result_scipy, np.array([result_geom.x, result_geom.y, result_geom.z]))
128+
129+
def test_pose_compose(rng: np.random.Generator) -> None:
130+
exp_coords1 = rng.uniform(size=(100, 6))
131+
exp_coords2 = rng.uniform(size=(100, 6))
132+
vecs = rng.uniform(size=(50, 3))
133+
134+
for i in range(100):
135+
pose1_scipy = Rigid.from_exp_coords(exp_coords1[i])
136+
pose2_scipy = Rigid.from_exp_coords(exp_coords2[i])
137+
composed_scipy = pose1_scipy * pose2_scipy
138+
139+
pose1_geom = geometry.Pose.from_components(
140+
rot=geometry.Rotation.from_quat(*pose1_scipy.rotation.as_quat()),
141+
tran=geometry.Vec3D(*pose1_scipy.translation),
142+
)
143+
pose2_geom = geometry.Pose.from_components(
144+
rot=geometry.Rotation.from_quat(*pose2_scipy.rotation.as_quat()),
145+
tran=geometry.Vec3D(*pose2_scipy.translation),
146+
)
147+
composed_geom = pose1_geom.compose(pose2_geom)
148+
149+
for j in range(50):
150+
vec_geom = geometry.Vec3D(*vecs[j])
151+
result_scipy = composed_scipy.apply(vecs[j])
152+
result_geom = composed_geom.apply(vec_geom)
153+
assert np.allclose(
154+
result_scipy,
155+
np.array([result_geom.x, result_geom.y, result_geom.z]),
156+
rtol=1e-5,
157+
atol=1e-6,
158+
)
159+
160+
def test_pose_inv(rng: np.random.Generator) -> None:
161+
exp_coords = rng.uniform(size=(100, 6))
162+
vecs = rng.uniform(size=(50, 3))
163+
164+
for i in range(100):
165+
pose_scipy = Rigid.from_exp_coords(exp_coords[i])
166+
167+
pose = geometry.Pose.from_components(
168+
rot=geometry.Rotation.from_quat(*pose_scipy.rotation.as_quat()),
169+
tran=geometry.Vec3D(*pose_scipy.translation),
170+
)
171+
poseinv = pose.inv()
172+
composed = pose.compose(poseinv)
173+
174+
for j in range(50):
175+
vec = geometry.Vec3D(*vecs[j])
176+
vec_ = composed.apply(vec)
177+
assert np.allclose(
178+
np.array([vec.x, vec.y, vec.z]),
179+
np.array([vec_.x, vec_.y, vec_.z]),
180+
rtol=1e-5,
181+
atol=1e-6,
182+
)

0 commit comments

Comments
 (0)