diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index d925a3a3..c8f21281 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -2392,6 +2392,7 @@ int mjCJoint::Compile(void) { if (type == mjJNT_FREE) { limited = mjLIMITED_FALSE; } + // otherwise if limited is auto, check consistency wrt auto-limits else if (limited == mjLIMITED_AUTO) { bool hasrange = !(range[0] == 0 && range[1] == 0); @@ -2423,6 +2424,7 @@ int mjCJoint::Compile(void) { if (type == mjJNT_FREE || type == mjJNT_BALL) { actfrclimited = mjLIMITED_FALSE; } + // otherwise if actfrclimited is auto, check consistency wrt auto-limits else if (actfrclimited == mjLIMITED_AUTO) { bool hasrange = !(actfrcrange[0] == 0 && actfrcrange[1] == 0); diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index 6b27bbc3..8b70e9a2 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -395,10 +395,14 @@ void mjXWriter::OneJoint(XMLElement* elem, const mjCJoint* joint, mjCDef* def, WriteAttr(elem, "solimpfriction", mjNIMP, joint->solimp_friction, def->Joint().solimp_friction, true); WriteAttr(elem, "stiffness", 1, &joint->stiffness, &def->Joint().stiffness); - WriteAttrKey(elem, "limited", TFAuto_map, 3, joint->limited, def->Joint().limited); + if (joint->type != mjJNT_FREE) { + WriteAttrKey(elem, "limited", TFAuto_map, 3, joint->limited, def->Joint().limited); + } WriteAttr(elem, "range", 2, joint->range, def->Joint().range); - WriteAttrKey(elem, "actuatorfrclimited", TFAuto_map, 3, joint->actfrclimited, - def->Joint().actfrclimited); + if (joint->type != mjJNT_FREE && joint->type != mjJNT_BALL) { + WriteAttrKey(elem, "actuatorfrclimited", TFAuto_map, 3, joint->actfrclimited, + def->Joint().actfrclimited); + } WriteAttrKey(elem, "actuatorgravcomp", bool_map, 2, joint->actgravcomp, def->Joint().actgravcomp); WriteAttr(elem, "actuatorfrcrange", 2, joint->actfrcrange, def->Joint().actfrcrange); WriteAttr(elem, "margin", 1, &joint->margin, &def->Joint().margin);