Modify MJX sensor_pos to handle unsupported sensors.
PiperOrigin-RevId: 663768186 Change-Id: I2e7600e77855a96a47f012fb64b6cc43abbf6f64
This commit is contained in:
committed by
Copybara-Service
parent
4d9305fbb9
commit
ce9c0ea351
@@ -31,7 +31,8 @@ def sensor_pos(m: Model, d: Data) -> Data:
|
|||||||
"""Compute position-dependent sensors values."""
|
"""Compute position-dependent sensors values."""
|
||||||
|
|
||||||
# no position-dependent sensors
|
# no position-dependent sensors
|
||||||
if sum(m.sensor_needstage == mujoco.mjtStage.mjSTAGE_POS) == 0:
|
stage_pos = m.sensor_needstage == mujoco.mjtStage.mjSTAGE_POS
|
||||||
|
if sum(stage_pos) == 0:
|
||||||
return d
|
return d
|
||||||
|
|
||||||
# position and orientation by object type
|
# position and orientation by object type
|
||||||
@@ -56,7 +57,7 @@ def sensor_pos(m: Model, d: Data) -> Data:
|
|||||||
|
|
||||||
sensors, adrs = [], []
|
sensors, adrs = [], []
|
||||||
|
|
||||||
for sensor_type in set(m.sensor_type):
|
for sensor_type in set(m.sensor_type[stage_pos]):
|
||||||
idx = m.sensor_type == sensor_type
|
idx = m.sensor_type == sensor_type
|
||||||
objid = m.sensor_objid[idx]
|
objid = m.sensor_objid[idx]
|
||||||
adr = m.sensor_adr[idx]
|
adr = m.sensor_adr[idx]
|
||||||
@@ -126,10 +127,15 @@ def sensor_pos(m: Model, d: Data) -> Data:
|
|||||||
adr = (adr[:, None] + np.arange(3)[None]).reshape(-1)
|
adr = (adr[:, None] + np.arange(3)[None]).reshape(-1)
|
||||||
elif sensor_type == SensorType.CLOCK:
|
elif sensor_type == SensorType.CLOCK:
|
||||||
sensor = jp.repeat(d.time, sum(idx))
|
sensor = jp.repeat(d.time, sum(idx))
|
||||||
|
else:
|
||||||
|
continue # unsupported sensor type
|
||||||
|
|
||||||
sensors.append(sensor)
|
sensors.append(sensor)
|
||||||
adrs.append(adr)
|
adrs.append(adr)
|
||||||
|
|
||||||
|
if not adrs:
|
||||||
|
return d
|
||||||
|
|
||||||
sensordata = d.sensordata.at[np.concatenate(adrs)].set(
|
sensordata = d.sensordata.at[np.concatenate(adrs)].set(
|
||||||
jp.concatenate(sensors)
|
jp.concatenate(sensors)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -62,6 +62,13 @@ class SensorTest(parameterized.TestCase):
|
|||||||
# sensor values
|
# sensor values
|
||||||
_assert_eq(d.sensordata, dx.sensordata, 'sensordata')
|
_assert_eq(d.sensordata, dx.sensordata, 'sensordata')
|
||||||
|
|
||||||
|
def test_unsupported_sensor(self):
|
||||||
|
"""Tests MJX sensor functions do not break for unsupported sensors."""
|
||||||
|
m = test_util.load_test_file('unsupported_sensor.xml')
|
||||||
|
mx = mjx.put_model(m)
|
||||||
|
dx = jax.jit(mjx.forward)(mx, mjx.put_data(m, mujoco.MjData(m)))
|
||||||
|
_assert_eq(np.zeros(m.nsensordata), dx.sensordata, 'sensordata')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
absltest.main()
|
absltest.main()
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!-- For validating model with unsupported sensor -->
|
||||||
|
<mujoco model="unsupported_sensor">
|
||||||
|
<worldbody>
|
||||||
|
<body>
|
||||||
|
<joint type="hinge"/>
|
||||||
|
<geom name="geom0" size="1"/>
|
||||||
|
<site name="site"/>
|
||||||
|
</body>
|
||||||
|
<body>
|
||||||
|
<joint type="hinge"/>
|
||||||
|
<geom name="geom1" size="1"/>
|
||||||
|
</body>
|
||||||
|
</worldbody>
|
||||||
|
<sensor>
|
||||||
|
<distance name="distance" geom1="geom0" geom2="geom1"/>
|
||||||
|
<framelinvel name="framelinvel" objtype="site" objname="site"/>
|
||||||
|
<touch name="touch" site="site"/>
|
||||||
|
</sensor>
|
||||||
|
</mujoco>
|
||||||
Reference in New Issue
Block a user