Fix step timing diagnostics and make compiler errors transient in simulate.
PiperOrigin-RevId: 935675994 Change-Id: I7bc26291fb061e712187e0a6205723fda65b5f46
This commit is contained in:
committed by
Copybara-Service
parent
3b08f39747
commit
916695e794
@@ -290,6 +290,8 @@ void PhysicsLoop(mj::Simulate& sim) {
|
|||||||
std::chrono::time_point<mj::Simulate::Clock> syncCPU;
|
std::chrono::time_point<mj::Simulate::Clock> syncCPU;
|
||||||
mjtNum syncSim = 0;
|
mjtNum syncSim = 0;
|
||||||
|
|
||||||
|
int last_run = -1;
|
||||||
|
|
||||||
// run until asked to exit
|
// run until asked to exit
|
||||||
while (!sim.exitrequest.load()) {
|
while (!sim.exitrequest.load()) {
|
||||||
if (sim.droploadrequest.load()) {
|
if (sim.droploadrequest.load()) {
|
||||||
@@ -355,6 +357,15 @@ void PhysicsLoop(mj::Simulate& sim) {
|
|||||||
|
|
||||||
// run only if model is present
|
// run only if model is present
|
||||||
if (m) {
|
if (m) {
|
||||||
|
// reset timers on transition between running and paused
|
||||||
|
if (sim.run != last_run) {
|
||||||
|
if (last_run != -1) {
|
||||||
|
std::memset(d->timer, 0, sizeof(d->timer));
|
||||||
|
std::memset(sim.timer_prev_, 0, sizeof(sim.timer_prev_));
|
||||||
|
}
|
||||||
|
last_run = sim.run;
|
||||||
|
}
|
||||||
|
|
||||||
// running
|
// running
|
||||||
if (sim.run) {
|
if (sim.run) {
|
||||||
bool stepped = false;
|
bool stepped = false;
|
||||||
|
|||||||
+27
-8
@@ -405,9 +405,6 @@ void UpdateProfiler(mj::Simulate* sim, const mjModel* m, const mjData* d) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < mjNTIMER; i++) {
|
|
||||||
sim->timer_prev_[i] = d->timer[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// get total number of iterations and nonzeros
|
// get total number of iterations and nonzeros
|
||||||
mjtNum sqrt_nnz = 0;
|
mjtNum sqrt_nnz = 0;
|
||||||
@@ -734,6 +731,15 @@ void UpdateInfoText(mj::Simulate* sim, const mjModel* m, const mjData* d,
|
|||||||
solver_niter += d->solver_niter[i];
|
solver_niter += d->solver_niter[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mjtNum step_duration =
|
||||||
|
d->timer[mjTIMER_STEP].duration - sim->timer_prev_[mjTIMER_STEP].duration;
|
||||||
|
int step_number =
|
||||||
|
d->timer[mjTIMER_STEP].number - sim->timer_prev_[mjTIMER_STEP].number;
|
||||||
|
mjtNum forward_duration =
|
||||||
|
d->timer[mjTIMER_FORWARD].duration - sim->timer_prev_[mjTIMER_FORWARD].duration;
|
||||||
|
int forward_number =
|
||||||
|
d->timer[mjTIMER_FORWARD].number - sim->timer_prev_[mjTIMER_FORWARD].number;
|
||||||
|
|
||||||
// prepare info text
|
// prepare info text
|
||||||
mju::strcpy_arr(title, "Time\nSize\nCPU\nSolver \nFPS\nMemory");
|
mju::strcpy_arr(title, "Time\nSize\nCPU\nSolver \nFPS\nMemory");
|
||||||
mju::sprintf_arr(content,
|
mju::sprintf_arr(content,
|
||||||
@@ -741,8 +747,8 @@ void UpdateInfoText(mj::Simulate* sim, const mjModel* m, const mjData* d,
|
|||||||
d->time,
|
d->time,
|
||||||
d->nefc, d->ncon,
|
d->nefc, d->ncon,
|
||||||
sim->run ?
|
sim->run ?
|
||||||
d->timer[mjTIMER_STEP].duration / mjMAX(1, d->timer[mjTIMER_STEP].number) :
|
step_duration / mjMAX(1, step_number) :
|
||||||
d->timer[mjTIMER_FORWARD].duration / mjMAX(1, d->timer[mjTIMER_FORWARD].number),
|
forward_duration / mjMAX(1, forward_number),
|
||||||
solerr, solver_niter,
|
solerr, solver_niter,
|
||||||
fps,
|
fps,
|
||||||
100*d->maxuse_arena/(double)(d->narena),
|
100*d->maxuse_arena/(double)(d->narena),
|
||||||
@@ -1674,6 +1680,10 @@ void UiEvent(mjuiState* state) {
|
|||||||
|
|
||||||
// option section
|
// option section
|
||||||
else if (it && it->sectionid==SECT_OPTION) {
|
else if (it && it->sectionid==SECT_OPTION) {
|
||||||
|
if (it->pdata == &sim->info) {
|
||||||
|
// clear load error/warning when toggling info panel
|
||||||
|
sim->load_error[0] = '\0';
|
||||||
|
}
|
||||||
if (it->pdata == &sim->spacing) {
|
if (it->pdata == &sim->spacing) {
|
||||||
sim->ui0.spacing = mjui_themeSpacing(sim->spacing);
|
sim->ui0.spacing = mjui_themeSpacing(sim->spacing);
|
||||||
sim->ui1.spacing = mjui_themeSpacing(sim->spacing);
|
sim->ui1.spacing = mjui_themeSpacing(sim->spacing);
|
||||||
@@ -1695,6 +1705,10 @@ void UiEvent(mjuiState* state) {
|
|||||||
|
|
||||||
// simulation section
|
// simulation section
|
||||||
else if (it && it->sectionid==SECT_SIMULATION) {
|
else if (it && it->sectionid==SECT_SIMULATION) {
|
||||||
|
if (it->itemid == 0) {
|
||||||
|
// clear load error/warning when toggling play/pause
|
||||||
|
sim->load_error[0] = '\0';
|
||||||
|
}
|
||||||
switch (it->itemid) {
|
switch (it->itemid) {
|
||||||
case 1: // Threadpool
|
case 1: // Threadpool
|
||||||
sim->pending_.update_threadpool = true;
|
sim->pending_.update_threadpool = true;
|
||||||
@@ -1873,6 +1887,7 @@ void UiEvent(mjuiState* state) {
|
|||||||
if (!sim->is_passive_ && sim->m_) {
|
if (!sim->is_passive_ && sim->m_) {
|
||||||
sim->run = 1 - sim->run;
|
sim->run = 1 - sim->run;
|
||||||
sim->pert.active = 0;
|
sim->pert.active = 0;
|
||||||
|
sim->load_error[0] = '\0';
|
||||||
|
|
||||||
if (sim->run) sim->scrub_index = 0; // reset scrubber
|
if (sim->run) sim->scrub_index = 0; // reset scrubber
|
||||||
|
|
||||||
@@ -2124,6 +2139,7 @@ void Simulate::Sync(bool state_only) {
|
|||||||
if (!m_) {
|
if (!m_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->exitrequest.load()) {
|
if (this->exitrequest.load()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2208,8 +2224,6 @@ void Simulate::Sync(bool state_only) {
|
|||||||
pending_.ui_update_visualization = true;
|
pending_.ui_update_visualization = true;
|
||||||
m_->stat = m_passive_->stat;
|
m_->stat = m_passive_->stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pending_.save_xml) {
|
if (pending_.save_xml) {
|
||||||
@@ -2403,7 +2417,6 @@ void Simulate::Sync(bool state_only) {
|
|||||||
mjopt_prev_ = m_passive_->opt;
|
mjopt_prev_ = m_passive_->opt;
|
||||||
mjvis_prev_ = m_passive_->vis;
|
mjvis_prev_ = m_passive_->vis;
|
||||||
mjstat_prev_ = m_passive_->stat;
|
mjstat_prev_ = m_passive_->stat;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update settings
|
// update settings
|
||||||
@@ -2439,6 +2452,10 @@ void Simulate::Sync(bool state_only) {
|
|||||||
} else {
|
} else {
|
||||||
mjv_applyPerturbPose(m_, d_, &this->pert, 1); // mocap and dynamic bodies
|
mjv_applyPerturbPose(m_, d_, &this->pert, 1); // mocap and dynamic bodies
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < mjNTIMER; i++) {
|
||||||
|
timer_prev_[i] = d_->timer[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------- Tell the render thread to load a file and wait -------------------------
|
//------------------------- Tell the render thread to load a file and wait -------------------------
|
||||||
@@ -2602,6 +2619,8 @@ void Simulate::LoadOnRenderThread() {
|
|||||||
this->pert.flexselect = -1;
|
this->pert.flexselect = -1;
|
||||||
this->pert.skinselect = -1;
|
this->pert.skinselect = -1;
|
||||||
|
|
||||||
|
memset(timer_prev_, 0, sizeof(timer_prev_));
|
||||||
|
|
||||||
// align and scale view unless reloading the same file
|
// align and scale view unless reloading the same file
|
||||||
if (this->filename[0] &&
|
if (this->filename[0] &&
|
||||||
mju::strcmp_arr(this->filename, this->previous_filename)) {
|
mju::strcmp_arr(this->filename, this->previous_filename)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user