Restore acceleration after mj_inverse with invdiscrete flag.
PiperOrigin-RevId: 560647025 Change-Id: If51f721426be7ecf2b7aa53048ad8c897b51e76e
This commit is contained in:
committed by
Copybara-Service
parent
819b5cb982
commit
f44c657544
@@ -29,6 +29,7 @@
|
|||||||
#include "engine/engine_sensor.h"
|
#include "engine/engine_sensor.h"
|
||||||
#include "engine/engine_support.h"
|
#include "engine/engine_support.h"
|
||||||
#include "engine/engine_util_blas.h"
|
#include "engine/engine_util_blas.h"
|
||||||
|
#include "engine/engine_util_errmem.h"
|
||||||
#include "engine/engine_util_sparse.h"
|
#include "engine/engine_util_sparse.h"
|
||||||
|
|
||||||
// position-dependent computations
|
// position-dependent computations
|
||||||
@@ -101,6 +102,7 @@ static void mj_discreteAcc(const mjModel* m, mjData* d) {
|
|||||||
switch ((mjtIntegrator) m->opt.integrator) {
|
switch ((mjtIntegrator) m->opt.integrator) {
|
||||||
case mjINT_RK4:
|
case mjINT_RK4:
|
||||||
// not supported by RK4
|
// not supported by RK4
|
||||||
|
mjERROR("discrete inverse dynamics is not supported by RK4 integrator");
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case mjINT_EULER:
|
case mjINT_EULER:
|
||||||
@@ -203,6 +205,8 @@ void mj_invConstraint(const mjModel* m, mjData* d) {
|
|||||||
void mj_inverseSkip(const mjModel* m, mjData* d,
|
void mj_inverseSkip(const mjModel* m, mjData* d,
|
||||||
int skipstage, int skipsensor) {
|
int skipstage, int skipsensor) {
|
||||||
TM_START;
|
TM_START;
|
||||||
|
mjMARKSTACK;
|
||||||
|
mjtNum* qacc;
|
||||||
int nv = m->nv;
|
int nv = m->nv;
|
||||||
|
|
||||||
// position-dependent
|
// position-dependent
|
||||||
@@ -228,6 +232,11 @@ void mj_inverseSkip(const mjModel* m, mjData* d,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mjENABLED(mjENBL_INVDISCRETE)) {
|
if (mjENABLED(mjENBL_INVDISCRETE)) {
|
||||||
|
// save current qacc
|
||||||
|
qacc = mj_stackAlloc(d, nv);
|
||||||
|
mju_copy(qacc, d->qacc, nv);
|
||||||
|
|
||||||
|
// modify qacc in-place
|
||||||
mj_discreteAcc(m, d);
|
mj_discreteAcc(m, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,6 +253,12 @@ void mj_inverseSkip(const mjModel* m, mjData* d,
|
|||||||
- d->qfrc_passive[i] - d->qfrc_constraint[i];
|
- d->qfrc_passive[i] - d->qfrc_constraint[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mjENABLED(mjENBL_INVDISCRETE)) {
|
||||||
|
// restore qacc
|
||||||
|
mju_copy(d->qacc, qacc, nv);
|
||||||
|
}
|
||||||
|
|
||||||
|
mjFREESTACK;
|
||||||
TM_END(mjTIMER_INVERSE);
|
TM_END(mjTIMER_INVERSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user