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__':