diff --git a/doc/changelog.rst b/doc/changelog.rst index c58e9928..1957aa07 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -20,6 +20,15 @@ Python bindings sizes that change between time steps depending on the number of active constraints, breaking strict correspondence between joints and `efc_` rows. +.. image:: images/changelog/contactlabel.png + :align: right + :width: 400px + +Simulate +^^^^^^^^ + +- Added optional labels to contact visualization, indicating which two geoms are contacting (names if defined, ids + otherwise). This can be useful in cluttered scenes. Version 2.3.2 (February 7, 2023) -------------------------------- diff --git a/doc/images/changelog/contactlabel.png b/doc/images/changelog/contactlabel.png new file mode 100644 index 00000000..ea2dbc0c Binary files /dev/null and b/doc/images/changelog/contactlabel.png differ diff --git a/doc/includes/references.h b/doc/includes/references.h index 3a68273d..b7d18a62 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -1565,6 +1565,7 @@ typedef enum mjtLabel_ { // object labeling mjLABEL_SKIN, // skin labels mjLABEL_SELECTION, // selected object mjLABEL_SELPNT, // coordinates of selection point + mjLABEL_CONTACTPOINT, // contact information mjLABEL_CONTACTFORCE, // magnitude of contact force mjNLABEL // number of label types diff --git a/include/mujoco/mjvisualize.h b/include/mujoco/mjvisualize.h index d5ab29fe..f3c8633d 100644 --- a/include/mujoco/mjvisualize.h +++ b/include/mujoco/mjvisualize.h @@ -75,6 +75,7 @@ typedef enum mjtLabel_ { // object labeling mjLABEL_SKIN, // skin labels mjLABEL_SELECTION, // selected object mjLABEL_SELPNT, // coordinates of selection point + mjLABEL_CONTACTPOINT, // contact information mjLABEL_CONTACTFORCE, // magnitude of contact force mjNLABEL // number of label types diff --git a/introspect/enums.py b/introspect/enums.py index f8269715..e1752d4e 100755 --- a/introspect/enums.py +++ b/introspect/enums.py @@ -471,8 +471,9 @@ ENUMS: Mapping[str, EnumDecl] = dict([ ('mjLABEL_SKIN', 10), ('mjLABEL_SELECTION', 11), ('mjLABEL_SELPNT', 12), - ('mjLABEL_CONTACTFORCE', 13), - ('mjNLABEL', 14), + ('mjLABEL_CONTACTPOINT', 13), + ('mjLABEL_CONTACTFORCE', 14), + ('mjNLABEL', 15), ]), )), ('mjtFrame', diff --git a/model/humanoid100/humanoid100.xml b/model/humanoid100/humanoid100.xml index 21618bda..feaacee1 100644 --- a/model/humanoid100/humanoid100.xml +++ b/model/humanoid100/humanoid100.xml @@ -74,7 +74,7 @@ - + diff --git a/simulate/simulate.cc b/simulate/simulate.cc index 24b7ffef..ea2bbdbd 100644 --- a/simulate/simulate.cc +++ b/simulate/simulate.cc @@ -634,7 +634,7 @@ void makerendering(mj::Simulate* sim, int oldstate) { 2, &(sim->vopt.label), "None\nBody\nJoint\nGeom\nSite\nCamera\nLight\nTendon\n" - "Actuator\nConstraint\nSkin\nSelection\nSel Pnt\nForce" + "Actuator\nConstraint\nSkin\nSelection\nSel Pnt\nContact\nForce" }, { mjITEM_SELECT, diff --git a/src/engine/engine_vis_init.c b/src/engine/engine_vis_init.c index 24a33fc3..e05cd96e 100644 --- a/src/engine/engine_vis_init.c +++ b/src/engine/engine_vis_init.c @@ -46,6 +46,7 @@ const char* mjLABELSTRING[mjNLABEL] = { "Skin", "Selection", "SelPoint", + "Contact", "ContactForce" }; diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index 1c071ed8..01802d83 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -129,6 +129,17 @@ static void addContactGeom(const mjModel* m, mjData* d, const mjtByte* flags, f2f(thisgeom->rgba, m->vis.rgba.contactgap, 4); } + // label contacting geom names or ids + if (vopt->label==mjLABEL_CONTACTPOINT) { + const char* name1 = mj_id2name(m, mjOBJ_GEOM, con->geom1); + char id1[10]; + mjSNPRINTF(id1, "%d", con->geom1); + const char* name2 = mj_id2name(m, mjOBJ_GEOM, con->geom2); + char id2[10]; + mjSNPRINTF(id2, "%d", con->geom2); + mjSNPRINTF(thisgeom->label, "%s | %s", name1 ? name1 : id1 , name2 ? name2 : id2); + } + FINISH } diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 62663f65..18c6f0c9 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -445,8 +445,9 @@ public enum mjtLabel : int{ mjLABEL_SKIN = 10, mjLABEL_SELECTION = 11, mjLABEL_SELPNT = 12, - mjLABEL_CONTACTFORCE = 13, - mjNLABEL = 14, + mjLABEL_CONTACTPOINT = 13, + mjLABEL_CONTACTFORCE = 14, + mjNLABEL = 15, } public enum mjtFrame : int{ mjFRAME_NONE = 0,