separate spinning friction (torsional friction around contact normal) from
rolling friction (orthogonal to contact normal)
This commit is contained in:
@@ -388,6 +388,7 @@
|
|||||||
<child link="head"/>
|
<child link="head"/>
|
||||||
<axis xyz="0 0 1"/>
|
<axis xyz="0 0 1"/>
|
||||||
<origin xyz="0 0 0.3"/>
|
<origin xyz="0 0 0.3"/>
|
||||||
|
<limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/>
|
||||||
</joint>
|
</joint>
|
||||||
|
|
||||||
<link name="box">
|
<link name="box">
|
||||||
|
|||||||
@@ -410,6 +410,10 @@ void ConvertURDF2BulletInternal(
|
|||||||
{
|
{
|
||||||
col->setRollingFriction(contactInfo.m_rollingFriction);
|
col->setRollingFriction(contactInfo.m_rollingFriction);
|
||||||
}
|
}
|
||||||
|
if ((contactInfo.m_flags & URDF_CONTACT_HAS_SPINNING_FRICTION)!=0)
|
||||||
|
{
|
||||||
|
col->setSpinningFriction(contactInfo.m_spinningFriction);
|
||||||
|
}
|
||||||
if ((contactInfo.m_flags & URDF_CONTACT_HAS_STIFFNESS_DAMPING)!=0)
|
if ((contactInfo.m_flags & URDF_CONTACT_HAS_STIFFNESS_DAMPING)!=0)
|
||||||
{
|
{
|
||||||
col->setContactStiffnessAndDamping(contactInfo.m_contactStiffness,contactInfo.m_contactDamping);
|
col->setContactStiffnessAndDamping(contactInfo.m_contactStiffness,contactInfo.m_contactDamping);
|
||||||
|
|||||||
@@ -16,17 +16,20 @@ enum UrdfJointTypes
|
|||||||
enum URDF_LinkContactFlags
|
enum URDF_LinkContactFlags
|
||||||
{
|
{
|
||||||
URDF_CONTACT_HAS_LATERAL_FRICTION=1,
|
URDF_CONTACT_HAS_LATERAL_FRICTION=1,
|
||||||
URDF_CONTACT_HAS_ROLLING_FRICTION=2,
|
|
||||||
URDF_CONTACT_HAS_INERTIA_SCALING=2,
|
URDF_CONTACT_HAS_INERTIA_SCALING=2,
|
||||||
URDF_CONTACT_HAS_CONTACT_CFM=4,
|
URDF_CONTACT_HAS_CONTACT_CFM=4,
|
||||||
URDF_CONTACT_HAS_CONTACT_ERP=8,
|
URDF_CONTACT_HAS_CONTACT_ERP=8,
|
||||||
URDF_CONTACT_HAS_STIFFNESS_DAMPING=16,
|
URDF_CONTACT_HAS_STIFFNESS_DAMPING=16,
|
||||||
|
URDF_CONTACT_HAS_ROLLING_FRICTION=32,
|
||||||
|
URDF_CONTACT_HAS_SPINNING_FRICTION=64,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct URDFLinkContactInfo
|
struct URDFLinkContactInfo
|
||||||
{
|
{
|
||||||
btScalar m_lateralFriction;
|
btScalar m_lateralFriction;
|
||||||
btScalar m_rollingFriction;
|
btScalar m_rollingFriction;
|
||||||
|
btScalar m_spinningFriction;
|
||||||
btScalar m_inertiaScaling;
|
btScalar m_inertiaScaling;
|
||||||
btScalar m_contactCfm;
|
btScalar m_contactCfm;
|
||||||
btScalar m_contactErp;
|
btScalar m_contactErp;
|
||||||
@@ -38,6 +41,7 @@ struct URDFLinkContactInfo
|
|||||||
URDFLinkContactInfo()
|
URDFLinkContactInfo()
|
||||||
:m_lateralFriction(0.5),
|
:m_lateralFriction(0.5),
|
||||||
m_rollingFriction(0),
|
m_rollingFriction(0),
|
||||||
|
m_spinningFriction(0),
|
||||||
m_inertiaScaling(1),
|
m_inertiaScaling(1),
|
||||||
m_contactCfm(0),
|
m_contactCfm(0),
|
||||||
m_contactErp(0),
|
m_contactErp(0),
|
||||||
|
|||||||
@@ -672,7 +672,28 @@ bool UrdfParser::parseLink(UrdfModel& model, UrdfLink& link, TiXmlElement *confi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
TiXmlElement *spinning_xml = ci->FirstChildElement("spinning_friction");
|
||||||
|
if (spinning_xml)
|
||||||
|
{
|
||||||
|
if (m_parseSDF)
|
||||||
|
{
|
||||||
|
link.m_contactInfo.m_spinningFriction = urdfLexicalCast<double>(spinning_xml->GetText());
|
||||||
|
link.m_contactInfo.m_flags |= URDF_CONTACT_HAS_SPINNING_FRICTION;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
if (!spinning_xml->Attribute("value"))
|
||||||
|
{
|
||||||
|
logger->reportError("Link/contact: spinning friction element must have value attribute");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
link.m_contactInfo.m_spinningFriction = urdfLexicalCast<double>(spinning_xml->Attribute("value"));
|
||||||
|
link.m_contactInfo.m_flags |= URDF_CONTACT_HAS_SPINNING_FRICTION;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
|
|
||||||
TiXmlElement *stiffness_xml = ci->FirstChildElement("stiffness");
|
TiXmlElement *stiffness_xml = ci->FirstChildElement("stiffness");
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ btCollisionObject::btCollisionObject()
|
|||||||
m_friction(btScalar(0.5)),
|
m_friction(btScalar(0.5)),
|
||||||
m_restitution(btScalar(0.)),
|
m_restitution(btScalar(0.)),
|
||||||
m_rollingFriction(0.0f),
|
m_rollingFriction(0.0f),
|
||||||
|
m_spinningFriction(0.f),
|
||||||
m_contactDamping(.1),
|
m_contactDamping(.1),
|
||||||
m_contactStiffness(1e4),
|
m_contactStiffness(1e4),
|
||||||
m_internalType(CO_COLLISION_OBJECT),
|
m_internalType(CO_COLLISION_OBJECT),
|
||||||
|
|||||||
@@ -85,7 +85,8 @@ protected:
|
|||||||
|
|
||||||
btScalar m_friction;
|
btScalar m_friction;
|
||||||
btScalar m_restitution;
|
btScalar m_restitution;
|
||||||
btScalar m_rollingFriction;
|
btScalar m_rollingFriction;//torsional friction orthogonal to contact normal (useful to stop spheres rolling forever)
|
||||||
|
btScalar m_spinningFriction; // torsional friction around the contact normal (useful for grasping)
|
||||||
btScalar m_contactDamping;
|
btScalar m_contactDamping;
|
||||||
btScalar m_contactStiffness;
|
btScalar m_contactStiffness;
|
||||||
|
|
||||||
@@ -323,7 +324,15 @@ public:
|
|||||||
{
|
{
|
||||||
return m_rollingFriction;
|
return m_rollingFriction;
|
||||||
}
|
}
|
||||||
|
void setSpinningFriction(btScalar frict)
|
||||||
|
{
|
||||||
|
m_updateRevision++;
|
||||||
|
m_spinningFriction = frict;
|
||||||
|
}
|
||||||
|
btScalar getSpinningFriction() const
|
||||||
|
{
|
||||||
|
return m_spinningFriction;
|
||||||
|
}
|
||||||
void setContactStiffnessAndDamping(btScalar stiffness, btScalar damping)
|
void setContactStiffnessAndDamping(btScalar stiffness, btScalar damping)
|
||||||
{
|
{
|
||||||
m_updateRevision++;
|
m_updateRevision++;
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ ContactAddedCallback gContactAddedCallback=0;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
|
|
||||||
btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
||||||
{
|
{
|
||||||
btScalar friction = body0->getRollingFriction() * body1->getFriction() + body1->getRollingFriction() * body0->getFriction();
|
btScalar friction = body0->getRollingFriction() * body1->getFriction() + body1->getRollingFriction() * body0->getFriction();
|
||||||
@@ -38,6 +37,17 @@ btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObj
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btScalar btManifoldResult::calculateCombinedSpinningFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
||||||
|
{
|
||||||
|
btScalar friction = body0->getSpinningFriction() * body1->getFriction() + body1->getSpinningFriction() * body0->getFriction();
|
||||||
|
|
||||||
|
const btScalar MAX_FRICTION = btScalar(10.);
|
||||||
|
if (friction < -MAX_FRICTION)
|
||||||
|
friction = -MAX_FRICTION;
|
||||||
|
if (friction > MAX_FRICTION)
|
||||||
|
friction = MAX_FRICTION;
|
||||||
|
return friction;
|
||||||
|
}
|
||||||
|
|
||||||
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
|
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
|
||||||
btScalar btManifoldResult::calculateCombinedFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
btScalar btManifoldResult::calculateCombinedFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ public:
|
|||||||
static btScalar calculateCombinedRestitution(const btCollisionObject* body0,const btCollisionObject* body1);
|
static btScalar calculateCombinedRestitution(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
static btScalar calculateCombinedFriction(const btCollisionObject* body0,const btCollisionObject* body1);
|
static btScalar calculateCombinedFriction(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
static btScalar calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1);
|
static btScalar calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
static btScalar calculateCombinedContactDamping(const btCollisionObject* body0,const btCollisionObject* body1);
|
static btScalar calculateCombinedSpinningFriction(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
|
static btScalar calculateCombinedContactDamping(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
static btScalar calculateCombinedContactStiffness(const btCollisionObject* body0,const btCollisionObject* body1);
|
static btScalar calculateCombinedContactStiffness(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,8 @@ class btManifoldPoint
|
|||||||
m_distance1( distance ),
|
m_distance1( distance ),
|
||||||
m_combinedFriction(btScalar(0.)),
|
m_combinedFriction(btScalar(0.)),
|
||||||
m_combinedRollingFriction(btScalar(0.)),
|
m_combinedRollingFriction(btScalar(0.)),
|
||||||
m_combinedRestitution(btScalar(0.)),
|
m_combinedSpinningFriction(btScalar(0.)),
|
||||||
|
m_combinedRestitution(btScalar(0.)),
|
||||||
m_userPersistentData(0),
|
m_userPersistentData(0),
|
||||||
m_contactPointFlags(0),
|
m_contactPointFlags(0),
|
||||||
m_appliedImpulse(0.f),
|
m_appliedImpulse(0.f),
|
||||||
@@ -99,8 +100,9 @@ class btManifoldPoint
|
|||||||
|
|
||||||
btScalar m_distance1;
|
btScalar m_distance1;
|
||||||
btScalar m_combinedFriction;
|
btScalar m_combinedFriction;
|
||||||
btScalar m_combinedRollingFriction;
|
btScalar m_combinedRollingFriction;//torsional friction orthogonal to contact normal, useful to make spheres stop rolling forever
|
||||||
btScalar m_combinedRestitution;
|
btScalar m_combinedSpinningFriction;//torsional friction around contact normal, useful for grasping objects
|
||||||
|
btScalar m_combinedRestitution;
|
||||||
|
|
||||||
//BP mod, store contact triangles.
|
//BP mod, store contact triangles.
|
||||||
int m_partId0;
|
int m_partId0;
|
||||||
|
|||||||
@@ -79,6 +79,8 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo&
|
|||||||
//moved to btCollisionObject
|
//moved to btCollisionObject
|
||||||
m_friction = constructionInfo.m_friction;
|
m_friction = constructionInfo.m_friction;
|
||||||
m_rollingFriction = constructionInfo.m_rollingFriction;
|
m_rollingFriction = constructionInfo.m_rollingFriction;
|
||||||
|
m_spinningFriction = constructionInfo.m_spinningFriction;
|
||||||
|
|
||||||
m_restitution = constructionInfo.m_restitution;
|
m_restitution = constructionInfo.m_restitution;
|
||||||
|
|
||||||
setCollisionShape( constructionInfo.m_collisionShape );
|
setCollisionShape( constructionInfo.m_collisionShape );
|
||||||
|
|||||||
@@ -135,6 +135,8 @@ public:
|
|||||||
///the m_rollingFriction prevents rounded shapes, such as spheres, cylinders and capsules from rolling forever.
|
///the m_rollingFriction prevents rounded shapes, such as spheres, cylinders and capsules from rolling forever.
|
||||||
///See Bullet/Demos/RollingFrictionDemo for usage
|
///See Bullet/Demos/RollingFrictionDemo for usage
|
||||||
btScalar m_rollingFriction;
|
btScalar m_rollingFriction;
|
||||||
|
btScalar m_spinningFriction;//torsional friction around contact normal
|
||||||
|
|
||||||
///best simulation results using zero restitution.
|
///best simulation results using zero restitution.
|
||||||
btScalar m_restitution;
|
btScalar m_restitution;
|
||||||
|
|
||||||
@@ -158,6 +160,7 @@ public:
|
|||||||
m_angularDamping(btScalar(0.)),
|
m_angularDamping(btScalar(0.)),
|
||||||
m_friction(btScalar(0.5)),
|
m_friction(btScalar(0.5)),
|
||||||
m_rollingFriction(btScalar(0)),
|
m_rollingFriction(btScalar(0)),
|
||||||
|
m_spinningFriction(btScalar(0)),
|
||||||
m_restitution(btScalar(0.)),
|
m_restitution(btScalar(0.)),
|
||||||
m_linearSleepingThreshold(btScalar(0.8)),
|
m_linearSleepingThreshold(btScalar(0.8)),
|
||||||
m_angularSleepingThreshold(btScalar(1.f)),
|
m_angularSleepingThreshold(btScalar(1.f)),
|
||||||
|
|||||||
Reference in New Issue
Block a user