Simbody  3.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SimTK::HuntCrossleyContact Class Reference

This is a concrete subsystem that handles simple, frictionless contact situations with a model due to Hunt & Crossley: K. More...

#include <HuntCrossleyContact.h>

+ Inheritance diagram for SimTK::HuntCrossleyContact:

Public Member Functions

 HuntCrossleyContact ()
 
 HuntCrossleyContact (MultibodySystem &)
 
int addSphere (MobilizedBodyIndex body, const Vec3 &center, const Real &radius, const Real &stiffness, const Real &dissipation)
 
int addHalfSpace (MobilizedBodyIndex body, const UnitVec3 &normal, const Real &height, const Real &stiffness, const Real &dissipation)
 
 SimTK_PIMPL_DOWNCAST (HuntCrossleyContact, ForceSubsystem)
 
- Public Member Functions inherited from SimTK::ForceSubsystem
 ForceSubsystem ()
 
 SimTK_PIMPL_DOWNCAST (ForceSubsystem, Subsystem)
 
GutsupdRep ()
 
const GutsgetRep () const
 
- Public Member Functions inherited from SimTK::Subsystem
 Subsystem ()
 
 Subsystem (const Subsystem &)
 
Subsystemoperator= (const Subsystem &)
 
 ~Subsystem ()
 
const StringgetName () const
 
const StringgetVersion () const
 
QIndex allocateQ (State &, const Vector &qInit) const
 
UIndex allocateU (State &, const Vector &uInit) const
 
ZIndex allocateZ (State &, const Vector &zInit) const
 
DiscreteVariableIndex allocateDiscreteVariable (State &, Stage invalidates, AbstractValue *v) const
 
DiscreteVariableIndex allocateAutoUpdateDiscreteVariable (State &, Stage invalidates, AbstractValue *v, Stage updateDependsOn) const
 
CacheEntryIndex allocateCacheEntry (const State &, Stage dependsOn, Stage computedBy, AbstractValue *v) const
 
CacheEntryIndex allocateCacheEntry (const State &state, Stage g, AbstractValue *v) const
 
CacheEntryIndex allocateLazyCacheEntry (const State &state, Stage earliest, AbstractValue *v) const
 
QErrIndex allocateQErr (const State &, int nqerr) const
 
UErrIndex allocateUErr (const State &, int nuerr) const
 
UDotErrIndex allocateUDotErr (const State &, int nudoterr) const
 
EventTriggerByStageIndex allocateEventTriggersByStage (const State &, Stage, int ntriggers) const
 
const VectorgetQ (const State &) const
 
const VectorgetU (const State &) const
 
const VectorgetZ (const State &) const
 
const VectorgetQDot (const State &) const
 
const VectorgetUDot (const State &) const
 
const VectorgetZDot (const State &) const
 
const VectorgetQDotDot (const State &) const
 
const VectorgetQErr (const State &) const
 
const VectorgetUErr (const State &) const
 
const VectorgetUDotErr (const State &) const
 
const VectorgetMultipliers (const State &) const
 
const VectorgetEventTriggersByStage (const State &, Stage) const
 
VectorupdQ (State &) const
 
VectorupdU (State &) const
 
VectorupdZ (State &) const
 
void setQ (State &s, const Vector &q) const
 
void setU (State &s, const Vector &u) const
 
void setZ (State &s, const Vector &z) const
 
VectorupdQDot (const State &) const
 
VectorupdUDot (const State &) const
 
VectorupdZDot (const State &) const
 
VectorupdQDotDot (const State &) const
 
VectorupdQErr (const State &) const
 
VectorupdUErr (const State &) const
 
VectorupdUDotErr (const State &) const
 
VectorupdMultipliers (const State &) const
 
VectorupdEventTriggersByStage (const State &, Stage) const
 
Stage getStage (const State &) const
 
const AbstractValuegetDiscreteVariable (const State &s, DiscreteVariableIndex dx) const
 
Real getDiscreteVarLastUpdateTime (const State &s, DiscreteVariableIndex dx) const
 
CacheEntryIndex getDiscreteVarUpdateIndex (const State &s, DiscreteVariableIndex dx) const
 
const AbstractValuegetDiscreteVarUpdateValue (const State &s, DiscreteVariableIndex dx) const
 
AbstractValueupdDiscreteVarUpdateValue (const State &s, DiscreteVariableIndex dx) const
 
bool isDiscreteVarUpdateValueRealized (const State &s, DiscreteVariableIndex dx) const
 
void markDiscreteVarUpdateValueRealized (const State &s, DiscreteVariableIndex dx) const
 
AbstractValueupdDiscreteVariable (State &, DiscreteVariableIndex) const
 
const AbstractValuegetCacheEntry (const State &, CacheEntryIndex) const
 
AbstractValueupdCacheEntry (const State &, CacheEntryIndex) const
 
bool isCacheValueRealized (const State &, CacheEntryIndex) const
 
void markCacheValueRealized (const State &, CacheEntryIndex) const
 
void markCacheValueNotRealized (const State &, CacheEntryIndex) const
 
SystemQIndex getQStart (const State &) const
 
int getNQ (const State &) const
 
SystemUIndex getUStart (const State &) const
 
int getNU (const State &) const
 
SystemZIndex getZStart (const State &) const
 
int getNZ (const State &) const
 
SystemQErrIndex getQErrStart (const State &) const
 
int getNQErr (const State &) const
 
SystemUErrIndex getUErrStart (const State &) const
 
int getNUErr (const State &) const
 
SystemUDotErrIndex getUDotErrStart (const State &) const
 
int getNUDotErr (const State &) const
 
SystemMultiplierIndex getMultipliersStart (const State &) const
 
int getNMultipliers (const State &) const
 
SystemEventTriggerByStageIndex getEventTriggerStartByStage (const State &, Stage) const
 
int getNEventTriggersByStage (const State &, Stage) const
 
bool isInSystem () const
 
bool isInSameSystem (const Subsystem &otherSubsystem) const
 
const SystemgetSystem () const
 
SystemupdSystem ()
 
SubsystemIndex getMySubsystemIndex () const
 
bool isOwnerHandle () const
 
bool isEmptyHandle () const
 
bool isSameSubsystem (const Subsystem &otherSubsystem) const
 
bool subsystemTopologyHasBeenRealized () const
 
void invalidateSubsystemTopologyCache () const
 
MeasureIndex adoptMeasure (AbstractMeasure &)
 
AbstractMeasure getMeasure (MeasureIndex) const
 
template<class T >
Measure_< T > getMeasure_ (MeasureIndex mx) const
 
const Subsystem::GutsgetSubsystemGuts () const
 
Subsystem::GutsupdSubsystemGuts ()
 
void adoptSubsystemGuts (Subsystem::Guts *g)
 
void setSystem (System &, SubsystemIndex)
 
 Subsystem (Subsystem::Guts *g)
 
bool hasGuts () const
 

Detailed Description

This is a concrete subsystem that handles simple, frictionless contact situations with a model due to Hunt & Crossley: K.

H. Hunt and F. R. E. Crossley, "Coefficient of Restitution Interpreted as Damping in Vibroimpact," ASME Journal of Applied Mechanics, pp. 440-445, June 1975. This is a continuous model based on Hertz elastic contact theory, which correctly reproduces the empirically observed dependence on velocity of coefficient of restitution, where e=(1-cv) for (small) impact velocity v and a material property c with units 1/v. Note that c can be measured right off the coefficient of restitution-vs.-velocity curves: it is the absolute value of the slope at low velocities.

Given a collision between two spheres, or a sphere and a plane, we can generate a contact force from this equation f = kx^n(1 + 3/2 cv) where k is a stiffness constant incorporating material properties and geometry (to be defined below), x is penetration depth and v = dx/dt is penetration rate (positive during penetration and negative during rebound). Exponent n depends on the surface geometry. For Hertz contact where the geometry can be approximated by sphere (or sphere-plane) interactions, which is all we are currently handling here, n=3/2.

Stiffness k is defined in terms of the relative radius of curvature R and effective plane-strain modulus E, each of which is a combination of the description of the two individual contacting elements. TODO: derivation of the following results should be in the SimTK Engr J; you'll have to take my word for it now:

R1*R2 E2^(2/3) R = ——-, E = (s1 * E1^(2/3))^(3/2), s1= ——————- R1 + R2 E1^(2/3) + E2^(2/3)

c = c1*s1 + c2*(1-s1) k = (4/3) sqrt(R) E f = k x^(3/2) (1 + 3/2 c xdot) pe = 2/5 k x^(5/2) Also, we can calculate the contact patch radius a as a = sqrt(R*x)

In the above, E1 and E2 are the *plane strain* moduli. If you have instead Young's modulus Y1 and Poisson's ratio p1, then E1=Y1/(1-p1^2). The interface to this subsystem asks for E1 (pressure/strain) and c1 (1/velocity), and E2,c2 only.

Constructor & Destructor Documentation

SimTK::HuntCrossleyContact::HuntCrossleyContact ( )
SimTK::HuntCrossleyContact::HuntCrossleyContact ( MultibodySystem )
explicit

Member Function Documentation

int SimTK::HuntCrossleyContact::addSphere ( MobilizedBodyIndex  body,
const Vec3 center,
const Real &  radius,
const Real &  stiffness,
const Real &  dissipation 
)
int SimTK::HuntCrossleyContact::addHalfSpace ( MobilizedBodyIndex  body,
const UnitVec3 normal,
const Real &  height,
const Real &  stiffness,
const Real &  dissipation 
)
SimTK::HuntCrossleyContact::SimTK_PIMPL_DOWNCAST ( HuntCrossleyContact  ,
ForceSubsystem   
)

The documentation for this class was generated from the following file: