Implement sleeping in engine

PiperOrigin-RevId: 829361787
Change-Id: I6f64d8e25c4248cf32c18cd94d37ff5def78946e
This commit is contained in:
Yuval Tassa
2025-11-07 03:32:03 -08:00
committed by Copybara-Service
parent 1e0226d360
commit 769f37b653
55 changed files with 3602 additions and 677 deletions
+26 -3
View File
@@ -4935,6 +4935,8 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
// create data
int disableflags = m->opt.disableflags;
m->opt.disableflags |= mjDSBL_CONTACT;
int enableflags = m->opt.enableflags;
m->opt.enableflags &= ~mjENBL_SLEEP;
mj_makeRawData(&d, m);
if (!d) {
// m will be deleted by the catch statement in mjCModel::Compile()
@@ -4980,18 +4982,39 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
// delete partial mjData (no plugins), make a complete one
mj_deleteData(d);
d = nullptr;
// if sleep was enabled, check for trees initialized as sleeping
bool asleep_init = false;
if (enableflags & mjENBL_SLEEP) {
for (int i=0; i < m->ntree; i++) {
if (m->tree_sleep_policy[i] == mjSLEEP_INIT) {
asleep_init = true;
break;
}
}
}
// if any trees initialized as sleeping, restore flags before mj_makeData
if (asleep_init) {
m->opt.disableflags = disableflags;
m->opt.enableflags = enableflags;
}
d = mj_makeData(m);
if (!d) {
// m will be deleted by the catch statement in mjCModel::Compile()
throw mjCError(0, "could not create mjData");
}
// test forward simulation
mj_step(m, d);
// test forward simulation unless asleep_init is true (potentially expensive)
if (!asleep_init) {
mj_step(m, d);
}
// delete data
// delete data, restore flags
mj_deleteData(d);
m->opt.disableflags = disableflags;
m->opt.enableflags = enableflags;
d = nullptr;
// pass warning back