diff --git a/doc/changelog.rst b/doc/changelog.rst index ab4bf146..2a45434a 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -18,6 +18,8 @@ MJX 3. Fixed bug where mixed ``jnt_limited`` joints were not being constrained correctly. 4. Made ``device_put`` type validation more verbose (fixes :github:issue:`1113`). 5. Removed empty EFC rows from `MJX`, for joints with no limits (fixes :github:issue:`1117`). +6. Fixed bug where equality constraints became inactive (fixes :github:issue:`1129`). +7. Added an error when loading a model with tendons (fixes :github:issue:`1149`). Python bindings ^^^^^^^^^^^^^^^ diff --git a/mjx/mujoco/mjx/_src/device.py b/mjx/mujoco/mjx/_src/device.py index a917e7f9..072755ea 100644 --- a/mjx/mujoco/mjx/_src/device.py +++ b/mjx/mujoco/mjx/_src/device.py @@ -126,6 +126,9 @@ def _validate(m: mujoco.MjModel): ): raise NotImplementedError('Only condim=3 is supported.') + if m.ntendon: + raise NotImplementedError('Tendons are not supported.') + # check collision geom types candidate_set = collision_driver.collision_candidates(m) for g1, g2, *_ in candidate_set: diff --git a/mjx/mujoco/mjx/_src/device_test.py b/mjx/mujoco/mjx/_src/device_test.py index bdc4e2d4..e8aa09b9 100644 --- a/mjx/mujoco/mjx/_src/device_test.py +++ b/mjx/mujoco/mjx/_src/device_test.py @@ -121,45 +121,45 @@ class ValidateInputTest(absltest.TestCase): '' ) with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_cone(self): m = mujoco.MjModel.from_xml_string( '' ) with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_trn(self): m = test_util.load_test_file('ant.xml') m.actuator_trntype[0] = mujoco.mjtTrn.mjTRN_SITE with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_dyn(self): m = test_util.load_test_file('ant.xml') m.actuator_dyntype[0] = mujoco.mjtDyn.mjDYN_MUSCLE with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_gain(self): m = test_util.load_test_file('ant.xml') m.actuator_gaintype[0] = mujoco.mjtGain.mjGAIN_MUSCLE with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_bias(self): m = test_util.load_test_file('ant.xml') m.actuator_gaintype[0] = mujoco.mjtGain.mjGAIN_MUSCLE with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_condim(self): m = test_util.load_test_file('ant.xml') for i in [1, 4, 6]: m.geom_condim[0] = i with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) def test_geoms(self): m = mujoco.MjModel.from_xml_string(""" @@ -177,7 +177,31 @@ class ValidateInputTest(absltest.TestCase): """) with self.assertRaises(NotImplementedError): - _ = mjx.device_put(m) + mjx.device_put(m) + + def test_tendon(self): + m = mujoco.MjModel.from_xml_string(""" + + + + + + + + + + + + + + + + + + + """) + with self.assertRaises(NotImplementedError): + mjx.device_put(m) if __name__ == '__main__':