|
Simbody
3.6
|
This is a concrete subsystem that handles simple, frictionless contact situations with a model due to Hunt & Crossley: K. More...
Inheritance diagram for SimTK::HuntCrossleyContact:Public Member Functions | |
| HuntCrossleyContact () | |
| HuntCrossleyContact (MultibodySystem &) | |
| int | addSphere (MobilizedBodyIndex body, const Vec3 ¢er, 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) | |
| Guts & | updRep () |
| const Guts & | getRep () const |
Public Member Functions inherited from SimTK::Subsystem | |
| Subsystem () | |
| Default constructor creates and empty handle with a null Subsystem::Guts pointer. More... | |
| Subsystem (const Subsystem &) | |
| Copy constructor clones the Subsystem::Guts object if there is one and makes this the owner handle of the new clone. More... | |
| Subsystem & | operator= (const Subsystem &) |
| Copy assignment deletes the Subsystem::Guts object if there is one and then behaves like the copy constructor. More... | |
| ~Subsystem () | |
| Destructor deletes the referenced Subsystem::Guts object if this is the owner handle of that object, otherwise does nothing. More... | |
| QIndex | allocateQ (State &s, const Vector &qInit) const |
| UIndex | allocateU (State &s, const Vector &uInit) const |
| ZIndex | allocateZ (State &s, const Vector &zInit) const |
| DiscreteVariableIndex | allocateDiscreteVariable (State &s, Stage g, AbstractValue *v) const |
| DiscreteVariableIndex | allocateAutoUpdateDiscreteVariable (State &s, Stage invalidates, AbstractValue *v, Stage updateDependsOn) const |
| CacheEntryIndex | allocateCacheEntry (const State &s, 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 &s, int nqerr) const |
| UErrIndex | allocateUErr (const State &s, int nuerr) const |
| UDotErrIndex | allocateUDotErr (const State &s, int nudoterr) const |
| EventTriggerByStageIndex | allocateEventTriggersByStage (const State &s, Stage g, int ntriggers) const |
| const Vector & | getQ (const State &s) const |
| const Vector & | getU (const State &s) const |
| const Vector & | getZ (const State &s) const |
| const Vector & | getUWeights (const State &s) const |
| const Vector & | getZWeights (const State &s) const |
| Vector & | updQ (State &s) const |
| Vector & | updU (State &s) const |
| Vector & | updZ (State &s) const |
| const Vector & | getQDot (const State &s) const |
| const Vector & | getUDot (const State &s) const |
| const Vector & | getZDot (const State &s) const |
| const Vector & | getQDotDot (const State &s) const |
| Vector & | updQDot (const State &s) const |
| Vector & | updUDot (const State &s) const |
| Vector & | updZDot (const State &s) const |
| Vector & | updQDotDot (const State &s) const |
| const Vector & | getQErr (const State &s) const |
| const Vector & | getUErr (const State &s) const |
| const Vector & | getQErrWeights (const State &s) const |
| const Vector & | getUErrWeights (const State &s) const |
| const Vector & | getUDotErr (const State &s) const |
| const Vector & | getMultipliers (const State &s) const |
| const Vector & | getEventTriggersByStage (const State &s, Stage g) const |
| Vector & | updQErr (const State &s) const |
| Vector & | updUErr (const State &s) const |
| Vector & | updUDotErr (const State &s) const |
| Vector & | updMultipliers (const State &s) const |
| Vector & | updEventTriggersByStage (const State &s, Stage g) const |
| SystemQIndex | getQStart (const State &s) const |
| int | getNQ (const State &s) const |
| SystemUIndex | getUStart (const State &s) const |
| int | getNU (const State &s) const |
| SystemZIndex | getZStart (const State &s) const |
| int | getNZ (const State &s) const |
| SystemQErrIndex | getQErrStart (const State &s) const |
| int | getNQErr (const State &s) const |
| SystemUErrIndex | getUErrStart (const State &s) const |
| int | getNUErr (const State &s) const |
| SystemUDotErrIndex | getUDotErrStart (const State &s) const |
| int | getNUDotErr (const State &s) const |
| SystemMultiplierIndex | getMultipliersStart (const State &s) const |
| int | getNMultipliers (const State &s) const |
| SystemEventTriggerByStageIndex | getEventTriggerStartByStage (const State &s, Stage g) const |
| int | getNEventTriggersByStage (const State &s, Stage g) 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 |
| Stage | getStage (const State &s) const |
| void | advanceToStage (const State &s, Stage g) const |
| const AbstractValue & | getDiscreteVariable (const State &s, DiscreteVariableIndex index) const |
| AbstractValue & | updDiscreteVariable (State &s, DiscreteVariableIndex index) const |
| const AbstractValue & | getCacheEntry (const State &s, CacheEntryIndex index) const |
| AbstractValue & | updCacheEntry (const State &s, CacheEntryIndex index) const |
| Real | getDiscreteVarLastUpdateTime (const State &s, DiscreteVariableIndex dx) const |
| CacheEntryIndex | getDiscreteVarUpdateIndex (const State &s, DiscreteVariableIndex dx) const |
| const AbstractValue & | getDiscreteVarUpdateValue (const State &s, DiscreteVariableIndex dx) const |
| AbstractValue & | updDiscreteVarUpdateValue (const State &s, DiscreteVariableIndex dx) const |
| bool | isDiscreteVarUpdateValueRealized (const State &s, DiscreteVariableIndex dx) const |
| void | markDiscreteVarUpdateValueRealized (const State &s, DiscreteVariableIndex dx) const |
| bool | isCacheValueRealized (const State &s, CacheEntryIndex cx) const |
| void | markCacheValueRealized (const State &s, CacheEntryIndex cx) const |
| void | markCacheValueNotRealized (const State &s, CacheEntryIndex cx) const |
| const String & | getName () const |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| const String & | getVersion () const |
| Obtain the Subsystem version string if one was given on construction. More... | |
| bool | isInSystem () const |
Return true if this Subsystem is contained in a System. More... | |
| bool | isInSameSystem (const Subsystem &otherSubsystem) const |
Return true if this Subsystem is contained in the same System as contains the given otherSubsystem. More... | |
| const System & | getSystem () const |
| Return a const reference to the System that contains this Subsystem. More... | |
| System & | updSystem () |
| Return a writable reference to the System that contains this Subsystem. More... | |
| void | setSystem (System &system, SubsystemIndex subx) |
| Inform this Subsystem of the System that contains it, as well as the SubsystemIndex which the System has assigned to it. More... | |
| SubsystemIndex | getMySubsystemIndex () const |
| Return the SubsystemIndex within the containing System. More... | |
| bool | isEmptyHandle () const |
| Return true if this handle has a null Subsystem::Guts pointer. More... | |
| bool | isSameSubsystem (const Subsystem &otherSubsystem) const |
Determine if this Subsystem handle refers to the same Subsystem::Guts object as handle otherSubsystem. More... | |
| bool | isOwnerHandle () const |
Is this Subsystem handle the owner of the Subsystem::Guts object it points to? This is true if the handle is empty or if its Guts object points back to this handle. More... | |
| bool | subsystemTopologyHasBeenRealized () const |
Returns true if this Subsystem's realizeTopology() method has been called since the last topological change or call to invalidateSubsystemTopologyCache(). More... | |
| void | invalidateSubsystemTopologyCache () const |
| Always call this method when a topological change is made to this Subsystem to indicate that any Stage::Topology cache values may need recomputation. More... | |
| MeasureIndex | adoptMeasure (AbstractMeasure &) |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| AbstractMeasure | getMeasure (MeasureIndex) const |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| template<class T > | |
| Measure_< T > | getMeasure_ (MeasureIndex mx) const |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| const Subsystem::Guts & | getSubsystemGuts () const |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| Subsystem::Guts & | updSubsystemGuts () |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| void | adoptSubsystemGuts (Subsystem::Guts *g) |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| Subsystem (Subsystem::Guts *g) | |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
| bool | hasGuts () const |
| Obtain the Subsystem name if one was given on construction of the concrete Subsystem. More... | |
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.
| SimTK::HuntCrossleyContact::HuntCrossleyContact | ( | ) |
|
explicit |
| 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 | |||
| ) |