@@ -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
15661572dart::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
0 commit comments