Automatically infer *limited field from *range field for joints, tendons and actuators.

PiperOrigin-RevId: 467980594
Change-Id: If635c55a90cf949796b99a41395a6c2c4f7ea094
This commit is contained in:
Kevin Zakka
2022-08-16 11:34:41 -07:00
committed by Copybara-Service
parent 29535a8eca
commit 4bfc2c0311
9 changed files with 474 additions and 58 deletions
+31 -6
View File
@@ -797,7 +797,7 @@ mjCJoint::mjCJoint(mjCModel* _model, mjCDef* _def) {
group = 0;
mjuu_setvec(pos, 0, 0, 0);
mjuu_setvec(axis, 0, 0, 1);
limited = false;
limited = 2;
stiffness = 0;
range[0] = 0;
range[1] = 0;
@@ -851,6 +851,15 @@ int mjCJoint::Compile(void) {
}
}
// free joints cannot be limited
if (type==mjJNT_FREE) {
limited = 0;
}
// otherwise if limited is auto, set according to whether range is specified
else if (limited==2) {
limited = (range[0]==0 && range[1]==0) ? 0 : 1;
}
// resolve limits
if (limited) {
// check data
@@ -2975,7 +2984,7 @@ mjCTendon::mjCTendon(mjCModel* _model, mjCDef* _def) {
group = 0;
material.clear();
width = 0.003;
limited = false;
limited = 2;
range[0] = 0;
range[1] = 0;
mj_defaultSolRefImp(solref_limit, solimp_limit);
@@ -3205,6 +3214,11 @@ void mjCTendon::Compile(void) {
}
}
// if limited is auto, set to 1 if range is specified, otherwise unlimited
if (limited==2) {
limited = (range[0]==0 && range[1]==0) ? 0 : 1;
}
// check limits
if (range[0]>=range[1] && limited) {
throw mjCError(this, "invalid limits in tendon '%s (id = %d)'", name.c_str(), id);
@@ -3317,9 +3331,9 @@ void mjCWrap::Compile(void) {
mjCActuator::mjCActuator(mjCModel* _model, mjCDef* _def) {
// actuator defaults
group = 0;
ctrllimited = false;
forcelimited = false;
actlimited = false;
ctrllimited = 2;
forcelimited = 2;
actlimited = 2;
trntype = mjTRN_UNDEFINED;
dyntype = mjDYN_NONE;
gaintype = mjGAIN_FIXED;
@@ -3366,6 +3380,17 @@ void mjCActuator::Compile(void) {
}
userdata.resize(model->nuser_actuator);
// if limited is auto, set to 1 if range is specified, otherwise unlimited
if (forcelimited==2) {
forcelimited = (forcerange[0]==0 && forcerange[1]==0) ? 0 : 1;
}
if (ctrllimited==2) {
ctrllimited = (ctrlrange[0]==0 && ctrlrange[1]==0) ? 0 : 1;
}
if (actlimited==2) {
actlimited = (actrange[0]==0 && actrange[1]==0) ? 0 : 1;
}
// check limits
if (forcerange[0]>=forcerange[1] && forcelimited) {
throw mjCError(this, "invalid force range for actuator '%s' (id = %d)", name.c_str(), id);
@@ -3437,7 +3462,7 @@ void mjCActuator::Compile(void) {
if (pjnt->urdfeffort>0) {
forcerange[0] = -pjnt->urdfeffort;
forcerange[1] = pjnt->urdfeffort;
forcelimited = true;
forcelimited = 1;
}
break;