diff --git a/doc/changelog.rst b/doc/changelog.rst index 6c575e38..c8fccd65 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -24,6 +24,7 @@ MJX - Added support for :ref:`spatial tendons ` with pulleys and external sphere and cylinder wrapping. - Added sphere-cylinder and sphere-ellipsoid collision functions (:github:issue:`2126`). - Fixed a bug with frictionloss constraints. +- Added ``TENDONPOS`` sensor. Bug fixes ^^^^^^^^^ diff --git a/doc/mjx.rst b/doc/mjx.rst index 270e8ca9..ae4313b2 100644 --- a/doc/mjx.rst +++ b/doc/mjx.rst @@ -217,11 +217,11 @@ The following features are **fully supported** in MJX: * - :ref:`Tendons ` - :ref:`Fixed ` * - :ref:`Sensors ` - - ``MAGNETOMETER``, ``CAMPROJECTION``, ``RANGEFINDER``, ``JOINTPOS``, ``ACTUATORPOS``, ``BALLQUAT``, ``FRAMEPOS``, - ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``, ``SUBTREECOM``, ``CLOCK``, ``VELOCIMETER``, - ``GYRO``, ``JOINTVEL``, ``ACTUATORVEL``, ``BALLANGVEL``, ``FRAMELINVEL``, ``FRAMEANGVEL``, ``SUBTREELINVEL``, - ``SUBTREEANGMOM``, ``ACCELEROMETER``, ``FORCE``, ``TORQUE``, ``ACTUATORFRC``, ``JOINTACTFRC``, ``FRAMELINACC``, - ``FRAMEANGACC``. + - ``MAGNETOMETER``, ``CAMPROJECTION``, ``RANGEFINDER``, ``JOINTPOS``, ``TENDONPOS``, ``ACTUATORPOS``, ``BALLQUAT``, + ``FRAMEPOS``, ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``, ``SUBTREECOM``, ``CLOCK``, + ``VELOCIMETER``, ``GYRO``, ``JOINTVEL``, ``ACTUATORVEL``, ``BALLANGVEL``, ``FRAMELINVEL``, ``FRAMEANGVEL``, + ``SUBTREELINVEL``, ``SUBTREEANGMOM``, ``ACCELEROMETER``, ``FORCE``, ``TORQUE``, ``ACTUATORFRC``, ``JOINTACTFRC``, + ``FRAMELINACC``, ``FRAMEANGACC``. The following features are **in development** and coming soon: diff --git a/mjx/mujoco/mjx/_src/sensor.py b/mjx/mujoco/mjx/_src/sensor.py index 19d7b8ef..48781180 100644 --- a/mjx/mujoco/mjx/_src/sensor.py +++ b/mjx/mujoco/mjx/_src/sensor.py @@ -166,6 +166,8 @@ def sensor_pos(m: Model, d: Data) -> Data: continue # avoid adding to sensors/adrs list a second time elif sensor_type == SensorType.JOINTPOS: sensor = d.qpos[m.jnt_qposadr[objid]] + elif sensor_type == SensorType.TENDONPOS: + sensor = d.ten_length[objid] elif sensor_type == SensorType.ACTUATORPOS: sensor = d.actuator_length[objid] elif sensor_type == SensorType.BALLQUAT: diff --git a/mjx/mujoco/mjx/_src/types.py b/mjx/mujoco/mjx/_src/types.py index 961f32a2..9fac721a 100644 --- a/mjx/mujoco/mjx/_src/types.py +++ b/mjx/mujoco/mjx/_src/types.py @@ -308,6 +308,7 @@ class SensorType(enum.IntEnum): CAMPROJECTION: camera projection RANGEFINDER: rangefinder JOINTPOS: joint position + TENDONPOS: scalar tendon position ACTUATORPOS: actuator position BALLQUAT: ball joint orientation FRAMEPOS: frame position @@ -338,6 +339,7 @@ class SensorType(enum.IntEnum): CAMPROJECTION = mujoco.mjtSensor.mjSENS_CAMPROJECTION RANGEFINDER = mujoco.mjtSensor.mjSENS_RANGEFINDER JOINTPOS = mujoco.mjtSensor.mjSENS_JOINTPOS + TENDONPOS = mujoco.mjtSensor.mjSENS_TENDONPOS ACTUATORPOS = mujoco.mjtSensor.mjSENS_ACTUATORPOS BALLQUAT = mujoco.mjtSensor.mjSENS_BALLQUAT FRAMEPOS = mujoco.mjtSensor.mjSENS_FRAMEPOS diff --git a/mjx/mujoco/mjx/test_data/sensor/sensor.xml b/mjx/mujoco/mjx/test_data/sensor/sensor.xml index 426d5be2..ef1da7e7 100644 --- a/mjx/mujoco/mjx/test_data/sensor/sensor.xml +++ b/mjx/mujoco/mjx/test_data/sensor/sensor.xml @@ -5,6 +5,7 @@ -camprojection -rangefinder -jointpos +-tendonpos -actuatorpos -ballquat -framepos @@ -107,8 +108,20 @@ ctrllimited="true"/> + + + + + + + + + + + + @@ -117,6 +130,7 @@ +