diff --git a/include/mujoco/mjvisualize.h b/include/mujoco/mjvisualize.h index b11abb7e..ec8870ed 100644 --- a/include/mujoco/mjvisualize.h +++ b/include/mujoco/mjvisualize.h @@ -99,8 +99,9 @@ typedef enum mjtVisFlag_ { // flags enabling model element visualization mjVIS_CONVEXHULL = 0, // mesh convex hull mjVIS_TEXTURE, // textures mjVIS_JOINT, // joints - mjVIS_ACTUATOR, // actuators mjVIS_CAMERA, // cameras + mjVIS_ACTUATOR, // actuators + mjVIS_ACTIVATION, // activations mjVIS_LIGHT, // lights mjVIS_TENDON, // tendons mjVIS_RANGEFINDER, // rangefinder sensors diff --git a/introspect/enums.py b/introspect/enums.py index d57bff1a..8f641df9 100755 --- a/introspect/enums.py +++ b/introspect/enums.py @@ -584,26 +584,27 @@ ENUMS: Mapping[str, EnumDecl] = dict([ ('mjVIS_CONVEXHULL', 0), ('mjVIS_TEXTURE', 1), ('mjVIS_JOINT', 2), - ('mjVIS_ACTUATOR', 3), - ('mjVIS_CAMERA', 4), - ('mjVIS_LIGHT', 5), - ('mjVIS_TENDON', 6), - ('mjVIS_RANGEFINDER', 7), - ('mjVIS_CONSTRAINT', 8), - ('mjVIS_INERTIA', 9), - ('mjVIS_SCLINERTIA', 10), - ('mjVIS_PERTFORCE', 11), - ('mjVIS_PERTOBJ', 12), - ('mjVIS_CONTACTPOINT', 13), - ('mjVIS_CONTACTFORCE', 14), - ('mjVIS_CONTACTSPLIT', 15), - ('mjVIS_TRANSPARENT', 16), - ('mjVIS_AUTOCONNECT', 17), - ('mjVIS_COM', 18), - ('mjVIS_SELECT', 19), - ('mjVIS_STATIC', 20), - ('mjVIS_SKIN', 21), - ('mjNVISFLAG', 22), + ('mjVIS_CAMERA', 3), + ('mjVIS_ACTUATOR', 4), + ('mjVIS_ACTIVATION', 5), + ('mjVIS_LIGHT', 6), + ('mjVIS_TENDON', 7), + ('mjVIS_RANGEFINDER', 8), + ('mjVIS_CONSTRAINT', 9), + ('mjVIS_INERTIA', 10), + ('mjVIS_SCLINERTIA', 11), + ('mjVIS_PERTFORCE', 12), + ('mjVIS_PERTOBJ', 13), + ('mjVIS_CONTACTPOINT', 14), + ('mjVIS_CONTACTFORCE', 15), + ('mjVIS_CONTACTSPLIT', 16), + ('mjVIS_TRANSPARENT', 17), + ('mjVIS_AUTOCONNECT', 18), + ('mjVIS_COM', 19), + ('mjVIS_SELECT', 20), + ('mjVIS_STATIC', 21), + ('mjVIS_SKIN', 22), + ('mjNVISFLAG', 23), ]), )), ('mjtRndFlag', diff --git a/src/engine/engine_vis_init.c b/src/engine/engine_vis_init.c index 46e0c52a..dae95f25 100644 --- a/src/engine/engine_vis_init.c +++ b/src/engine/engine_vis_init.c @@ -68,8 +68,9 @@ const char* mjVISSTRING[mjNVISFLAG][3] = { {"Convex &Hull", "0", "H"}, {"Te&xture", "1", "X"}, {"&Joint", "0", "J"}, - {"Act&uator", "0", "U"}, {"Camera", "0", "Q"}, + {"Act&uator", "0", "U"}, + {"Act&ivation", "0", ","}, {"Light", "0", "Z"}, {"Tendon", "1", "V"}, {"Range Finder", "1", "Y"}, diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index 977f5998..961310c9 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -774,23 +774,26 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, if (vopt->actuatorgroup[mjMAX(0, mjMIN(mjNGROUP-1, m->actuator_group[i]))]) { // determine extended range mjtNum rng[3] = {-1, 0, +1}; + mjtNum rmin = -1, rmax = 1, act; if (m->actuator_ctrllimited[i]) { - mjtNum rmin = m->actuator_ctrlrange[2*i]; - mjtNum rmax = m->actuator_ctrlrange[2*i+1]; - - if (rmin>=0) { - rng[0] = -1; - rng[1] = rmin; - rng[2] = rmax; - } else if (rmax<=0) { - rng[0] = rmin; - rng[1] = rmax; - rng[2] = +1; - } else { - rng[0] = rmin; - rng[1] = 0; - rng[2] = rmax; - } + rmin = m->actuator_ctrlrange[2*i]; + rmax = m->actuator_ctrlrange[2*i+1]; + } else if (vopt->flags[mjVIS_ACTIVATION] && m->actuator_actlimited[i]) { + rmin = m->actuator_actrange[2*i]; + rmax = m->actuator_actrange[2*i+1]; + } + if (rmin>=0) { + rng[0] = -1; + rng[1] = rmin; + rng[2] = rmax; + } else if (rmax<=0) { + rng[0] = rmin; + rng[1] = rmax; + rng[2] = +1; + } else { + rng[0] = rmin; + rng[1] = 0; + rng[2] = rmax; } // adjust small ranges @@ -801,8 +804,12 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, rng[2] = rng[1] + mjMINVAL; } - // clamp ctrl to extended range - mjtNum act = mjMIN(rng[2], mjMAX(rng[0], d->ctrl[i])); + // clamp act to extended range + if (vopt->flags[mjVIS_ACTIVATION] && m->actuator_dyntype[i]) { + act = mjMIN(rng[2], mjMAX(rng[0], d->act[i-(m->nu-m->na)])); + } else { + act = mjMIN(rng[2], mjMAX(rng[0], d->ctrl[i])); + } // compute interpolants float amin, amean, amax; diff --git a/test/engine/testdata/activation.xml b/test/engine/testdata/activation.xml new file mode 100644 index 00000000..d6c670d8 --- /dev/null +++ b/test/engine/testdata/activation.xml @@ -0,0 +1,46 @@ + +