Skip to content

Commit 0dd0eb8

Browse files
committed
[tests/python] test_finite_diff.py does not require Pinocchio, just use pytest.mark.skipif if not present
[python] Add helper function has_pinocchio_features()
1 parent b76176b commit 0dd0eb8

File tree

3 files changed

+45
-26
lines changed

3 files changed

+45
-26
lines changed

bindings/python/src/module.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@ BOOST_PYTHON_MODULE(MODULE_NAME) {
8181
bp::import("warnings");
8282
bp::import("proxsuite_nlp");
8383

84+
bp::def(
85+
"has_pinocchio_features",
86+
+[]() constexpr -> bool {
87+
return
88+
#ifdef ALIGATOR_WITH_PINOCCHIO
89+
true;
90+
#else
91+
false;
92+
#endif
93+
},
94+
"Whether Aligator (and its Python bindings) were compiled with support "
95+
"for Pinocchio.");
96+
8497
exposeContainers();
8598
exposeGAR();
8699
exposeEnums();

tests/python/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ if(NOT BUILD_WITH_PINOCCHIO_PYTHON_BINDINGS)
1616
endif()
1717
if(NOT PINOCCHIO_V3)
1818
list(REMOVE_ITEM PYTHON_TESTS test_constrained_dynamics.py)
19-
list(REMOVE_ITEM PYTHON_TESTS test_finite_diff.py)
2019
list(REMOVE_ITEM PYTHON_TESTS test_frames.py)
2120
endif()
2221
make_directory(${CMAKE_CURRENT_BINARY_DIR})

tests/python/test_finite_diff.py

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,19 @@
55
ControlBoxFunction,
66
StateErrorResidual,
77
manifolds,
8+
has_pinocchio_features,
89
)
910
import numpy as np
11+
import pytest
12+
13+
# Attempt importing Pinocchio at least. Then, check if the Python module
14+
# has Pinocchio features.
15+
try:
16+
import pinocchio as pin
17+
18+
HAS_PINOCCHIO = has_pinocchio_features()
19+
except ImportError:
20+
HAS_PINOCCHIO = False
1021

1122

1223
def test_compute_jac_vs():
@@ -31,32 +42,28 @@ def test_compute_jac_vs():
3142
assert np.allclose(fdata1.Jy, fdata1b.Jy, 1e-2)
3243

3344

45+
@pytest.mark.skipif(not HAS_PINOCCHIO, reason="Pinocchio bindings not present.")
3446
def test_compute_jac_multibody():
35-
try:
36-
import pinocchio as pin
37-
38-
model = pin.buildSampleModelHumanoid()
39-
space = manifolds.MultibodyConfiguration(model)
40-
nu = 3
41-
x_tar = space.neutral()
42-
fun2 = StateErrorResidual(space, nu, x_tar)
43-
fdata2 = fun2.createData()
44-
fun2_fd = FiniteDifferenceHelper(space, fun2, 1e-6)
45-
fdata2b = fun2_fd.createData()
46-
for i in range(1000):
47-
x0 = pin.randomConfiguration(model, -np.ones(model.nq), np.ones(model.nq))
48-
u0 = 0.6 * np.ones(nu)
49-
fun2.evaluate(x0, u0, x0, fdata2)
50-
fun2_fd.evaluate(x0, u0, x0, fdata2b)
51-
assert np.allclose(fdata2.value, fdata2b.value, 1e-2)
52-
fun2.computeJacobians(x0, u0, x0, fdata2)
53-
fun2_fd.computeJacobians(x0, u0, x0, fdata2b)
54-
assert np.allclose(fdata2.Jx, fdata2b.Jx, 1e-2)
55-
assert np.allclose(fdata2.Ju, fdata2b.Ju, 1e-2)
56-
assert np.allclose(fdata2.Jy, fdata2b.Jy, 1e-2)
57-
return
58-
except ImportError:
59-
pass
47+
model = pin.buildSampleModelHumanoid()
48+
space = manifolds.MultibodyConfiguration(model)
49+
nu = 3
50+
x_tar = space.neutral()
51+
fun2 = StateErrorResidual(space, nu, x_tar)
52+
fdata2 = fun2.createData()
53+
fun2_fd = FiniteDifferenceHelper(space, fun2, 1e-6)
54+
fdata2b = fun2_fd.createData()
55+
for i in range(1000):
56+
x0 = pin.randomConfiguration(model, -np.ones(model.nq), np.ones(model.nq))
57+
u0 = 0.6 * np.ones(nu)
58+
fun2.evaluate(x0, u0, x0, fdata2)
59+
fun2_fd.evaluate(x0, u0, x0, fdata2b)
60+
assert np.allclose(fdata2.value, fdata2b.value, 1e-2)
61+
fun2.computeJacobians(x0, u0, x0, fdata2)
62+
fun2_fd.computeJacobians(x0, u0, x0, fdata2b)
63+
assert np.allclose(fdata2.Jx, fdata2b.Jx, 1e-2)
64+
assert np.allclose(fdata2.Ju, fdata2b.Ju, 1e-2)
65+
assert np.allclose(fdata2.Jy, fdata2b.Jy, 1e-2)
66+
return
6067

6168

6269
def test_compute_cost_se3():

0 commit comments

Comments
 (0)