Preparation for MIMO actuators: split actuator counts: nu (inputs), nactuator (objects), nout (outputs).
An actuator now owns a block of consecutive controls (actuator_ctrladr/ctrlnum, width defined by the actuator type) and a block of consecutive force outputs (actuator_outadr/outnum, width defined by the transmission type). Force outputs are the scalars of actuation space: one force, length, velocity and moment row each. nout = dim(actuator_force) is derived from transmission types; all current types have width 1, so all three counts coincide for every existing model and behavior is bit-exact. Array re-keying: ctrlrange/ctrllimited by nu; forcerange/forcelimited/gear/ acc0/length0/lengthrange and the moment row structure by nout; everything else per actuator. The mjModel actuator block is re-sorted by size key. Layout-breaking, not behavior-breaking: saved .mjb files are invalidated (size list changed) and recompilation is required. PiperOrigin-RevId: 948351772 Change-Id: Icbc196ffa083cb1eaa6f1a3710869c89d8f62540
This commit is contained in:
committed by
Copybara-Service
parent
06f12a9372
commit
d507e92198
@@ -650,7 +650,7 @@ static void mj_computeSensorPos(const mjModel* m, mjData* d, int i, mjtNum* sens
|
||||
break;
|
||||
|
||||
case mjSENS_ACTUATORPOS: // actuator position
|
||||
sensordata[0] = d->actuator_length[objid];
|
||||
sensordata[0] = d->actuator_length[m->actuator_outadr[objid]];
|
||||
break;
|
||||
|
||||
case mjSENS_BALLQUAT: // ball joint quaternion
|
||||
@@ -879,7 +879,7 @@ static void mj_computeSensorVel(const mjModel* m, mjData* d, int i, mjtNum* sens
|
||||
break;
|
||||
|
||||
case mjSENS_ACTUATORVEL: // actuator velocity
|
||||
sensordata[0] = d->actuator_velocity[objid];
|
||||
sensordata[0] = d->actuator_velocity[m->actuator_outadr[objid]];
|
||||
break;
|
||||
|
||||
case mjSENS_BALLANGVEL: // ball joint angular velocity
|
||||
@@ -956,7 +956,7 @@ static void mj_computeSensorVel(const mjModel* m, mjData* d, int i, mjtNum* sens
|
||||
|
||||
// compute acceleration-stage sensor value, write to data buffer
|
||||
static void mj_computeSensorAcc(const mjModel* m, mjData* d, int i, mjtNum* sensordata) {
|
||||
int ne = d->ne, nf = d->nf, nefc = d->nefc, nu = m->nu;
|
||||
int ne = d->ne, nf = d->nf, nefc = d->nefc, nactuator = m->nactuator;
|
||||
mjtSensor type = (mjtSensor)m->sensor_type[i];
|
||||
int objtype = m->sensor_objtype[i];
|
||||
int objid = m->sensor_objid[i];
|
||||
@@ -1303,7 +1303,7 @@ static void mj_computeSensorAcc(const mjModel* m, mjData* d, int i, mjtNum* sens
|
||||
break;
|
||||
|
||||
case mjSENS_ACTUATORFRC: // actuator force
|
||||
sensordata[0] = d->actuator_force[objid];
|
||||
sensordata[0] = d->actuator_force[m->actuator_outadr[objid]];
|
||||
break;
|
||||
|
||||
case mjSENS_JOINTACTFRC: // actuator force at joint
|
||||
@@ -1312,9 +1312,9 @@ static void mj_computeSensorAcc(const mjModel* m, mjData* d, int i, mjtNum* sens
|
||||
|
||||
case mjSENS_TENDONACTFRC: // actuator force at tendon
|
||||
frc = 0.0;
|
||||
for (int j=0; j < nu; j++) {
|
||||
for (int j=0; j < nactuator; j++) {
|
||||
if (m->actuator_trntype[j] == mjTRN_TENDON && m->actuator_trnid[2*j] == objid) {
|
||||
frc += d->actuator_force[j];
|
||||
frc += d->actuator_force[m->actuator_outadr[j]];
|
||||
}
|
||||
}
|
||||
sensordata[0] = frc;
|
||||
|
||||
Reference in New Issue
Block a user