Add tendon actuator force sensor to MJX.
PiperOrigin-RevId: 747344916 Change-Id: Iab513ff953408c002216ffff12e3f8c825cedc10
This commit is contained in:
committed by
Copybara-Service
parent
8e7457d7c6
commit
f317bd17c3
@@ -8,6 +8,7 @@ Upcoming version (not yet release)
|
|||||||
MJX
|
MJX
|
||||||
^^^
|
^^^
|
||||||
- Added inverse dynamics.
|
- Added inverse dynamics.
|
||||||
|
- Added tendon actuator force sensor.
|
||||||
|
|
||||||
Version 3.3.1 (Apr 9, 2025)
|
Version 3.3.1 (Apr 9, 2025)
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|||||||
+1
-1
@@ -246,7 +246,7 @@ The following features are **fully supported** in MJX:
|
|||||||
``FRAMEPOS``, ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``, ``SUBTREECOM``, ``CLOCK``,
|
``FRAMEPOS``, ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``, ``SUBTREECOM``, ``CLOCK``,
|
||||||
``VELOCIMETER``, ``GYRO``, ``JOINTVEL``, ``TENDONVEL``, ``ACTUATORVEL``, ``BALLANGVEL``, ``FRAMELINVEL``,
|
``VELOCIMETER``, ``GYRO``, ``JOINTVEL``, ``TENDONVEL``, ``ACTUATORVEL``, ``BALLANGVEL``, ``FRAMELINVEL``,
|
||||||
``FRAMEANGVEL``, ``SUBTREELINVEL``, ``SUBTREEANGMOM``, ``TOUCH``, ``ACCELEROMETER``, ``FORCE``, ``TORQUE``,
|
``FRAMEANGVEL``, ``SUBTREELINVEL``, ``SUBTREEANGMOM``, ``TOUCH``, ``ACCELEROMETER``, ``FORCE``, ``TORQUE``,
|
||||||
``ACTUATORFRC``, ``JOINTACTFRC``, ``FRAMELINACC``, ``FRAMEANGACC``
|
``ACTUATORFRC``, ``JOINTACTFRC``, ``TENDONACTFRC``, ``FRAMELINACC``, ``FRAMEANGACC``
|
||||||
(``ACCELEROMETER``, ``FORCE``, ``TORQUE`` not supported with connect or weld equality constraints)
|
(``ACCELEROMETER``, ``FORCE``, ``TORQUE`` not supported with connect or weld equality constraints)
|
||||||
|
|
||||||
The following features are **in development** and coming soon:
|
The following features are **in development** and coming soon:
|
||||||
|
|||||||
@@ -203,15 +203,21 @@ class ActuatorTest(parameterized.TestCase):
|
|||||||
mx = mjx.put_model(m)
|
mx = mjx.put_model(m)
|
||||||
dx = mjx.put_data(m, d)
|
dx = mjx.put_data(m, d)
|
||||||
|
|
||||||
dx = dx.replace(ctrl=jp.array([1.0, 1.0, 1.0, -1.0, 1.0, -20.0, 5.0, -5.0]))
|
dx = dx.replace(ctrl=jp.array([1.0, 1.0, 1.0, -4.0, 1.0, -20.0, 5.0, -5.0]))
|
||||||
dx = mjx.forward(mx, dx)
|
dx = mjx.forward(mx, dx)
|
||||||
|
|
||||||
_assert_eq(
|
_assert_eq(
|
||||||
dx.actuator_force,
|
dx.actuator_force,
|
||||||
jp.array([1.0, 1.0, 1.0, -1.0, 1.0, -10.0, 5.0, -5.0]),
|
jp.array([1.0, 1.0, 1.0, -4.0 / 3.0, 1.0 / 3.0, -10.0, 5.0, -5.0]),
|
||||||
'actuator_force',
|
'actuator_force',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
_assert_eq(
|
||||||
|
dx.sensordata,
|
||||||
|
jp.array([3.0, -1.0, -10.0, 0.0]),
|
||||||
|
'sensordata',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
absltest.main()
|
absltest.main()
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ from mujoco.mjx._src.types import DisableBit
|
|||||||
from mujoco.mjx._src.types import Model
|
from mujoco.mjx._src.types import Model
|
||||||
from mujoco.mjx._src.types import ObjType
|
from mujoco.mjx._src.types import ObjType
|
||||||
from mujoco.mjx._src.types import SensorType
|
from mujoco.mjx._src.types import SensorType
|
||||||
|
from mujoco.mjx._src.types import TrnType
|
||||||
# pylint: enable=g-importing-member
|
# pylint: enable=g-importing-member
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
@@ -552,6 +553,15 @@ def sensor_acc(m: Model, d: Data) -> Data:
|
|||||||
sensor = d.actuator_force[objid]
|
sensor = d.actuator_force[objid]
|
||||||
elif sensor_type == SensorType.JOINTACTFRC:
|
elif sensor_type == SensorType.JOINTACTFRC:
|
||||||
sensor = d.qfrc_actuator[m.jnt_dofadr[objid]]
|
sensor = d.qfrc_actuator[m.jnt_dofadr[objid]]
|
||||||
|
elif sensor_type == SensorType.TENDONACTFRC:
|
||||||
|
force_mask = [
|
||||||
|
(m.actuator_trntype == TrnType.TENDON)
|
||||||
|
& (m.actuator_trnid[:, 0] == tendon_id)
|
||||||
|
for tendon_id in objid
|
||||||
|
]
|
||||||
|
force_ids = np.concatenate([np.nonzero(mask)[0] for mask in force_mask])
|
||||||
|
force_mat = np.array(force_mask)[:, force_ids]
|
||||||
|
sensor = force_mat @ d.actuator_force[force_ids]
|
||||||
elif sensor_type in (SensorType.FRAMELINACC, SensorType.FRAMEANGACC):
|
elif sensor_type in (SensorType.FRAMELINACC, SensorType.FRAMEANGACC):
|
||||||
objtype = m.sensor_objtype[idx]
|
objtype = m.sensor_objtype[idx]
|
||||||
|
|
||||||
|
|||||||
@@ -370,6 +370,7 @@ class SensorType(enum.IntEnum):
|
|||||||
TORQUE: torque
|
TORQUE: torque
|
||||||
ACTUATORFRC: scalar actuator force
|
ACTUATORFRC: scalar actuator force
|
||||||
JOINTACTFRC: scalar actuator force, measured at the joint
|
JOINTACTFRC: scalar actuator force, measured at the joint
|
||||||
|
TENDONACTFRC: scalar actuator force, measured at the tendon
|
||||||
FRAMELINACC: 3D linear acceleration
|
FRAMELINACC: 3D linear acceleration
|
||||||
FRAMEANGACC: 3D angular acceleration
|
FRAMEANGACC: 3D angular acceleration
|
||||||
"""
|
"""
|
||||||
@@ -404,6 +405,7 @@ class SensorType(enum.IntEnum):
|
|||||||
TORQUE = mujoco.mjtSensor.mjSENS_TORQUE
|
TORQUE = mujoco.mjtSensor.mjSENS_TORQUE
|
||||||
ACTUATORFRC = mujoco.mjtSensor.mjSENS_ACTUATORFRC
|
ACTUATORFRC = mujoco.mjtSensor.mjSENS_ACTUATORFRC
|
||||||
JOINTACTFRC = mujoco.mjtSensor.mjSENS_JOINTACTFRC
|
JOINTACTFRC = mujoco.mjtSensor.mjSENS_JOINTACTFRC
|
||||||
|
TENDONACTFRC = mujoco.mjtSensor.mjSENS_TENDONACTFRC
|
||||||
FRAMELINACC = mujoco.mjtSensor.mjSENS_FRAMELINACC
|
FRAMELINACC = mujoco.mjtSensor.mjSENS_FRAMELINACC
|
||||||
FRAMEANGACC = mujoco.mjtSensor.mjSENS_FRAMEANGACC
|
FRAMEANGACC = mujoco.mjtSensor.mjSENS_FRAMEANGACC
|
||||||
|
|
||||||
|
|||||||
@@ -46,4 +46,10 @@
|
|||||||
<motor tendon="fixed1"/>
|
<motor tendon="fixed1"/>
|
||||||
<motor tendon="fixed1"/>
|
<motor tendon="fixed1"/>
|
||||||
</actuator>
|
</actuator>
|
||||||
|
<sensor>
|
||||||
|
<tendonactuatorfrc tendon="spatial0"/>
|
||||||
|
<tendonactuatorfrc tendon="spatial1"/>
|
||||||
|
<tendonactuatorfrc tendon="fixed0"/>
|
||||||
|
<tendonactuatorfrc tendon="fixed1"/>
|
||||||
|
</sensor>
|
||||||
</mujoco>
|
</mujoco>
|
||||||
|
|||||||
Reference in New Issue
Block a user