diff --git a/doc/changelog.rst b/doc/changelog.rst index b8e17c08..a1c02d8d 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -24,7 +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. +- Added ``TENDONPOS`` and ``TENDONVEL`` sensors. - Fixed a bug with the computation of tangential contact forces in ``_decode_pyramid``. Bug fixes diff --git a/doc/mjx.rst b/doc/mjx.rst index ae4313b2..7bbf1066 100644 --- a/doc/mjx.rst +++ b/doc/mjx.rst @@ -219,9 +219,9 @@ The following features are **fully supported** in MJX: * - :ref:`Sensors ` - ``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``. + ``VELOCIMETER``, ``GYRO``, ``JOINTVEL``, ``TENDONVEL``, ``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 48781180..02545cc4 100644 --- a/mjx/mujoco/mjx/_src/sensor.py +++ b/mjx/mujoco/mjx/_src/sensor.py @@ -330,6 +330,8 @@ def sensor_vel(m: Model, d: Data) -> Data: adr = (adr[:, None] + np.arange(3)[None]).reshape(-1) elif sensor_type == SensorType.JOINTVEL: sensor = d.qvel[m.jnt_dofadr[objid]] + elif sensor_type == SensorType.TENDONVEL: + sensor = d.ten_velocity[objid] elif sensor_type == SensorType.ACTUATORVEL: sensor = d.actuator_velocity[objid] elif sensor_type == SensorType.BALLANGVEL: diff --git a/mjx/mujoco/mjx/_src/types.py b/mjx/mujoco/mjx/_src/types.py index 9fac721a..f886d3a3 100644 --- a/mjx/mujoco/mjx/_src/types.py +++ b/mjx/mujoco/mjx/_src/types.py @@ -321,6 +321,7 @@ class SensorType(enum.IntEnum): VELOCIMETER: 3D linear velocity, in local frame GYRO: 3D angular velocity, in local frame JOINTVEL: joint velocity + TENDONVEL: scalar tendon velocity ACTUATORVEL: actuator velocity BALLANGVEL: ball joint angular velocity FRAMELINVEL: 3D linear velocity @@ -352,6 +353,7 @@ class SensorType(enum.IntEnum): VELOCIMETER = mujoco.mjtSensor.mjSENS_VELOCIMETER GYRO = mujoco.mjtSensor.mjSENS_GYRO JOINTVEL = mujoco.mjtSensor.mjSENS_JOINTVEL + TENDONVEL = mujoco.mjtSensor.mjSENS_TENDONVEL ACTUATORVEL = mujoco.mjtSensor.mjSENS_ACTUATORVEL BALLANGVEL = mujoco.mjtSensor.mjSENS_BALLANGVEL FRAMELINVEL = mujoco.mjtSensor.mjSENS_FRAMELINVEL diff --git a/mjx/mujoco/mjx/test_data/sensor/sensor.xml b/mjx/mujoco/mjx/test_data/sensor/sensor.xml index ef1da7e7..e9f1341c 100644 --- a/mjx/mujoco/mjx/test_data/sensor/sensor.xml +++ b/mjx/mujoco/mjx/test_data/sensor/sensor.xml @@ -19,6 +19,7 @@ -velocimeter -gyro -jointvel +-tendonvel -actuatorvel -ballangvel -framelinvel @@ -122,6 +123,7 @@ + @@ -131,6 +133,7 @@ +