Rename mjDSBL_AUTORESETNAN to mjDSBL_AUTORESET.
- Expose in MJCF. - Add documentation. - Improve handling in simulate. PiperOrigin-RevId: 657606140 Change-Id: I6a27c2f4842d7d4ae32642f2a6255e5f8f1f605a
This commit is contained in:
committed by
Copybara-Service
parent
123a01bd83
commit
24a555062d
@@ -577,6 +577,11 @@ from its default.
|
|||||||
This flag disables implicit integration with respect to joint damping in the Euler integrator. See the
|
This flag disables implicit integration with respect to joint damping in the Euler integrator. See the
|
||||||
:ref:`Numerical Integration<geIntegration>` section for more details.
|
:ref:`Numerical Integration<geIntegration>` section for more details.
|
||||||
|
|
||||||
|
.. _option-flag-autoreset:
|
||||||
|
|
||||||
|
:at:`autoreset`: :at-val:`[disable, enable], "enable"`
|
||||||
|
This flag disables the automatic reseting of the simulation state when numerical issues are detected.
|
||||||
|
|
||||||
.. _option-flag-override:
|
.. _option-flag-override:
|
||||||
|
|
||||||
:at:`override`: :at-val:`[disable, enable], "disable"`
|
:at:`override`: :at-val:`[disable, enable], "disable"`
|
||||||
|
|||||||
+3
-3
@@ -35,11 +35,11 @@
|
|||||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||||
| | | | :ref:`warmstart<option-flag-warmstart>` | :ref:`filterparent<option-flag-filterparent>` | :ref:`actuation<option-flag-actuation>` | :ref:`refsafe<option-flag-refsafe>` | |
|
| | | | :ref:`warmstart<option-flag-warmstart>` | :ref:`filterparent<option-flag-filterparent>` | :ref:`actuation<option-flag-actuation>` | :ref:`refsafe<option-flag-refsafe>` | |
|
||||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||||
| | | | :ref:`sensor<option-flag-sensor>` | :ref:`midphase<option-flag-midphase>` | :ref:`eulerdamp<option-flag-eulerdamp>` | :ref:`override<option-flag-override>` | |
|
| | | | :ref:`sensor<option-flag-sensor>` | :ref:`midphase<option-flag-midphase>` | :ref:`eulerdamp<option-flag-eulerdamp>` | :ref:`autoreset<option-flag-autoreset>` | |
|
||||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||||
| | | | :ref:`energy<option-flag-energy>` | :ref:`fwdinv<option-flag-fwdinv>` | :ref:`invdiscrete<option-flag-invdiscrete>` | :ref:`multiccd<option-flag-multiccd>` | |
|
| | | | :ref:`override<option-flag-override>` | :ref:`energy<option-flag-energy>` | :ref:`fwdinv<option-flag-fwdinv>` | :ref:`invdiscrete<option-flag-invdiscrete>` | |
|
||||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||||
| | | | :ref:`island<option-flag-island>` | | | | |
|
| | | | :ref:`multiccd<option-flag-multiccd>` | :ref:`island<option-flag-island>` | | | |
|
||||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| mujoco |br| |L| | | .. table:: |
|
| mujoco |br| |L| | | .. table:: |
|
||||||
|
|||||||
+2
-1
@@ -8,7 +8,8 @@ Upcoming version (not yet released)
|
|||||||
General
|
General
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
1. Renamed ``mjModel.tex_rbg`` to ``mjModel.tex_data``.
|
1. Renamed ``mjModel.tex_rbg`` to ``mjModel.tex_data``.
|
||||||
2. Added a new disable flag ``mjDSBL_AUTORESETNAN`` to disable automatic reset when NaNs or infinities are produced.
|
2. Added a new :ref:`autoreset<option-flag-autoreset>` flag to disable automatic reset when NaNs or infinities are
|
||||||
|
detected.
|
||||||
3. Added sub-elements to the MJCF :ref:`material<asset-material>` element, to allow specification of multiple textures
|
3. Added sub-elements to the MJCF :ref:`material<asset-material>` element, to allow specification of multiple textures
|
||||||
for rendering (e.g., :ref:`occlusion-roughness-metallic<material-orm>`). Note that the MuJoCo renderer doesn't
|
for rendering (e.g., :ref:`occlusion-roughness-metallic<material-orm>`). Note that the MuJoCo renderer doesn't
|
||||||
support these new features, and they are made available for use with external renderers.
|
support these new features, and they are made available for use with external renderers.
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ typedef enum mjtDisableBit_ { // disable default feature bitflags
|
|||||||
mjDSBL_SENSOR = 1<<12, // sensors
|
mjDSBL_SENSOR = 1<<12, // sensors
|
||||||
mjDSBL_MIDPHASE = 1<<13, // mid-phase collision filtering
|
mjDSBL_MIDPHASE = 1<<13, // mid-phase collision filtering
|
||||||
mjDSBL_EULERDAMP = 1<<14, // implicit integration of joint damping in Euler integrator
|
mjDSBL_EULERDAMP = 1<<14, // implicit integration of joint damping in Euler integrator
|
||||||
mjDSBL_AUTORESETNAN = 1<<15, // automatic reset when numerical issues are detected
|
mjDSBL_AUTORESET = 1<<15, // automatic reset when numerical issues are detected
|
||||||
|
|
||||||
mjNDISABLE = 16 // number of disable flags
|
mjNDISABLE = 16 // number of disable flags
|
||||||
} mjtDisableBit;
|
} mjtDisableBit;
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ typedef enum mjtDisableBit_ { // disable default feature bitflags
|
|||||||
mjDSBL_SENSOR = 1<<12, // sensors
|
mjDSBL_SENSOR = 1<<12, // sensors
|
||||||
mjDSBL_MIDPHASE = 1<<13, // mid-phase collision filtering
|
mjDSBL_MIDPHASE = 1<<13, // mid-phase collision filtering
|
||||||
mjDSBL_EULERDAMP = 1<<14, // implicit integration of joint damping in Euler integrator
|
mjDSBL_EULERDAMP = 1<<14, // implicit integration of joint damping in Euler integrator
|
||||||
mjDSBL_AUTORESETNAN = 1<<15, // automatic reset when numerical issues are detected
|
mjDSBL_AUTORESET = 1<<15, // automatic reset when numerical issues are detected
|
||||||
|
|
||||||
mjNDISABLE = 16 // number of disable flags
|
mjNDISABLE = 16 // number of disable flags
|
||||||
} mjtDisableBit;
|
} mjtDisableBit;
|
||||||
|
|||||||
+1
-1
@@ -42,7 +42,7 @@ ENUMS: Mapping[str, EnumDecl] = dict([
|
|||||||
('mjDSBL_SENSOR', 4096),
|
('mjDSBL_SENSOR', 4096),
|
||||||
('mjDSBL_MIDPHASE', 8192),
|
('mjDSBL_MIDPHASE', 8192),
|
||||||
('mjDSBL_EULERDAMP', 16384),
|
('mjDSBL_EULERDAMP', 16384),
|
||||||
('mjDSBL_AUTORESETNAN', 32768),
|
('mjDSBL_AUTORESET', 32768),
|
||||||
('mjNDISABLE', 16),
|
('mjNDISABLE', 16),
|
||||||
]),
|
]),
|
||||||
)),
|
)),
|
||||||
|
|||||||
+24
-2
@@ -199,6 +199,16 @@ void scanPluginLibraries() {
|
|||||||
|
|
||||||
//------------------------------------------- simulation -------------------------------------------
|
//------------------------------------------- simulation -------------------------------------------
|
||||||
|
|
||||||
|
const char* Diverged(int disableflags, const mjData* d) {
|
||||||
|
if (disableflags & mjDSBL_AUTORESET) {
|
||||||
|
for (mjtWarning w : {mjWARN_BADQACC, mjWARN_BADQVEL, mjWARN_BADQPOS}) {
|
||||||
|
if (d->warning[w].number > 0) {
|
||||||
|
return mju_warningText(w, d->warning[w].lastinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
mjModel* LoadModel(const char* file, mj::Simulate& sim) {
|
mjModel* LoadModel(const char* file, mj::Simulate& sim) {
|
||||||
// this copy is needed so that the mju::strlen call below compiles
|
// this copy is needed so that the mju::strlen call below compiles
|
||||||
@@ -356,7 +366,13 @@ void PhysicsLoop(mj::Simulate& sim) {
|
|||||||
|
|
||||||
// run single step, let next iteration deal with timing
|
// run single step, let next iteration deal with timing
|
||||||
mj_step(m, d);
|
mj_step(m, d);
|
||||||
stepped = true;
|
const char* message = Diverged(m->opt.disableflags, d);
|
||||||
|
if (message) {
|
||||||
|
sim.run = 0;
|
||||||
|
mju::strcpy_arr(sim.load_error, message);
|
||||||
|
} else {
|
||||||
|
stepped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// in-sync: step until ahead of cpu
|
// in-sync: step until ahead of cpu
|
||||||
@@ -381,7 +397,13 @@ void PhysicsLoop(mj::Simulate& sim) {
|
|||||||
|
|
||||||
// call mj_step
|
// call mj_step
|
||||||
mj_step(m, d);
|
mj_step(m, d);
|
||||||
stepped = true;
|
const char* message = Diverged(m->opt.disableflags, d);
|
||||||
|
if (message) {
|
||||||
|
sim.run = 0;
|
||||||
|
mju::strcpy_arr(sim.load_error, message);
|
||||||
|
} else {
|
||||||
|
stepped = true;
|
||||||
|
}
|
||||||
|
|
||||||
// break if reset
|
// break if reset
|
||||||
if (d->time < prevSim) {
|
if (d->time < prevSim) {
|
||||||
|
|||||||
@@ -739,18 +739,12 @@ void MakePhysicsSection(mj::Simulate* sim) {
|
|||||||
for (int i=0; i<mjNDISABLE; i++) {
|
for (int i=0; i<mjNDISABLE; i++) {
|
||||||
mju::strcpy_arr(defFlag[0].name, mjDISABLESTRING[i]);
|
mju::strcpy_arr(defFlag[0].name, mjDISABLESTRING[i]);
|
||||||
defFlag[0].pdata = sim->disable + i;
|
defFlag[0].pdata = sim->disable + i;
|
||||||
if ((1 << i) == mjDSBL_AUTORESETNAN) {
|
|
||||||
defFlag[0].state = 0;
|
|
||||||
} else {
|
|
||||||
defFlag[0].state = 2;
|
|
||||||
}
|
|
||||||
mjui_add(&sim->ui0, defFlag);
|
mjui_add(&sim->ui0, defFlag);
|
||||||
}
|
}
|
||||||
mjui_add(&sim->ui0, defEnableFlags);
|
mjui_add(&sim->ui0, defEnableFlags);
|
||||||
for (int i=0; i<mjNENABLE; i++) {
|
for (int i=0; i<mjNENABLE; i++) {
|
||||||
mju::strcpy_arr(defFlag[0].name, mjENABLESTRING[i]);
|
mju::strcpy_arr(defFlag[0].name, mjENABLESTRING[i]);
|
||||||
defFlag[0].pdata = sim->enable + i;
|
defFlag[0].pdata = sim->enable + i;
|
||||||
defFlag[0].state = 2;
|
|
||||||
mjui_add(&sim->ui0, defFlag);
|
mjui_add(&sim->ui0, defFlag);
|
||||||
}
|
}
|
||||||
// add contact override
|
// add contact override
|
||||||
@@ -1956,6 +1950,7 @@ void Simulate::Sync() {
|
|||||||
if (pending_.reset) {
|
if (pending_.reset) {
|
||||||
mj_resetData(m_, d_);
|
mj_resetData(m_, d_);
|
||||||
mj_forward(m_, d_);
|
mj_forward(m_, d_);
|
||||||
|
load_error[0] = '\0';
|
||||||
update_profiler = true;
|
update_profiler = true;
|
||||||
update_sensor = true;
|
update_sensor = true;
|
||||||
scrub_index = 0;
|
scrub_index = 0;
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ void mj_checkPos(const mjModel* m, mjData* d) {
|
|||||||
for (int i=0; i < m->nq; i++) {
|
for (int i=0; i < m->nq; i++) {
|
||||||
if (mju_isBad(d->qpos[i])) {
|
if (mju_isBad(d->qpos[i])) {
|
||||||
mj_warning(d, mjWARN_BADQPOS, i);
|
mj_warning(d, mjWARN_BADQPOS, i);
|
||||||
if (!(m->opt.disableflags & mjDSBL_AUTORESETNAN)) {
|
if (!mjDISABLED(mjDSBL_AUTORESET)) {
|
||||||
mj_resetData(m, d);
|
mj_resetData(m, d);
|
||||||
}
|
}
|
||||||
d->warning[mjWARN_BADQPOS].number++;
|
d->warning[mjWARN_BADQPOS].number++;
|
||||||
@@ -69,7 +69,7 @@ void mj_checkVel(const mjModel* m, mjData* d) {
|
|||||||
for (int i=0; i < m->nv; i++) {
|
for (int i=0; i < m->nv; i++) {
|
||||||
if (mju_isBad(d->qvel[i])) {
|
if (mju_isBad(d->qvel[i])) {
|
||||||
mj_warning(d, mjWARN_BADQVEL, i);
|
mj_warning(d, mjWARN_BADQVEL, i);
|
||||||
if (!(m->opt.disableflags & mjDSBL_AUTORESETNAN)) {
|
if (!mjDISABLED(mjDSBL_AUTORESET)) {
|
||||||
mj_resetData(m, d);
|
mj_resetData(m, d);
|
||||||
}
|
}
|
||||||
d->warning[mjWARN_BADQVEL].number++;
|
d->warning[mjWARN_BADQVEL].number++;
|
||||||
@@ -86,12 +86,12 @@ void mj_checkAcc(const mjModel* m, mjData* d) {
|
|||||||
for (int i=0; i < m->nv; i++) {
|
for (int i=0; i < m->nv; i++) {
|
||||||
if (mju_isBad(d->qacc[i])) {
|
if (mju_isBad(d->qacc[i])) {
|
||||||
mj_warning(d, mjWARN_BADQACC, i);
|
mj_warning(d, mjWARN_BADQACC, i);
|
||||||
if (!(m->opt.disableflags & mjDSBL_AUTORESETNAN)) {
|
if (!mjDISABLED(mjDSBL_AUTORESET)) {
|
||||||
mj_resetData(m, d);
|
mj_resetData(m, d);
|
||||||
}
|
}
|
||||||
d->warning[mjWARN_BADQACC].number++;
|
d->warning[mjWARN_BADQACC].number++;
|
||||||
d->warning[mjWARN_BADQACC].lastinfo = i;
|
d->warning[mjWARN_BADQACC].lastinfo = i;
|
||||||
if (!(m->opt.disableflags & mjDSBL_AUTORESETNAN)) {
|
if (!mjDISABLED(mjDSBL_AUTORESET)) {
|
||||||
mj_forward(m, d);
|
mj_forward(m, d);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ const char* mjDISABLESTRING[mjNDISABLE] = {
|
|||||||
"Sensor",
|
"Sensor",
|
||||||
"Midphase",
|
"Midphase",
|
||||||
"Eulerdamp",
|
"Eulerdamp",
|
||||||
"AutoResetNaN"
|
"AutoReset"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -115,9 +115,9 @@ const char* MJCF[nMJCF][mjXATTRNUM] = {
|
|||||||
"solver", "iterations", "ls_iterations", "noslip_iterations", "mpr_iterations",
|
"solver", "iterations", "ls_iterations", "noslip_iterations", "mpr_iterations",
|
||||||
"sdf_iterations", "sdf_initpoints", "actuatorgroupdisable"},
|
"sdf_iterations", "sdf_initpoints", "actuatorgroupdisable"},
|
||||||
{"<"},
|
{"<"},
|
||||||
{"flag", "?", "21", "constraint", "equality", "frictionloss", "limit", "contact",
|
{"flag", "?", "22", "constraint", "equality", "frictionloss", "limit", "contact",
|
||||||
"passive", "gravity", "clampctrl", "warmstart",
|
"passive", "gravity", "clampctrl", "warmstart",
|
||||||
"filterparent", "actuation", "refsafe", "sensor", "midphase", "eulerdamp",
|
"filterparent", "actuation", "refsafe", "sensor", "midphase", "eulerdamp", "autoreset",
|
||||||
"override", "energy", "fwdinv", "invdiscrete", "multiccd", "island"},
|
"override", "energy", "fwdinv", "invdiscrete", "multiccd", "island"},
|
||||||
{">"},
|
{">"},
|
||||||
|
|
||||||
@@ -1122,6 +1122,7 @@ void mjXReader::Option(XMLElement* section, mjOption* opt) {
|
|||||||
READDSBL("sensor", mjDSBL_SENSOR)
|
READDSBL("sensor", mjDSBL_SENSOR)
|
||||||
READDSBL("midphase", mjDSBL_MIDPHASE)
|
READDSBL("midphase", mjDSBL_MIDPHASE)
|
||||||
READDSBL("eulerdamp", mjDSBL_EULERDAMP)
|
READDSBL("eulerdamp", mjDSBL_EULERDAMP)
|
||||||
|
READDSBL("autoreset", mjDSBL_AUTORESET)
|
||||||
#undef READDSBL
|
#undef READDSBL
|
||||||
|
|
||||||
#define READENBL(NAME, MASK) \
|
#define READENBL(NAME, MASK) \
|
||||||
|
|||||||
@@ -1001,6 +1001,7 @@ void mjXWriter::Option(XMLElement* root) {
|
|||||||
WRITEDSBL("sensor", mjDSBL_SENSOR)
|
WRITEDSBL("sensor", mjDSBL_SENSOR)
|
||||||
WRITEDSBL("midphase", mjDSBL_MIDPHASE)
|
WRITEDSBL("midphase", mjDSBL_MIDPHASE)
|
||||||
WRITEDSBL("eulerdamp", mjDSBL_EULERDAMP)
|
WRITEDSBL("eulerdamp", mjDSBL_EULERDAMP)
|
||||||
|
WRITEDSBL("autoreset", mjDSBL_AUTORESET)
|
||||||
#undef WRITEDSBL
|
#undef WRITEDSBL
|
||||||
|
|
||||||
#define WRITEENBL(NAME, MASK) \
|
#define WRITEENBL(NAME, MASK) \
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ public enum mjtDisableBit : int{
|
|||||||
mjDSBL_SENSOR = 4096,
|
mjDSBL_SENSOR = 4096,
|
||||||
mjDSBL_MIDPHASE = 8192,
|
mjDSBL_MIDPHASE = 8192,
|
||||||
mjDSBL_EULERDAMP = 16384,
|
mjDSBL_EULERDAMP = 16384,
|
||||||
mjDSBL_AUTORESETNAN = 32768,
|
mjDSBL_AUTORESET = 32768,
|
||||||
mjNDISABLE = 16,
|
mjNDISABLE = 16,
|
||||||
}
|
}
|
||||||
public enum mjtEnableBit : int{
|
public enum mjtEnableBit : int{
|
||||||
|
|||||||
Reference in New Issue
Block a user