Add boolean flags for gravity compensation and surface velocity in mjModel.
These fields (`flg_gravcomp` and `flg_surfacevel`) replace the fast-path checks originally guarded by `ngravcomp` and (recently) `nsurfacevel`. Since the engine uses these integers only as flags (zero vs non-zero), migrating them to actual booleans makes them writeable from the Python bindings at runtime without violating size/dimension constraints. The legacy integer field `ngravcomp` is marked as deprecated and will be removed in a future release. PiperOrigin-RevId: 949779204 Change-Id: Ifab1f026063a4239302e6ad689663b611b59dda8
This commit is contained in:
committed by
Copybara-Service
parent
ebd4abae03
commit
a04b0c5b97
@@ -169,6 +169,25 @@ class MuJoCoBindingsTest(parameterized.TestCase):
|
||||
self.data.qpos, [0.12345] * len(self.data.qpos)
|
||||
)
|
||||
|
||||
def test_flg_gravcomp_and_surfacevel_properties(self):
|
||||
self.assertFalse(self.model.flg_gravcomp)
|
||||
self.assertFalse(self.model.flg_surfacevel)
|
||||
self.assertEqual(self.model.ngravcomp, 0)
|
||||
|
||||
self.model.flg_gravcomp = True
|
||||
self.assertTrue(self.model.flg_gravcomp)
|
||||
self.assertEqual(self.model.ngravcomp, 1)
|
||||
|
||||
self.model.flg_surfacevel = True
|
||||
self.assertTrue(self.model.flg_surfacevel)
|
||||
|
||||
self.model.flg_gravcomp = False
|
||||
self.assertFalse(self.model.flg_gravcomp)
|
||||
self.assertEqual(self.model.ngravcomp, 0)
|
||||
|
||||
self.model.flg_surfacevel = False
|
||||
self.assertFalse(self.model.flg_surfacevel)
|
||||
|
||||
def test_array_is_a_view(self):
|
||||
qpos_ref = self.data.qpos
|
||||
self.data.qpos = 0.789
|
||||
|
||||
@@ -1368,11 +1368,6 @@ STRUCTS: Mapping[str, StructDecl] = dict([
|
||||
type=ValueType(name='mjtSize'),
|
||||
doc='number of bodies with nonzero gravcomp',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='nsurfacevel',
|
||||
type=ValueType(name='mjtSize'),
|
||||
doc='number of geoms with nonzero surfacevel',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='nemax',
|
||||
type=ValueType(name='mjtSize'),
|
||||
@@ -1428,6 +1423,16 @@ STRUCTS: Mapping[str, StructDecl] = dict([
|
||||
type=ValueType(name='mjtSize'),
|
||||
doc='number of bytes in buffer',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='flg_gravcomp',
|
||||
type=ValueType(name='mjtBool'),
|
||||
doc='whether any body has nonzero gravcomp',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='flg_surfacevel',
|
||||
type=ValueType(name='mjtBool'),
|
||||
doc='whether any geom has nonzero surfacevel',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='opt',
|
||||
type=ValueType(name='mjOption'),
|
||||
|
||||
@@ -350,6 +350,21 @@ This is useful for example when the MJB is not available as a file on disk.)"));
|
||||
mjModel.def_readonly("vis", &MjModelWrapper::vis);
|
||||
mjModel.def_readonly("stat", &MjModelWrapper::stat);
|
||||
|
||||
mjModel.def_property(
|
||||
"flg_gravcomp",
|
||||
[](const MjModelWrapper& m) { return m.get()->flg_gravcomp; },
|
||||
[](MjModelWrapper& m, bool val) {
|
||||
m.get()->flg_gravcomp = val;
|
||||
m.get()->ngravcomp = val ? 1 : 0;
|
||||
});
|
||||
|
||||
mjModel.def_property(
|
||||
"flg_surfacevel",
|
||||
[](const MjModelWrapper& m) { return m.get()->flg_surfacevel; },
|
||||
[](MjModelWrapper& m, bool val) {
|
||||
m.get()->flg_surfacevel = val;
|
||||
});
|
||||
|
||||
#define X(var) \
|
||||
mjModel.def_property_readonly( \
|
||||
#var, [](const MjModelWrapper& m) { return m.get()->var; });
|
||||
|
||||
Reference in New Issue
Block a user