Drake

This ForceElement models a springdamper attached between two points on two different bodies.
Given a point P on a body A and a point Q on a body B with positions p_AP and p_BQ, respectively, this springdamper applies equal and opposite forces on bodies A and B according to:
f_AP = (k⋅(ℓ  ℓ₀) + c⋅dℓ/dt)⋅r̂ f_BQ = f_AP
where ℓ = ‖p_WQ  p_WP‖
is the current length of the spring, dℓ/dt its rate of change, r̂ = (p_WQ  p_WP) / ℓ
is the normalized vector from P to Q, ℓ₀ is the free length of the spring and k and c are the stiffness and damping of the springdamper, respectively. This ForceElement is meant to model finite free length springs attached between two points. In this typical arrangement springs are usually preloaded, meaning they apply a nonzero spring force in the static configuration of the system. Thus, neither the free length ℓ₀ nor the current length ℓ of the spring can ever be zero. The length of the spring approaching zero would incur in a nonphysical configuration and therefore this element throws a std::runtime_error exception in that case. Note that:
T  The scalar type. Must be a valid Eigen scalar. 
Instantiated templates for the following kinds of T's are provided:
They are already available to link against in the containing library. No other values for T are currently supported.
#include <drake/multibody/tree/linear_spring_damper.h>
Public Member Functions  
LinearSpringDamper (const Body< T > &bodyA, const Vector3< double > &p_AP, const Body< T > &bodyB, const Vector3< double > &p_BQ, double free_length, double stiffness, double damping)  
Constructor for a springdamper between a point P on bodyA and a point Q on bodyB . More...  
const Body< T > &  bodyA () const 
const Body< T > &  bodyB () const 
const Vector3< double >  p_AP () const 
The position p_AP of point P on body A as measured and expressed in body frame A. More...  
const Vector3< double >  p_BQ () const 
The position p_BQ of point Q on body B as measured and expressed in body frame B. More...  
double  free_length () const 
double  stiffness () const 
double  damping () const 
T  CalcPotentialEnergy (const systems::Context< T > &context, const internal::PositionKinematicsCache< T > &pc) const override 
(Advanced) Calculates the potential energy currently stored given the configuration provided in context . More...  
T  CalcConservativePower (const systems::Context< T > &context, const internal::PositionKinematicsCache< T > &pc, const internal::VelocityKinematicsCache< T > &vc) const override 
(Advanced) Calculates and returns the power generated by conservative force elements or zero if this force element is nonconservative. More...  
T  CalcNonConservativePower (const systems::Context< T > &context, const internal::PositionKinematicsCache< T > &pc, const internal::VelocityKinematicsCache< T > &vc) const override 
(Advanced) Calculates the rate at which mechanical energy is being generated (positive) or dissipated (negative) other than by conversion between potential and kinetic energy. More...  
Does not allow copy, move, or assignment  
LinearSpringDamper (const LinearSpringDamper &)=delete  
LinearSpringDamper &  operator= (const LinearSpringDamper &)=delete 
LinearSpringDamper (LinearSpringDamper &&)=delete  
LinearSpringDamper &  operator= (LinearSpringDamper &&)=delete 
Public Member Functions inherited from ForceElement< T >  
ForceElement (ModelInstanceIndex model_instance)  
Default constructor for a generic force element. More...  
void  CalcAndAddForceContribution (const systems::Context< T > &context, const internal::PositionKinematicsCache< T > &pc, const internal::VelocityKinematicsCache< T > &vc, MultibodyForces< T > *forces) const 
(Advanced) Computes the force contribution for this force element and adds it to the output arrays of forces. More...  
ForceElement (const ForceElement &)=delete  
ForceElement &  operator= (const ForceElement &)=delete 
ForceElement (ForceElement &&)=delete  
ForceElement &  operator= (ForceElement &&)=delete 
Protected Member Functions  
void  DoCalcAndAddForceContribution (const systems::Context< T > &context, const internal::PositionKinematicsCache< T > &pc, const internal::VelocityKinematicsCache< T > &vc, MultibodyForces< T > *forces) const override 
This method is called only from the public nonvirtual CalcAndAddForceContributions() which will already have errorchecked the parameters so you don't have to. More...  
std::unique_ptr< ForceElement< double > >  DoCloneToScalar (const internal::MultibodyTree< double > &tree_clone) const override 
Clones this ForceElement (templated on T) to a mobilizer templated on double . More...  
std::unique_ptr< ForceElement< AutoDiffXd > >  DoCloneToScalar (const internal::MultibodyTree< AutoDiffXd > &tree_clone) const override 
Clones this ForceElement (templated on T) to a mobilizer templated on AutoDiffXd. More...  
std::unique_ptr< ForceElement< symbolic::Expression > >  DoCloneToScalar (const internal::MultibodyTree< symbolic::Expression > &) const override 
Methods to make a clone templated on different scalar types.  
Specific force element subclasses must implement these to support scalar conversion to other types. These methods are only called from MultibodyTree::CloneToScalar(); users must not call these explicitly since there is no external mechanism to ensure the argument template <typename T> class SpringElement { public: // Class's constructor. SpringElement( const Body<T>& body1, const Body<T>& body2, double stiffness); // Get the first body to which this spring is connected. const Body<T>& get_body1() const; // Get the second body to which this spring is connected. const Body<T>& get_body2() const; // Get the spring stiffness constant. double get_stiffness() const; protected: // Implementation of the scalar conversion from T to double. std::unique_ptr<ForceElement<double>> DoCloneToScalar( const MultibodyTree<double>& tree_clone) const) { const Body<ToScalar>& body1_clone = tree_clone.get_variant(get_body1()); const Body<ToScalar>& body2_clone = tree_clone.get_variant(get_body2()); return std::make_unique<SpringElement<double>>( body1_clone, body2_clone, get_stiffness()); } MultibodyTree::get_variant() methods are available to retrieve cloned variants from For examples on how a MultibodyTree model can be converted to other scalar types, please refer to the documentation for MultibodyTree::CloneToScalar(). 

delete 

delete 
LinearSpringDamper  (  const Body< T > &  bodyA, 
const Vector3< double > &  p_AP,  
const Body< T > &  bodyB,  
const Vector3< double > &  p_BQ,  
double  free_length,  
double  stiffness,  
double  damping  
) 
Constructor for a springdamper between a point P on bodyA
and a point Q on bodyB
.
Point P is defined by its position p_AP
as measured and expressed in the body frame A and similarly, point Q is defined by its position p_BQ as measured and expressed in body frame B. The remaining parameters define:
[in]  free_length  The free length of the spring ℓ₀, in meters, at which the spring applies no forces. Since this force element is meant to model finite length springs, ℓ₀ must be strictly positive. 
[in]  stiffness  The stiffness k of the spring in N/m. It must be nonnegative. 
[in]  damping  The damping c of the damper in N⋅s/m. It must be nonnegative. Refer to this class's documentation for further details. 
std::exception  if free_length is negative or zero. 
std::exception  if stiffness is negative. 
std::exception  if damping is negative. 
const Body<T>& bodyA  (  )  const 
const Body<T>& bodyB  (  )  const 

overridevirtual 
(Advanced) Calculates and returns the power generated by conservative force elements or zero if this
force element is nonconservative.
This quantity is defined to be positive when the potential energy is decreasing. In other words, if PE
is the potential energy as defined by CalcPotentialEnergy(), then the conservative power, Pc
, is Pc = d(PE)/dt
.
Implements ForceElement< T >.

overridevirtual 
(Advanced) Calculates the rate at which mechanical energy is being generated (positive) or dissipated (negative) other than by conversion between potential and kinetic energy.
Integrating this quantity yields work W, and the total energy E = PE + KE  W
should be conserved by any physicallycorrect model, to within integration accuracy of W.
Implements ForceElement< T >.

overridevirtual 
(Advanced) Calculates the potential energy currently stored given the configuration provided in context
.
Nonconservative force elements will return zero.
[in]  context  The context containing the state of the MultibodyTree model. 
[in]  pc  A position kinematics cache object already updated to be in sync with context . 
pc
must have been previously updated with a call to CalcPositionKinematicsCache().this
force element. For nonconservative force models, zero.Implements ForceElement< T >.
double damping  (  )  const 

overrideprotectedvirtual 
This method is called only from the public nonvirtual CalcAndAddForceContributions() which will already have errorchecked the parameters so you don't have to.
Refer to the documentation for CalcAndAddForceContribution() for details describing the purpose and parameters of this method. It assumes forces
to be a valid pointer to a MultibodyForces object compatible with the MultibodyTree model owning this
force element.
pc
must have been previously updated with a call to CalcPositionKinematicsCache(). vc
must have been previously updated with a call to CalcVelocityKinematicsCache(). Implements ForceElement< T >.

overrideprotectedvirtual 
Clones this ForceElement (templated on T) to a mobilizer templated on double
.
Implements ForceElement< T >.

overrideprotectedvirtual 
Clones this ForceElement (templated on T) to a mobilizer templated on AutoDiffXd.
Implements ForceElement< T >.

overrideprotectedvirtual 
Implements ForceElement< T >.
double free_length  (  )  const 

delete 

delete 
The position p_AP of point P on body A as measured and expressed in body frame A.
The position p_BQ of point Q on body B as measured and expressed in body frame B.
double stiffness  (  )  const 