Add tendon actuator force limits and tendon actuator force sensor.
PiperOrigin-RevId: 745096883 Change-Id: Ib9acb727fbbfc6b0b0323ee6a889053a7a878056
This commit is contained in:
committed by
Copybara-Service
parent
16e49f2761
commit
96dda6ea75
@@ -276,7 +276,7 @@ static void clampVec(mjtNum* vec, const mjtNum* range, const mjtByte* limited, i
|
||||
// (qpos, qvel, ctrl, act) => (qfrc_actuator, actuator_force, act_dot)
|
||||
void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
TM_START;
|
||||
int nv = m->nv, nu = m->nu;
|
||||
int nv = m->nv, nu = m->nu, ntendon = m->ntendon;
|
||||
mjtNum gain, bias, tau;
|
||||
mjtNum *prm, *force = d->actuator_force;
|
||||
|
||||
@@ -289,6 +289,9 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
// any tendon transmission targets with force limits
|
||||
int tendon_frclimited = 0;
|
||||
|
||||
// local, clamped copy of ctrl
|
||||
mj_markStack(d);
|
||||
mjtNum *ctrl = mjSTACKALLOC(d, nu, mjtNum);
|
||||
@@ -384,6 +387,11 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// check for tendon transmission with force limits
|
||||
if (ntendon && !tendon_frclimited && m->actuator_trntype[i] == mjTRN_TENDON) {
|
||||
tendon_frclimited = m->tendon_actfrclimited[m->actuator_trnid[2*i]];
|
||||
}
|
||||
|
||||
// extract gain info
|
||||
prm = m->actuator_gainprm + mjNGAIN*i;
|
||||
|
||||
@@ -479,6 +487,38 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
// clamp tendon total actuator force
|
||||
if (tendon_frclimited) {
|
||||
// compute total force for each tendon
|
||||
mjtNum* tendon_total_force = mjSTACKALLOC(d, ntendon, mjtNum);
|
||||
mju_zero(tendon_total_force, ntendon);
|
||||
for (int i=0; i < nu; i++) {
|
||||
if (m->actuator_trntype[i] == mjTRN_TENDON) {
|
||||
int tendon_id = m->actuator_trnid[2*i];
|
||||
if (m->tendon_actfrclimited[tendon_id]) {
|
||||
tendon_total_force[tendon_id] += force[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// scale tendon actuator forces if limited and outside range
|
||||
for (int i=0; i < nu; i++) {
|
||||
if (m->actuator_trntype[i] != mjTRN_TENDON) {
|
||||
continue;
|
||||
}
|
||||
int tendon_id = m->actuator_trnid[2*i];
|
||||
mjtNum tendon_force = tendon_total_force[tendon_id];
|
||||
if (m->tendon_actfrclimited[tendon_id] && tendon_force) {
|
||||
const mjtNum* range = m->tendon_actfrcrange + 2 * tendon_id;
|
||||
if (tendon_force < range[0]) {
|
||||
force[i] *= range[0] / tendon_force;
|
||||
} else if (tendon_force > range[1]) {
|
||||
force[i] *= range[1] / tendon_force;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clamp actuator_force
|
||||
clampVec(force, m->actuator_forcerange, m->actuator_forcelimited, nu, NULL);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user