Add sensordata MJX binding.
PiperOrigin-RevId: 716241711 Change-Id: I11a82f58c41dca93e9a5337f0c573158026fa971
This commit is contained in:
committed by
Copybara-Service
parent
4903d5321c
commit
c16f95f62c
@@ -381,6 +381,7 @@ class BindData(object):
|
|||||||
|
|
||||||
def __init__(self, data: Data, model: Model, specs: Sequence[Any]):
|
def __init__(self, data: Data, model: Model, specs: Sequence[Any]):
|
||||||
self.data = data
|
self.data = data
|
||||||
|
self.model = model
|
||||||
try:
|
try:
|
||||||
iter(specs)
|
iter(specs)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
@@ -438,10 +439,22 @@ class BindData(object):
|
|||||||
return self.prefix + name
|
return self.prefix + name
|
||||||
|
|
||||||
def __getattr__(self, name: str):
|
def __getattr__(self, name: str):
|
||||||
|
if name == 'sensordata':
|
||||||
|
adr = self.model.sensor_adr[self.id]
|
||||||
|
num = self.model.sensor_dim[self.id]
|
||||||
|
if isinstance(self.id, list):
|
||||||
|
idx = []
|
||||||
|
for i, n in zip(self.id, num):
|
||||||
|
idx.extend(adr[i] + j for j in range(n))
|
||||||
|
return getattr(self.data, name)[idx, ...]
|
||||||
|
else:
|
||||||
|
return getattr(self.data, name)[adr : adr + num, ...]
|
||||||
return getattr(self.data, self.__getname(name))[self.id, ...]
|
return getattr(self.data, self.__getname(name))[self.id, ...]
|
||||||
|
|
||||||
def set(self, name: str, value: jax.Array) -> Data:
|
def set(self, name: str, value: jax.Array) -> Data:
|
||||||
"""Set the value of an array in an MJX Data."""
|
"""Set the value of an array in an MJX Data."""
|
||||||
|
if name == 'sensordata':
|
||||||
|
raise AttributeError('sensordata is readonly')
|
||||||
array = getattr(self.data, self.__getname(name))
|
array = getattr(self.data, self.__getname(name))
|
||||||
try:
|
try:
|
||||||
iter(value)
|
iter(value)
|
||||||
|
|||||||
@@ -180,6 +180,12 @@ class SupportTest(parameterized.TestCase):
|
|||||||
<motor name="actuator2" joint="joint2"/>
|
<motor name="actuator2" joint="joint2"/>
|
||||||
<motor name="actuator3" joint="joint3"/>
|
<motor name="actuator3" joint="joint3"/>
|
||||||
</actuator>
|
</actuator>
|
||||||
|
|
||||||
|
<sensor>
|
||||||
|
<framepos name="sensor1" objtype="body" objname="body1"/>
|
||||||
|
<framepos name="sensor2" objtype="body" objname="body2"/>
|
||||||
|
<framepos name="sensor3" objtype="body" objname="body3"/>
|
||||||
|
</sensor>
|
||||||
</mujoco>
|
</mujoco>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -224,6 +230,15 @@ class SupportTest(parameterized.TestCase):
|
|||||||
dx.bind(mx, s.actuators[i]).ctrl, d.ctrl[i]
|
dx.bind(mx, s.actuators[i]).ctrl, d.ctrl[i]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
np.testing.assert_array_equal(
|
||||||
|
dx.bind(mx, s.sensors).sensordata, d.sensordata
|
||||||
|
)
|
||||||
|
for i in range(m.nsensor):
|
||||||
|
np.testing.assert_array_equal(
|
||||||
|
dx.bind(mx, s.sensors[i]).sensordata,
|
||||||
|
d.sensordata[m.sensor_adr[i] : m.sensor_adr[i] + m.sensor_dim[i]],
|
||||||
|
)
|
||||||
|
|
||||||
# test setting
|
# test setting
|
||||||
np.testing.assert_array_equal(d.ctrl, [0, 0, 0])
|
np.testing.assert_array_equal(d.ctrl, [0, 0, 0])
|
||||||
np.testing.assert_array_equal(dx.bind(mx, s.actuators).ctrl, d.ctrl)
|
np.testing.assert_array_equal(dx.bind(mx, s.actuators).ctrl, d.ctrl)
|
||||||
|
|||||||
Reference in New Issue
Block a user