Skip to content

Commit e460dc7

Browse files
authored
Enforce SDF joint limits when finite (#2232)
1 parent 29ecd2f commit e460dc7

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

dart/utils/sdf/SdfParser.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ static void reportMissingElement(
14821482
DART_ASSERT(0);
14831483
}
14841484

1485-
static void readAxisElement(
1485+
static bool readAxisElement(
14861486
const ElementPtr& axisElement,
14871487
const Eigen::Isometry3d& _parentModelFrame,
14881488
Eigen::Vector3d& axis,
@@ -1494,6 +1494,8 @@ static void readAxisElement(
14941494
double& friction,
14951495
double& spring_stiffness)
14961496
{
1497+
bool hasFinitePositionLimit = false;
1498+
14971499
// use_parent_model_frame
14981500
bool useParentModelFrame = false;
14991501
if (hasElement(axisElement, "use_parent_model_frame"))
@@ -1538,11 +1540,13 @@ static void readAxisElement(
15381540
// lower
15391541
if (hasElement(limitElement, "lower")) {
15401542
lower = getValueDouble(limitElement, "lower");
1543+
hasFinitePositionLimit = hasFinitePositionLimit || std::isfinite(lower);
15411544
}
15421545

15431546
// upper
15441547
if (hasElement(limitElement, "upper")) {
15451548
upper = getValueDouble(limitElement, "upper");
1549+
hasFinitePositionLimit = hasFinitePositionLimit || std::isfinite(upper);
15461550
}
15471551
}
15481552

@@ -1561,6 +1565,8 @@ static void readAxisElement(
15611565
// Apply the same logic to the rest position.
15621566
rest = initial;
15631567
}
1568+
1569+
return hasFinitePositionLimit;
15641570
}
15651571

15661572
dart::dynamics::WeldJoint::Properties readWeldJoint(
@@ -1585,7 +1591,7 @@ dynamics::RevoluteJoint::Properties readRevoluteJoint(
15851591
if (hasElement(_revoluteJointElement, "axis")) {
15861592
const ElementPtr& axisElement = getElement(_revoluteJointElement, "axis");
15871593

1588-
readAxisElement(
1594+
const bool hasLimitedAxis = readAxisElement(
15891595
axisElement,
15901596
_parentModelFrame,
15911597
newRevoluteJoint.mAxis,
@@ -1596,6 +1602,7 @@ dynamics::RevoluteJoint::Properties readRevoluteJoint(
15961602
newRevoluteJoint.mDampingCoefficients[0],
15971603
newRevoluteJoint.mFrictions[0],
15981604
newRevoluteJoint.mSpringStiffnesses[0]);
1605+
newRevoluteJoint.mIsPositionLimitEnforced = hasLimitedAxis;
15991606
} else {
16001607
reportMissingElement("readRevoluteJoint", "axis", "joint", _name);
16011608
}
@@ -1617,7 +1624,7 @@ dynamics::PrismaticJoint::Properties readPrismaticJoint(
16171624
if (hasElement(_jointElement, "axis")) {
16181625
const ElementPtr& axisElement = getElement(_jointElement, "axis");
16191626

1620-
readAxisElement(
1627+
const bool hasLimitedAxis = readAxisElement(
16211628
axisElement,
16221629
_parentModelFrame,
16231630
newPrismaticJoint.mAxis,
@@ -1628,6 +1635,7 @@ dynamics::PrismaticJoint::Properties readPrismaticJoint(
16281635
newPrismaticJoint.mDampingCoefficients[0],
16291636
newPrismaticJoint.mFrictions[0],
16301637
newPrismaticJoint.mSpringStiffnesses[0]);
1638+
newPrismaticJoint.mIsPositionLimitEnforced = hasLimitedAxis;
16311639
} else {
16321640
reportMissingElement("readPrismaticJoint", "axis", "joint", _name);
16331641
}
@@ -1649,7 +1657,7 @@ dynamics::ScrewJoint::Properties readScrewJoint(
16491657
if (hasElement(_jointElement, "axis")) {
16501658
const ElementPtr& axisElement = getElement(_jointElement, "axis");
16511659

1652-
readAxisElement(
1660+
const bool hasLimitedAxis = readAxisElement(
16531661
axisElement,
16541662
_parentModelFrame,
16551663
newScrewJoint.mAxis,
@@ -1660,6 +1668,7 @@ dynamics::ScrewJoint::Properties readScrewJoint(
16601668
newScrewJoint.mDampingCoefficients[0],
16611669
newScrewJoint.mFrictions[0],
16621670
newScrewJoint.mSpringStiffnesses[0]);
1671+
newScrewJoint.mIsPositionLimitEnforced = hasLimitedAxis;
16631672
} else {
16641673
reportMissingElement("readScrewJoint", "axis", "joint", _name);
16651674
}
@@ -1681,13 +1690,15 @@ dynamics::UniversalJoint::Properties readUniversalJoint(
16811690
DART_ASSERT(_jointElement != nullptr);
16821691

16831692
dynamics::UniversalJoint::Properties newUniversalJoint;
1693+
bool hasLimitedAxis1 = false;
1694+
bool hasLimitedAxis2 = false;
16841695

16851696
//--------------------------------------------------------------------------
16861697
// axis
16871698
if (hasElement(_jointElement, "axis")) {
16881699
const ElementPtr& axisElement = getElement(_jointElement, "axis");
16891700

1690-
readAxisElement(
1701+
hasLimitedAxis1 = readAxisElement(
16911702
axisElement,
16921703
_parentModelFrame,
16931704
newUniversalJoint.mAxis[0],
@@ -1707,7 +1718,7 @@ dynamics::UniversalJoint::Properties readUniversalJoint(
17071718
if (hasElement(_jointElement, "axis2")) {
17081719
const ElementPtr& axis2Element = getElement(_jointElement, "axis2");
17091720

1710-
readAxisElement(
1721+
hasLimitedAxis2 = readAxisElement(
17111722
axis2Element,
17121723
_parentModelFrame,
17131724
newUniversalJoint.mAxis[1],
@@ -1722,6 +1733,9 @@ dynamics::UniversalJoint::Properties readUniversalJoint(
17221733
reportMissingElement("readUniversalJoint", "axis2", "joint", _name);
17231734
}
17241735

1736+
newUniversalJoint.mIsPositionLimitEnforced
1737+
= hasLimitedAxis1 || hasLimitedAxis2;
1738+
17251739
return newUniversalJoint;
17261740
}
17271741

tests/integration/io/test_SdfParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ TEST(SdfParser, SDFJointProperties)
193193
const double epsilon = 1e-7;
194194

195195
auto testProperties = [epsilon](const Joint* joint, const size_t idx) {
196+
EXPECT_TRUE(joint->areLimitsEnforced()) << joint->getName();
196197
EXPECT_NEAR(joint->getPositionLowerLimit(idx), 0, epsilon);
197198
EXPECT_NEAR(joint->getPositionUpperLimit(idx), 3, epsilon);
198199
EXPECT_NEAR(joint->getDampingCoefficient(idx), 0, epsilon);
@@ -209,6 +210,8 @@ TEST(SdfParser, SDFJointProperties)
209210
} else if (joint->getType() == UniversalJoint::getStaticType()) {
210211
testProperties(joint, 0);
211212
testProperties(joint, 1);
213+
} else if (joint->getType() == FreeJoint::getStaticType()) {
214+
EXPECT_FALSE(joint->areLimitsEnforced());
212215
}
213216
});
214217
}

0 commit comments

Comments
 (0)