Empty out Model fields restricted to MuJoCo in the same way we do for Data fields.
PiperOrigin-RevId: 719705508 Change-Id: I4b07433481eafaea1d95a5bdd8fd83786939188f
This commit is contained in:
committed by
Copybara-Service
parent
2546fcefa0
commit
2c3d0becb2
@@ -39,7 +39,7 @@ def _strip_weak_type(tree):
|
|||||||
|
|
||||||
|
|
||||||
def _make_option(
|
def _make_option(
|
||||||
o: mujoco.MjOption, _full_compat: bool = False
|
o: mujoco.MjOption, _full_compat: bool = False # pylint: disable=invalid-name
|
||||||
) -> types.Option:
|
) -> types.Option:
|
||||||
"""Returns mjx.Option given mujoco.MjOption."""
|
"""Returns mjx.Option given mujoco.MjOption."""
|
||||||
if not _full_compat:
|
if not _full_compat:
|
||||||
@@ -183,6 +183,15 @@ def put_model(
|
|||||||
if f.metadata.get('restricted_to') != 'mjx'
|
if f.metadata.get('restricted_to') != 'mjx'
|
||||||
}
|
}
|
||||||
fields = {f: getattr(m, f) for f in mj_field_names}
|
fields = {f: getattr(m, f) for f in mj_field_names}
|
||||||
|
|
||||||
|
# zero out fields restricted to MuJoCo
|
||||||
|
if not _full_compat:
|
||||||
|
for f in types.Model.fields():
|
||||||
|
if f.metadata.get('restricted_to') == 'mujoco' and isinstance(
|
||||||
|
fields[f.name], np.ndarray
|
||||||
|
):
|
||||||
|
fields[f.name] = np.zeros((0,), dtype=fields[f.name].dtype)
|
||||||
|
|
||||||
fields['dof_hasfrictionloss'] = fields['dof_frictionloss'] > 0
|
fields['dof_hasfrictionloss'] = fields['dof_frictionloss'] > 0
|
||||||
fields['tendon_hasfrictionloss'] = fields['tendon_frictionloss'] > 0
|
fields['tendon_hasfrictionloss'] = fields['tendon_frictionloss'] > 0
|
||||||
fields['geom_rbound_hfield'] = fields['geom_rbound']
|
fields['geom_rbound_hfield'] = fields['geom_rbound']
|
||||||
@@ -522,7 +531,7 @@ def _make_contact(
|
|||||||
# if we have fewer Contacts for a condim range, pad the range with zeros
|
# if we have fewer Contacts for a condim range, pad the range with zeros
|
||||||
|
|
||||||
# build a map for where to find a dim-matching contact, or -1 if none
|
# build a map for where to find a dim-matching contact, or -1 if none
|
||||||
contact_map = np.zeros_like(dim) - 1
|
contact_map = -np.ones_like(dim)
|
||||||
for i, di in enumerate(fields['dim']):
|
for i, di in enumerate(fields['dim']):
|
||||||
space = [j for j, dj in enumerate(dim) if di == dj and contact_map[j] == -1]
|
space = [j for j, dj in enumerate(dim) if di == dj and contact_map[j] == -1]
|
||||||
if not space:
|
if not space:
|
||||||
@@ -672,7 +681,9 @@ def put_data(
|
|||||||
fields['_qLDiagInv_sparse'] = jp.zeros(0, dtype=float)
|
fields['_qLDiagInv_sparse'] = jp.zeros(0, dtype=float)
|
||||||
# otherwise clear out unused arrays
|
# otherwise clear out unused arrays
|
||||||
for f in types.Data.fields():
|
for f in types.Data.fields():
|
||||||
if f.metadata.get('restricted_to') == 'mujoco':
|
if f.metadata.get('restricted_to') == 'mujoco' and isinstance(
|
||||||
|
fields[f.name], np.ndarray
|
||||||
|
):
|
||||||
fields[f.name] = np.zeros(0, dtype=fields[f.name].dtype)
|
fields[f.name] = np.zeros(0, dtype=fields[f.name].dtype)
|
||||||
|
|
||||||
fields['contact'] = contact
|
fields['contact'] = contact
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ import jax
|
|||||||
from jax import numpy as jp
|
from jax import numpy as jp
|
||||||
import mujoco
|
import mujoco
|
||||||
from mujoco import mjx
|
from mujoco import mjx
|
||||||
|
# pylint: disable=g-importing-member
|
||||||
from mujoco.mjx._src.types import ConeType
|
from mujoco.mjx._src.types import ConeType
|
||||||
|
# pylint: enable=g-importing-member
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
@@ -117,6 +119,9 @@ class ModelIOTest(parameterized.TestCase):
|
|||||||
self.assertEqual(mx.nM, m.nM)
|
self.assertEqual(mx.nM, m.nM)
|
||||||
self.assertAlmostEqual(mx.opt.timestep, m.opt.timestep)
|
self.assertAlmostEqual(mx.opt.timestep, m.opt.timestep)
|
||||||
|
|
||||||
|
# fields restricted to MuJoCo should not be populated
|
||||||
|
self.assertEqual(mx.bvh_aabb.shape, (0,))
|
||||||
|
|
||||||
np.testing.assert_allclose(mx.body_parentid, m.body_parentid)
|
np.testing.assert_allclose(mx.body_parentid, m.body_parentid)
|
||||||
np.testing.assert_allclose(mx.geom_type, m.geom_type)
|
np.testing.assert_allclose(mx.geom_type, m.geom_type)
|
||||||
np.testing.assert_allclose(mx.geom_bodyid, m.geom_bodyid)
|
np.testing.assert_allclose(mx.geom_bodyid, m.geom_bodyid)
|
||||||
|
|||||||
Reference in New Issue
Block a user