Add velocimeter and gyro sensors to MJX.
PiperOrigin-RevId: 669337697 Change-Id: I5e7f245b96eb334ffddd01757a9f631d9ad862cd
This commit is contained in:
committed by
Copybara-Service
parent
a94694f608
commit
cf02171bf8
+2
-9
@@ -16,10 +16,6 @@ General
|
|||||||
the :ref:`mjOption` struct. This is because the new convex collision detection pipeline (see below) does not use
|
the :ref:`mjOption` struct. This is because the new convex collision detection pipeline (see below) does not use
|
||||||
the MPR algorithm. The semantics of these options remain identical.
|
the MPR algorithm. The semantics of these options remain identical.
|
||||||
|
|
||||||
- Added a new way of defining :ref:`connect<equality-connect>` equality constraints, using two sites rather than bodies.
|
|
||||||
The new semantic is useful when the assumption that the constraint is satisfied in the base configuration does not
|
|
||||||
hold. In this case the sites will "snap together" at the beginning of the simulation. Additionally, changing the site
|
|
||||||
positions in ``mjModel.site_pos`` at runtime can be used to modify the constraint.
|
|
||||||
- Added the :ref:`nativeccd<option-flag-nativeccd>` flag. When this flag is enabled, general convex collision
|
- Added the :ref:`nativeccd<option-flag-nativeccd>` flag. When this flag is enabled, general convex collision
|
||||||
detection is handled natively, as opposed to using `libccd <https://github.com/danfis/libccd>`__. This feature is in
|
detection is handled natively, as opposed to using `libccd <https://github.com/danfis/libccd>`__. This feature is in
|
||||||
early stages of testing.
|
early stages of testing.
|
||||||
@@ -28,7 +24,7 @@ General
|
|||||||
- When :ref:`attaching<meAttachment>` sub-models, :ref:`keyframes<keyframe>` will now be correctly merged into the
|
- When :ref:`attaching<meAttachment>` sub-models, :ref:`keyframes<keyframe>` will now be correctly merged into the
|
||||||
parent model, but only on the first attachment.
|
parent model, but only on the first attachment.
|
||||||
- Added the :ref:`mjtSameFrame` enum which contains the possible frame alignments of bodies and their children. These
|
- Added the :ref:`mjtSameFrame` enum which contains the possible frame alignments of bodies and their children. These
|
||||||
alignments are used for computation shortcuts in :ref:`mj_kinematics`.
|
alignments are used as shortcuts in :ref:`mj_kinematics`.
|
||||||
|
|
||||||
MJX
|
MJX
|
||||||
^^^
|
^^^
|
||||||
@@ -36,13 +32,12 @@ MJX
|
|||||||
- Added position-dependent sensors: ``MAGNETOMETER``, ``CAMPROJECTION``, ``RANGEFINDER``, ``JOINTPOS``,
|
- Added position-dependent sensors: ``MAGNETOMETER``, ``CAMPROJECTION``, ``RANGEFINDER``, ``JOINTPOS``,
|
||||||
``ACTUATORPOS``, ``BALLQUAT``, ``FRAMEPOS``, ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``,
|
``ACTUATORPOS``, ``BALLQUAT``, ``FRAMEPOS``, ``FRAMEXAXIS``, ``FRAMEYAXIS``, ``FRAMEZAXIS``, ``FRAMEQUAT``,
|
||||||
``SUBTREECOM``, ``CLOCK``.
|
``SUBTREECOM``, ``CLOCK``.
|
||||||
- Added velocity-dependent sensors: ``JOINTVEL``, ``ACTUATORVEL``, ``BALLANGVEL``.
|
- Added velocity-dependent sensors: ``VELOCIMETER``, ``GYRO``, ``JOINTVEL``, ``ACTUATORVEL``, ``BALLANGVEL``.
|
||||||
- Added acceleration/force-dependent sensors: ``ACTUATORFRC``, ``JOINTACTFRC``.
|
- Added acceleration/force-dependent sensors: ``ACTUATORFRC``, ``JOINTACTFRC``.
|
||||||
- Changed default policy to avoid placing unused (MuJoCo-only) arrays on device.
|
- Changed default policy to avoid placing unused (MuJoCo-only) arrays on device.
|
||||||
- Added ``device`` parameter to ``mjx.make_data`` to bring it to parity with ``mjx.put_model`` and ``mjx.put_data``.
|
- Added ``device`` parameter to ``mjx.make_data`` to bring it to parity with ``mjx.put_model`` and ``mjx.put_data``.
|
||||||
- Added support for :ref:`implicitfast integration<geIntegration>` for all cases except
|
- Added support for :ref:`implicitfast integration<geIntegration>` for all cases except
|
||||||
:doc:`fluid drag <computation/fluid>`.
|
:doc:`fluid drag <computation/fluid>`.
|
||||||
- Fixed a bug where ``qLDiagInv`` had the wrong size for sparse mass matrices.
|
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
@@ -50,8 +45,6 @@ Bug fixes
|
|||||||
contribution by :github:user:`michael-ahn`).
|
contribution by :github:user:`michael-ahn`).
|
||||||
- Fixed a bug wherein, for models that have both muscles and stateless actuators and used one of the implicit
|
- Fixed a bug wherein, for models that have both muscles and stateless actuators and used one of the implicit
|
||||||
integrators, wrong derivatives would be computed.
|
integrators, wrong derivatives would be computed.
|
||||||
- Fixed a bug in tendon wrapping around spheres. Before this fix, tendons that wrapped around spheres with an
|
|
||||||
externally-placed :ref:`sidesite<spatial-geom-sidesite>` could jump inside the sphere instead of wrapping around it.
|
|
||||||
|
|
||||||
Python bindings
|
Python bindings
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
|||||||
@@ -266,7 +266,23 @@ def sensor_vel(m: Model, d: Data) -> Data:
|
|||||||
objid = m.sensor_objid[idx]
|
objid = m.sensor_objid[idx]
|
||||||
adr = m.sensor_adr[idx]
|
adr = m.sensor_adr[idx]
|
||||||
|
|
||||||
if sensor_type == SensorType.JOINTVEL:
|
if sensor_type == SensorType.VELOCIMETER:
|
||||||
|
bodyid = m.site_bodyid[objid]
|
||||||
|
pos = d.site_xpos[objid]
|
||||||
|
rot = d.site_xmat[objid]
|
||||||
|
cvel = d.cvel[bodyid]
|
||||||
|
subtree_com = d.subtree_com[m.body_rootid[bodyid]]
|
||||||
|
sensor = jax.vmap(
|
||||||
|
lambda vec, dif, rot: rot.T @ (vec[3:] - jp.cross(dif, vec[:3]))
|
||||||
|
)(cvel, pos - subtree_com, rot).reshape(-1)
|
||||||
|
adr = (adr[:, None] + np.arange(3)[None]).reshape(-1)
|
||||||
|
elif sensor_type == SensorType.GYRO:
|
||||||
|
bodyid = m.site_bodyid[objid]
|
||||||
|
rot = d.site_xmat[objid]
|
||||||
|
ang = d.cvel[bodyid, :3]
|
||||||
|
sensor = jax.vmap(lambda ang, rot: rot.T @ ang)(ang, rot).reshape(-1)
|
||||||
|
adr = (adr[:, None] + np.arange(3)[None]).reshape(-1)
|
||||||
|
elif sensor_type == SensorType.JOINTVEL:
|
||||||
sensor = d.qvel[m.jnt_dofadr[objid]]
|
sensor = d.qvel[m.jnt_dofadr[objid]]
|
||||||
elif sensor_type == SensorType.ACTUATORVEL:
|
elif sensor_type == SensorType.ACTUATORVEL:
|
||||||
sensor = d.actuator_velocity[objid]
|
sensor = d.actuator_velocity[objid]
|
||||||
|
|||||||
@@ -307,6 +307,8 @@ class SensorType(enum.IntEnum):
|
|||||||
FRAMEQUAT: frame orientation, represented as quaternion
|
FRAMEQUAT: frame orientation, represented as quaternion
|
||||||
SUBTREECOM: subtree centor of mass
|
SUBTREECOM: subtree centor of mass
|
||||||
CLOCK: simulation time
|
CLOCK: simulation time
|
||||||
|
VELOCIMETER: 3D linear velocity, in local frame
|
||||||
|
GYRO: 3D angular velocity, in local frame
|
||||||
JOINTVEL: joint velocity
|
JOINTVEL: joint velocity
|
||||||
ACTUATORVEL: actuator velocity
|
ACTUATORVEL: actuator velocity
|
||||||
BALLANGVEL: ball joint angular velocity
|
BALLANGVEL: ball joint angular velocity
|
||||||
@@ -326,6 +328,8 @@ class SensorType(enum.IntEnum):
|
|||||||
FRAMEQUAT = mujoco.mjtSensor.mjSENS_FRAMEQUAT
|
FRAMEQUAT = mujoco.mjtSensor.mjSENS_FRAMEQUAT
|
||||||
SUBTREECOM = mujoco.mjtSensor.mjSENS_SUBTREECOM
|
SUBTREECOM = mujoco.mjtSensor.mjSENS_SUBTREECOM
|
||||||
CLOCK = mujoco.mjtSensor.mjSENS_CLOCK
|
CLOCK = mujoco.mjtSensor.mjSENS_CLOCK
|
||||||
|
VELOCIMETER = mujoco.mjtSensor.mjSENS_VELOCIMETER
|
||||||
|
GYRO = mujoco.mjtSensor.mjSENS_GYRO
|
||||||
JOINTVEL = mujoco.mjtSensor.mjSENS_JOINTVEL
|
JOINTVEL = mujoco.mjtSensor.mjSENS_JOINTVEL
|
||||||
ACTUATORVEL = mujoco.mjtSensor.mjSENS_ACTUATORVEL
|
ACTUATORVEL = mujoco.mjtSensor.mjSENS_ACTUATORVEL
|
||||||
BALLANGVEL = mujoco.mjtSensor.mjSENS_BALLANGVEL
|
BALLANGVEL = mujoco.mjtSensor.mjSENS_BALLANGVEL
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
-subtreecom
|
-subtreecom
|
||||||
-clock
|
-clock
|
||||||
* velocity-dependent sensors:
|
* velocity-dependent sensors:
|
||||||
|
-velocimeter
|
||||||
|
-gyro
|
||||||
-jointvel
|
-jointvel
|
||||||
-actuatorvel
|
-actuatorvel
|
||||||
-ballangvel
|
-ballangvel
|
||||||
@@ -82,6 +84,8 @@
|
|||||||
|
|
||||||
<sensor>
|
<sensor>
|
||||||
<magnetometer name="magnetometer0" site="site0"/>
|
<magnetometer name="magnetometer0" site="site0"/>
|
||||||
|
<velocimeter name="velocimeter0" site="site0"/>
|
||||||
|
<gyro name="gyro0" site="site0"/>
|
||||||
<rangefinder name="rangefinder0" site="site_rangefinder0"/>
|
<rangefinder name="rangefinder0" site="site_rangefinder0"/>
|
||||||
<jointpos name="jointpos0" joint="hinge0"/>
|
<jointpos name="jointpos0" joint="hinge0"/>
|
||||||
<jointvel name="jointvel0" joint="hinge0"/>
|
<jointvel name="jointvel0" joint="hinge0"/>
|
||||||
@@ -96,6 +100,8 @@
|
|||||||
<framequat name="framequat3" objtype="site" objname="site3"/>
|
<framequat name="framequat3" objtype="site" objname="site3"/>
|
||||||
<frameyaxis name="frameyaxis0" objtype="site" objname="site0"/>
|
<frameyaxis name="frameyaxis0" objtype="site" objname="site0"/>
|
||||||
<framepos name="framepos0" objtype="site" objname="site0"/>
|
<framepos name="framepos0" objtype="site" objname="site0"/>
|
||||||
|
<velocimeter name="velocimeter1" site="site1"/>
|
||||||
|
<gyro name="gyro1" site="site1"/>
|
||||||
<actuatorfrc name="actuatorfrc1" actuator="motor1"/>
|
<actuatorfrc name="actuatorfrc1" actuator="motor1"/>
|
||||||
<subtreecom name="subtreecom0" body="body0"/>
|
<subtreecom name="subtreecom0" body="body0"/>
|
||||||
<camprojection site="frontorigin" camera="fixedcamera"/>
|
<camprojection site="frontorigin" camera="fixedcamera"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user