Merge pull request #1508 from Balint-H:fix/limit-auto-parsing

PiperOrigin-RevId: 616680348
Change-Id: I55edeec1d522ab6f04514747b3c4ad5dfb2cd45f
This commit is contained in:
Copybara-Service
2024-03-17 18:39:26 -07:00
3 changed files with 27 additions and 15 deletions
@@ -165,14 +165,7 @@ namespace Mujoco {
ImpFriction.FromMjcf(mjcf, "solimpfriction"); ImpFriction.FromMjcf(mjcf, "solimpfriction");
FrictionLoss = mjcf.GetFloatAttribute("frictionloss", 0.0f); FrictionLoss = mjcf.GetFloatAttribute("frictionloss", 0.0f);
bool defaultLimited = false; Limited = mjcf.GetLimitedAttribute("limited", mjcf.HasAttribute("range"));
if ((mjcf.OwnerDocument.GetElementsByTagName("compiler")[0]?["compiler"])
?.GetBoolAttribute("autolimits", true) ??
true) {
defaultLimited = mjcf.HasAttribute("range");
}
Limited = mjcf.GetBoolAttribute("limited", defaultLimited);
Margin = mjcf.GetFloatAttribute("margin", defaultValue: 0.0f); Margin = mjcf.GetFloatAttribute("margin", defaultValue: 0.0f);
} }
} }
+4 -7
View File
@@ -82,13 +82,10 @@ public class MjActuator : MjComponent {
LengthRange = mjcf.GetVector2Attribute("lengthrange", defaultValue: Vector2.zero); LengthRange = mjcf.GetVector2Attribute("lengthrange", defaultValue: Vector2.zero);
Gear = mjcf.GetFloatArrayAttribute("gear", defaultValue: new float[] { 1.0f }).ToList(); Gear = mjcf.GetFloatArrayAttribute("gear", defaultValue: new float[] { 1.0f }).ToList();
bool autolimits = (mjcf.OwnerDocument.GetElementsByTagName("compiler")[0]?["compiler"]) CtrlLimited = mjcf.GetLimitedAttribute("ctrllimited",
?.GetBoolAttribute("autolimits", true) ?? rangeDefined: mjcf.HasAttribute("ctrlrange"));
false; ForceLimited = mjcf.GetLimitedAttribute("forcelimited",
CtrlLimited = mjcf.GetBoolAttribute("ctrllimited", rangeDefined: mjcf.HasAttribute("forcerange"));
defaultValue: autolimits ? CtrlRange != Vector2.zero : false);
ForceLimited = mjcf.GetBoolAttribute("forcelimited",
defaultValue: autolimits ? ForceRange != Vector2.zero : false);
} }
} }
@@ -37,6 +37,28 @@ public static class XmlElementExtensions {
} }
} }
public static bool GetLimitedAttribute(
this XmlElement element, string name, bool rangeDefined) {
var strValue = element.GetStringAttribute(name, "auto");
if (strValue == "auto" && rangeDefined && element.GetAutolimitsEnabled()) return true;
if (strValue == "auto") return false;
bool parsedValue;
if (bool.TryParse(strValue, out parsedValue)) {
return parsedValue;
} else {
throw new ArgumentException($"'{strValue}' is not a bool.");
}
}
public static bool GetAutolimitsEnabled(
this XmlElement element) {
bool autolimits = (element.OwnerDocument?.GetElementsByTagName("compiler")[0]?["compiler"])
?.GetBoolAttribute("autolimits", true) ??
true;
return autolimits;
}
public static float GetFloatAttribute( public static float GetFloatAttribute(
this XmlElement element, string name, float defaultValue = 0.0f) { this XmlElement element, string name, float defaultValue = 0.0f) {
if (!element.HasAttribute(name)) { if (!element.HasAttribute(name)) {