AGX Dynamics 2.41.3.0
Loading...
Searching...
No Matches
agx::ConstraintImplementation Class Reference

#include <ConstraintImplementation.h>

+ Inheritance diagram for agx::ConstraintImplementation:

Classes

class  BodyView
 Interface to the bodies, either user or solver, since these bodies can differ when e.g., a body is merged. More...
 
class  ConstrainedBodiesState
 Object that holds the state seen from the user and from the solver. More...
 
class  SolverBodyView
 

Public Types

enum  Tags { NONE = 0 , MANY_BODY = (1<<0) , DEFAULT_BINARY_TAG = NONE , DEFAULT_MANY_BODY_TAG = MANY_BODY }
 

Public Member Functions

 ConstraintImplementation ()
 Default constructor.
 
virtual ~ConstraintImplementation ()
 Destructor.
 
virtual bool addElementaryConstraint (const agx::String &name, agx::ElementaryConstraint *elementaryConstraint)
 Add elementary constraint (like Spherical, Dot1, Dot2 etc) given name.
 
virtual void addNlCallbacks (agx::SparseRangeReal &sparseRangeReal, const NlmcpCallbackSolverData &solverData) const
 Interface for non-linear callback from solver.
 
virtual void addNotification ()
 Callback when this constraint is added to Simulation.
 
virtual bool addSecondaryConstraint (const agx::String &name, agx::ElementaryConstraint *secondaryConstraint)
 Add secondary constraint (like motor, range and/or lock etc) given name.
 
RealVector calculateCurrentViolation () const
 Calculates the current violation of the ordinary degrees of freedom of this constraint, e.g., three translational and two rotational (total 5 elements) of a hinge, i.e., controllers DOF are not included.
 
agx::UInt calculateNumActiveRows () const
 Calculates the current number of active rows, including both elementary and secondary constraints.
 
agx::Real calculateViolationVectorAverageSize ()
 Gets the average size of the elements in getViolation() by calculating the magnitude and dividing by the number of elements.
 
template<typename T >
T * findSecondaryConstraintGivenType (const agx::UInt count=0) const
 
bool getActive () const
 
virtual agx::Real getAngle (agx::UInt=0) const
 If the constraint supports angle calculations and 'dof' is in range, this method returns the angle of the given degree of freedom.
 
virtual agx::AttachmentPairgetAttachmentPair () const
 
agx::UInt getBlockRowIndex () const
 
const BlockStructuregetBlockStructure () const
 
virtual void getBounds (agx::RangeReal *bounds, agx::Real dt) const
 Calculates and pushes the bounds into a sparse range data structure.
 
virtual int getConstraintVelocity (agx::Real *v, int row)
 Calculates and pushes the constraint velocities into array given current row.
 
virtual agx::Real getCurrentSpeed (agx::UInt=0) const
 If this method is implemented, a call to this method will return the current speed of the angle.
 
virtual agx::ElementaryConstraintgetElementaryConstraint (const agx::String &name) const
 
virtual agx::ElementaryConstraintgetElementaryConstraint (const agx::UInt index) const
 
agx::ElementaryConstraint::RefContainergetElementaryConstraints ()
 
const agx::ElementaryConstraint::RefContainergetElementaryConstraints () const
 
virtual bool getEnable () const
 
virtual agx::Bool getEnableComputeForces () const
 
bool getEnableLinearization () const
 
virtual void getEpsilon (agx::Real *epsilon, agx::Real h)
 Writes regularization parameters for all active rows into epsilon.
 
agx::FrictionControllergetFrictionController (agx::UInt number=0) const
 
agx::UInt getJacobianRowUsage () const
 
virtual agx::Bool getLastForce (agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
 If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body with bodyIndex.
 
virtual agx::Bool getLastForce (const agx::RigidBody *rb, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
 If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body rb.
 
virtual agx::Bool getLastLocalForce (agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
 If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body with bodyIndex.
 
virtual agx::Bool getLastLocalForce (const agx::RigidBody *rb, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
 If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body rb.
 
agx::Lock1DgetLock1D (agx::UInt number=0) const
 
agx::Motor1DgetMotor1D (agx::UInt number=0) const
 
virtual void getParameters (agx::Real *violation, agx::Real *epsilon, agx::Real *damping, bool *holonomic, agx::Real *velocity, agx::RangeReal *bounds, int8_t *indexSetState, agx::Real h, agx::Real minPerturbation=agx::Real(1E-10))
 Writes solver parameters such as damping and holonomic.
 
agx::Range1DgetRange1D (agx::UInt number=0) const
 
virtual agx::ElementaryConstraintgetSecondaryConstraint (const agx::String &name) const
 
virtual agx::ElementaryConstraintgetSecondaryConstraint (const agx::UInt index) const
 
agx::ElementaryConstraint::RefContainergetSecondaryConstraints ()
 
const agx::ElementaryConstraint::RefContainergetSecondaryConstraints () const
 
bool getSolveBoth () const
 
bool getSolveIterative () const
 
SolverBodyView getSolverView () const
 Bodies as viewed from the solver.
 
Constraint::SolveType getSolveType () const
 
ConstraintImplPtrVectorgetSubConstraints ()
 
const ConstraintImplPtrVectorgetSubConstraints () const
 
int getTag () const
 
BodyView getUserView () const
 Bodies as viewed from the user.
 
virtual int getViolation (agx::Real *g, int row)
 Calculates and pushes the constraint values into array given current row.
 
void incrementConstraintCount (RigidBody *rb) const
 Increment the number of constraints connection to rb.
 
bool isImpacting () const
 
bool isValid () const
 
void onDirectComplianceMatrix (Real *data, unsigned int ld) const
 Internal callback from the direct solver with perturbation matrix data.
 
virtual void postSolveCallback (const agx::Jacobian6DOFElement *jacobians, const agx::Real *solution, agx::Real dt)
 Peak at the solution after the solver is done.
 
void postSolveIndexSetCallback (const int8_t *state)
 Callback after the solver is done about the state of each equation in the constraint.
 
virtual void postSystemCallback (DynamicsSystem *system)
 Last in the dynamics system step forward loop, this constraint gets a call with the main system.
 
virtual void prepare ()
 Prepares this constraint.
 
virtual void preSystemCallback (DynamicsSystem *system)
 Before prepare, and before the system writes to the data buffers, this constraint gets a call with the main system it's in.
 
virtual bool rebind ()
 The general version of rebind takes the first attachment frame and moves the other attachment frame so they have the exact same world transform.
 
virtual bool removeElementaryConstraint (agx::ElementaryConstraint *elementaryConstraint)
 Remove elementary constraint.
 
virtual bool removeElementaryConstraint (const agx::String &name)
 Remove elementary constraint.
 
virtual void removeNotification ()
 Callback when this constraint is removed from Simulation.
 
virtual bool removeSecondaryConstraint (agx::ElementaryConstraint *secondaryConstraint)
 Remove secondary constraint.
 
virtual bool removeSecondaryConstraint (const agx::String &name)
 Remove secondary constraint.
 
void reset ()
 Reset the solution vectors of the primary and secondary elementary constraints in the implementation.
 
void setBlockRowIndex (agx::UInt blockRowIndex)
 Sets the global start index for this constraint in the global, non-permuted matrix.
 
virtual void setEnable (bool enable)
 Sets the enable flag.
 
virtual void setEnableComputeForces (agx::Bool enable)
 Enable (or disable) computation of the forces applied to the dynamic bodies in this constraint.
 
void setEnableLinearization (bool enable)
 Control whether or not linearization should be performed on the ElementaryConstraints that require it, such as QuatLock.
 
void setSolveType (Constraint::SolveType type)
 Set solve type, either DIRECT, ITERATIVE or DIRECT_AND_ITERATIVE.
 
void sort ()
 This method will sort this constraint by global indexing of the bodies.
 
virtual CALLABLE_IGNORE void updateComplianceMatrix (LSquareComplianceMatrix matrix) const
 Callback with read/write access to the compliance matrix of this constraint in the direct solver.
 
virtual size_t updateJacobian (agx::Jacobian6DOFElement *jacobians)
 Updated storing of Jacobian matrices.
 
virtual bool updateValid ()
 Updates the valid conditions for this constraint.
 
virtual agx::AttachmentuserAPIgetAttachment (agx::UInt) const
 
virtual agx::AttachmentuserAPIgetAttachment (const agx::RigidBody *) const
 
agx::Real userAPIgetCompliance (agx::UInt dof) const
 
agx::Real userAPIgetCurrentForce (agx::UInt dof) const
 Consider using getLastForce instead.
 
agx::Real userAPIgetDamping (agx::UInt dof) const
 
agx::RangeReal userAPIgetForceRange (agx::UInt dof) const
 Get the force range for DOF dof.
 
agx::RegularizationParametersuserAPIgetRegularizationParameters (agx::UInt i)
 Get the regularization parameter i, i.e., the regularization parameter for equation i which is constraint dependent.
 
const agx::RegularizationParametersuserAPIgetRegularizationParameters (agx::UInt i) const
 
void userAPIsetCompliance (agx::Real compliance, int dof)
 Set the compliance for constraint row i of this constraint.
 
void userAPIsetDamping (agx::Real damping, int dof)
 Set the damping for constraint row i of this constraint.
 
void userAPIsetForceRange (agx::RangeReal forceRange, agx::Int dof)
 Assign force range, of an elementary constraint, for a given DOF.
 

Public Attributes

void * customData
 Custom data for the solvers to store data into.
 

Protected Types

using LocalState = agx::BitState< State, Int32 >
 
enum  State : Int32 { VALID = 1 << 0 , IMPACTING = 1 << 1 , SUPPORTS_COMPLIANCE_MATRIX = 1 << 2 }
 

Protected Member Functions

void setSimulation (agxSDK::Simulation *simulation)
 Set the Simulation this constraint belongs to.
 
void setSupportsComplianceMatrix (Bool supportsComplianceMatrix)
 Enable/disable compliance matrix callbacks from the direct solver where read/write access to the compliance matrix will be available in an implementation of updateComplianceMatrix.
 

Protected Attributes

UInt m_blockRowIndex
 Start block row for this constraint in the global matrix.
 
BlockStructure m_blockStructure
 The block structure; number of block, rows, dynamic blocks etc.
 
ConstraintRigidBodyContainer m_bodies
 Vector with observer pointers to bodies.
 
ConstrainedBodiesState m_constrainedBodiesState
 State of the included bodies, updated in updateValid.
 
ElementaryConstraint::RefContainer m_ec
 Vector of elementary constraints.
 
bool m_enable
 User controlled enable flag, constraint ignored by solver if false.
 
bool m_enableLinearization
 When necessary, tweak the values sent to the solver to make violation depend linearly on force or torque.
 
LocalState m_localState
 Current local state, updated all the time, not serialized.
 
UInt m_numRows
 Number of rows used by this constraint.
 
ElementaryConstraint::RefContainer m_sc
 Vector of secondary constraints.
 
Constraint::SolveType m_solveType
 Only for supported solvers.
 
ConstraintImplPtrVector m_subConstraints
 Vector with sub-constraints.
 
int m_tag
 Tag for this constraint.
 

Detailed Description

Definition at line 98 of file ConstraintImplementation.h.

Member Typedef Documentation

◆ LocalState

using agx::ConstraintImplementation::LocalState = agx::BitState<State, Int32>
protected

Definition at line 992 of file ConstraintImplementation.h.

Member Enumeration Documentation

◆ State

Enumerator
VALID 
IMPACTING 
SUPPORTS_COMPLIANCE_MATRIX 

Definition at line 984 of file ConstraintImplementation.h.

◆ Tags

Enumerator
NONE 
MANY_BODY 

Default is binary, i.e., ~MANY_BODY.

DEFAULT_BINARY_TAG 
DEFAULT_MANY_BODY_TAG 

Definition at line 101 of file ConstraintImplementation.h.

Constructor & Destructor Documentation

◆ ConstraintImplementation()

agx::ConstraintImplementation::ConstraintImplementation ( )

Default constructor.

Defaults to binary (one or two body) constraint, solve type DIRECT, enabled and valid.

◆ ~ConstraintImplementation()

virtual agx::ConstraintImplementation::~ConstraintImplementation ( )
virtual

Destructor.

Doesn't delete any user-added, non-ref-counted objects.

Member Function Documentation

◆ addElementaryConstraint()

virtual bool agx::ConstraintImplementation::addElementaryConstraint ( const agx::String name,
agx::ElementaryConstraint elementaryConstraint 
)
virtual

Add elementary constraint (like Spherical, Dot1, Dot2 etc) given name.

General for elementary constraints is that their input is based on body relative data (far from general).

Returns
true if this constraint supports the elementary constraint and the elementary constraint will be used - otherwise false

◆ addNlCallbacks()

virtual void agx::ConstraintImplementation::addNlCallbacks ( agx::SparseRangeReal sparseRangeReal,
const NlmcpCallbackSolverData solverData 
) const
virtual

Interface for non-linear callback from solver.

◆ addNotification()

virtual void agx::ConstraintImplementation::addNotification ( )
inlinevirtual

Callback when this constraint is added to Simulation.

Definition at line 581 of file ConstraintImplementation.h.

◆ addSecondaryConstraint()

virtual bool agx::ConstraintImplementation::addSecondaryConstraint ( const agx::String name,
agx::ElementaryConstraint secondaryConstraint 
)
virtual

Add secondary constraint (like motor, range and/or lock etc) given name.

General for secondary constraints is that their input is based on the current constraint angle.

Returns
true if this constraint supports the secondary constraint and the secondary constraint will be used - otherwise false

◆ calculateCurrentViolation()

RealVector agx::ConstraintImplementation::calculateCurrentViolation ( ) const

Calculates the current violation of the ordinary degrees of freedom of this constraint, e.g., three translational and two rotational (total 5 elements) of a hinge, i.e., controllers DOF are not included.

Returns
violation vector of size agx::Constraint::getNumDOF()

◆ calculateNumActiveRows()

agx::UInt agx::ConstraintImplementation::calculateNumActiveRows ( ) const

Calculates the current number of active rows, including both elementary and secondary constraints.

The result can be used to allocate temporary buffers for additional calls to solver related methods, e.g., getViolation.

Returns
the (current) total number of active rows in this constraint

◆ calculateViolationVectorAverageSize()

agx::Real agx::ConstraintImplementation::calculateViolationVectorAverageSize ( )

Gets the average size of the elements in getViolation() by calculating the magnitude and dividing by the number of elements.

Returns
the average size of the elements in getViolation()

◆ findSecondaryConstraintGivenType()

template<typename T >
T * agx::ConstraintImplementation::findSecondaryConstraintGivenType ( const agx::UInt  count = 0) const
inline
Returns
the secondary constraint of specified type after count occurrences (of that type)

Definition at line 1382 of file ConstraintImplementation.h.

References m_sc, and agx::Container::size().

◆ getActive()

bool agx::ConstraintImplementation::getActive ( ) const
inline
Returns
true if this constraint is enabled and valid, otherwise false

Definition at line 640 of file ConstraintImplementation.h.

◆ getAngle()

virtual agx::Real agx::ConstraintImplementation::getAngle ( agx::UInt  = 0) const
inlinevirtual

If the constraint supports angle calculations and 'dof' is in range, this method returns the angle of the given degree of freedom.

Returns
the angle given degree of freedom - if 'dof' is out of range or if this constraint doesn't support angles this method returns 0

Reimplemented in agx::HighLevelConstraintImplementation.

Definition at line 872 of file ConstraintImplementation.h.

◆ getAttachmentPair()

virtual agx::AttachmentPair * agx::ConstraintImplementation::getAttachmentPair ( ) const
inlinevirtual
Returns
the constraint attachment pair

Reimplemented in agx::HighLevelConstraintImplementation.

Definition at line 772 of file ConstraintImplementation.h.

◆ getBlockRowIndex()

agx::UInt agx::ConstraintImplementation::getBlockRowIndex ( ) const
inline
Returns
the global start row for this constraint in the global, non-permuted matrix

Definition at line 529 of file ConstraintImplementation.h.

◆ getBlockStructure()

const BlockStructure & agx::ConstraintImplementation::getBlockStructure ( ) const
inline
Returns
the block structure for this constraint (number of rows, number of Jacobian blocks etc.)

Definition at line 518 of file ConstraintImplementation.h.

◆ getBounds()

virtual void agx::ConstraintImplementation::getBounds ( agx::RangeReal bounds,
agx::Real  dt 
) const
virtual

Calculates and pushes the bounds into a sparse range data structure.

Every equation in this constraint that has a bound must during this call push its bounds at its current global row (row + localRow). The bounds is not a force, rather an impulse (dimension force*time).

Parameters
bounds- all bounds, use bounds.push_back( IndexedRangeReal( std::make_pair( row + localRow, RangeReal( myLowerBound, myUpperBound ) ) ) )
dt- time step, often used to scale forces to impulses

◆ getConstraintVelocity()

virtual int agx::ConstraintImplementation::getConstraintVelocity ( agx::Real v,
int  row 
)
virtual

Calculates and pushes the constraint velocities into array given current row.

Constraint velocity is mainly used for non-holonomic constraint such as hinge- and prismatic motors.

Parameters
v- array of constraint velocity values, must at least be of size row + numRowsThisConstraintUses
row- row to start push values (v[row] = firstConstraintValue)
Returns
the number of rows this constraint uses (could differ from time step to time step)

◆ getCurrentSpeed()

virtual agx::Real agx::ConstraintImplementation::getCurrentSpeed ( agx::UInt  = 0) const
inlinevirtual

If this method is implemented, a call to this method will return the current speed of the angle.

This is only valid for 1DOF and 2DOF constraints (such as hinge, prismatic, distance and cylindrical).

Returns
the current angle speed, returns 0 for constraints that are non-compatible to this call

Definition at line 879 of file ConstraintImplementation.h.

◆ getElementaryConstraint() [1/2]

virtual agx::ElementaryConstraint * agx::ConstraintImplementation::getElementaryConstraint ( const agx::String name) const
virtual
Parameters
name- name of the elementary constraint
Returns
elementary constraint given name

◆ getElementaryConstraint() [2/2]

virtual agx::ElementaryConstraint * agx::ConstraintImplementation::getElementaryConstraint ( const agx::UInt  index) const
virtual
Parameters
index- index of the elementary constraint
Returns
elementary constraint given index

◆ getElementaryConstraints() [1/2]

agx::ElementaryConstraint::RefContainer & agx::ConstraintImplementation::getElementaryConstraints ( )
inline
Returns
a vector of the elementary constraints

Definition at line 597 of file ConstraintImplementation.h.

◆ getElementaryConstraints() [2/2]

const agx::ElementaryConstraint::RefContainer & agx::ConstraintImplementation::getElementaryConstraints ( ) const
inline

Definition at line 598 of file ConstraintImplementation.h.

◆ getEnable()

virtual bool agx::ConstraintImplementation::getEnable ( ) const
inlinevirtual
Returns
true if this constraint is enabled, otherwise false
Note
The constraint can't disable itself, i.e., enable == false only if the user has disabled it

Definition at line 629 of file ConstraintImplementation.h.

◆ getEnableComputeForces()

virtual agx::Bool agx::ConstraintImplementation::getEnableComputeForces ( ) const
virtual
Returns
true if this constraint has been enabled to compute the forces applied to its bodies - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

◆ getEnableLinearization()

bool agx::ConstraintImplementation::getEnableLinearization ( ) const
Returns
true if linearization is enabled for this constraint.

◆ getEpsilon()

virtual void agx::ConstraintImplementation::getEpsilon ( agx::Real epsilon,
agx::Real  h 
)
virtual

Writes regularization parameters for all active rows into epsilon.

Parameters
epsilon- array to write into (number of active rows allocated)
h- current time step

◆ getFrictionController()

agx::FrictionController * agx::ConstraintImplementation::getFrictionController ( agx::UInt  number = 0) const
Returns
a friction controller if present for this constraint, otherwise nullptr

◆ getJacobianRowUsage()

agx::UInt agx::ConstraintImplementation::getJacobianRowUsage ( ) const
inline
Returns
the number of rows this constraint uses (equivalent to m_jacobian[0].getNumRows())

Definition at line 513 of file ConstraintImplementation.h.

◆ getLastForce() [1/2]

virtual agx::Bool agx::ConstraintImplementation::getLastForce ( agx::UInt  bodyIndex,
agx::Vec3 retForce,
agx::Vec3 retTorque,
agx::Bool  giveForceAtCm = false 
) const
virtual

If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body with bodyIndex.

The force is given in world coordinates and is the one applied at the anchor position of this constraint.

The result includes force and torque from this constraint including all enabled controllers (e.g., motors, locks, ranges).

See also
setEnableComputeForces
Parameters
bodyIndex- index of body, if number of bodies = 1 and bodyIndex = 1, the force and torque applied to "the world body" is returned
retForce- the force applied by this constraint on body at bodyIndex last solve
retTorque- the torque applied by this constraint on body at bodyIndex last solve
giveForceAtCm- this parameter affects the resulting torque. The default behavior (giveForceAtCm = false) calculates the force applied by this constraint at the anchor position. Letting giveForceAtCm = true, the force will be applied at center of mass, affecting the torque as \(T_{new} = T - r \times F\) where r is the vector from the anchor point to the center of mass of the body.
Returns
true if resulting force and torque was written to retForce and retTorque - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

◆ getLastForce() [2/2]

virtual agx::Bool agx::ConstraintImplementation::getLastForce ( const agx::RigidBody rb,
agx::Vec3 retForce,
agx::Vec3 retTorque,
agx::Bool  giveForceAtCm = false 
) const
virtual

If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body rb.

The force is given in world coordinates and is the one applied at the anchor position of this constraint.

The result includes force and torque from this constraint including all enabled controllers (e.g., motors, locks, ranges).

See also
setEnableComputeForces
Parameters
rb- body in this constraint. If this constraint is attached in world, nullptr can be used.
retForce- the force applied by this constraint on body rb at the last solve
retTorque- the torque applied by this constraint on body rb at the last solve
giveForceAtCm- this parameter affects the resulting torque. The default behavior (giveForceAtCm = false) calculates the force applied by this constraint at the anchor position. Letting giveForceAtCm = true, the force will be applied at center of mass, affecting the torque as \(T_{new} = T - r \times F\) where r is the vector from the anchor point to the center of mass of the body.
Returns
true if resulting force and torque was written to retForce and retTorque - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

◆ getLastLocalForce() [1/2]

virtual agx::Bool agx::ConstraintImplementation::getLastLocalForce ( agx::UInt  bodyIndex,
agx::Vec3 retForce,
agx::Vec3 retTorque,
agx::Bool  giveForceAtCm = false 
) const
virtual

If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body with bodyIndex.

The force is given in the frame of the constraint.

The result includes force and torque from this constraint including all enabled controllers (e.g., motors, locks, ranges).

See also
setEnableComputeForces
Parameters
bodyIndex- index of body, if number of bodies = 1 and bodyIndex = 1, the force and torque applied to "the world body" is returned
retForce- the force applied by this constraint on body at bodyIndex last solve
retTorque- the torque applied by this constraint on body at bodyIndex last solve
giveForceAtCm- this parameter affects the resulting torque. The default behavior (giveForceAtCm = false) calculates the force applied by this constraint at the anchor position. Letting giveForceAtCm = true, the force will be applied at center of mass, affecting the torque as \(T_{new} = T - r \times F\) where r is the vector from the anchor point to the center of mass of the body.
Returns
true if resulting force and torque was written to retForce and retTorque - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

◆ getLastLocalForce() [2/2]

virtual agx::Bool agx::ConstraintImplementation::getLastLocalForce ( const agx::RigidBody rb,
agx::Vec3 retForce,
agx::Vec3 retTorque,
agx::Bool  giveForceAtCm = false 
) const
virtual

If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the body rb.

The force is given in the frame of the constraint.

The result includes force and torque from this constraint including all enabled controllers (e.g., motors, locks, ranges).

See also
setEnableComputeForces
Parameters
rb- body in this constraint. If this constraint is attached in world, nullptr can be used.
retForce- the force applied by this constraint on body rb at the last solve
retTorque- the torque applied by this constraint on body rb at the last solve
giveForceAtCm- this parameter affects the resulting torque. The default behavior (giveForceAtCm = false) calculates the force applied by this constraint at the anchor position. Letting giveForceAtCm = true, the force will be applied at center of mass, affecting the torque as \(T_{new} = T - r \times F\) where r is the vector from the anchor point to the center of mass of the body.
Returns
true if resulting force and torque was written to retForce and retTorque - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

◆ getLock1D()

agx::Lock1D * agx::ConstraintImplementation::getLock1D ( agx::UInt  number = 0) const
Returns
a lock if a lock is present for this constraint, otherwise nullptr

◆ getMotor1D()

agx::Motor1D * agx::ConstraintImplementation::getMotor1D ( agx::UInt  number = 0) const
Returns
a motor if a motor is present for this constraint, otherwise nullptr

◆ getParameters()

virtual void agx::ConstraintImplementation::getParameters ( agx::Real violation,
agx::Real epsilon,
agx::Real damping,
bool *  holonomic,
agx::Real velocity,
agx::RangeReal bounds,
int8_t *  indexSetState,
agx::Real  h,
agx::Real  minPerturbation = agx::Real(1E-10) 
)
virtual

Writes solver parameters such as damping and holonomic.

This should be deprecated.

◆ getRange1D()

agx::Range1D * agx::ConstraintImplementation::getRange1D ( agx::UInt  number = 0) const
Returns
a range if a range is present for this constraint, otherwise nullptr

◆ getSecondaryConstraint() [1/2]

virtual agx::ElementaryConstraint * agx::ConstraintImplementation::getSecondaryConstraint ( const agx::String name) const
virtual
Parameters
name- name of the elementary constraint
Returns
elementary constraint given name

◆ getSecondaryConstraint() [2/2]

virtual agx::ElementaryConstraint * agx::ConstraintImplementation::getSecondaryConstraint ( const agx::UInt  index) const
virtual
Parameters
index- index of the secondary constraint
Returns
secondary constraint given index

◆ getSecondaryConstraints() [1/2]

agx::ElementaryConstraint::RefContainer & agx::ConstraintImplementation::getSecondaryConstraints ( )
inline
Returns
a vector of secondary constraints

Definition at line 603 of file ConstraintImplementation.h.

◆ getSecondaryConstraints() [2/2]

const agx::ElementaryConstraint::RefContainer & agx::ConstraintImplementation::getSecondaryConstraints ( ) const
inline

Definition at line 604 of file ConstraintImplementation.h.

◆ getSolveBoth()

bool agx::ConstraintImplementation::getSolveBoth ( ) const
inline
Returns
true if this constraint is solved both with the direct solve and with the iterative solver

Definition at line 540 of file ConstraintImplementation.h.

◆ getSolveIterative()

bool agx::ConstraintImplementation::getSolveIterative ( ) const
inline
Returns
true if this constraint will be solved iteratively by a hybrid solver - otherwise false
Note
Should be removed, still here for old hybrid solvers.

Definition at line 535 of file ConstraintImplementation.h.

◆ getSolverView()

SolverBodyView agx::ConstraintImplementation::getSolverView ( ) const

Bodies as viewed from the solver.

It's only valid to use this interface if you're a solver.

◆ getSolveType()

Constraint::SolveType agx::ConstraintImplementation::getSolveType ( ) const
inline
Returns
the solve type for this constraint

Definition at line 550 of file ConstraintImplementation.h.

◆ getSubConstraints() [1/2]

ConstraintImplPtrVector & agx::ConstraintImplementation::getSubConstraints ( )
inline
Returns
a vector of the sub-constraints

Definition at line 609 of file ConstraintImplementation.h.

◆ getSubConstraints() [2/2]

const ConstraintImplPtrVector & agx::ConstraintImplementation::getSubConstraints ( ) const
inline

Definition at line 610 of file ConstraintImplementation.h.

◆ getTag()

int agx::ConstraintImplementation::getTag ( ) const
inline
Returns
the current tag of this constraint

Definition at line 566 of file ConstraintImplementation.h.

◆ getUserView()

BodyView agx::ConstraintImplementation::getUserView ( ) const

Bodies as viewed from the user.

This is the default way to look at the bodies.

◆ getViolation()

virtual int agx::ConstraintImplementation::getViolation ( agx::Real g,
int  row 
)
virtual

Calculates and pushes the constraint values into array given current row.

Parameters
g- array of constraint values, must at least be of size row + numRowsThisConstraintUses
row- row to start push values (g[row] = firstConstraintValue)
Returns
the number of rows this constraint uses (could differ from time step to time step)

◆ incrementConstraintCount()

void agx::ConstraintImplementation::incrementConstraintCount ( RigidBody rb) const
inline

Increment the number of constraints connection to rb.

Parameters
rb- rigid body to increment the constraint count

Definition at line 561 of file ConstraintImplementation.h.

References agxAssert.

◆ isImpacting()

bool agx::ConstraintImplementation::isImpacting ( ) const
inline
Returns
true if one or more equations in this constraint is impacting

Definition at line 555 of file ConstraintImplementation.h.

◆ isValid()

bool agx::ConstraintImplementation::isValid ( ) const
inline
Returns
true if this constraint is valid (no disabled bodies, removed bodies, has dynamic bodies etc.), otherwise false

Definition at line 645 of file ConstraintImplementation.h.

◆ onDirectComplianceMatrix()

void agx::ConstraintImplementation::onDirectComplianceMatrix ( Real data,
unsigned int  ld 
) const

Internal callback from the direct solver with perturbation matrix data.

◆ postSolveCallback()

virtual void agx::ConstraintImplementation::postSolveCallback ( const agx::Jacobian6DOFElement jacobians,
const agx::Real solution,
agx::Real  dt 
)
virtual

Peak at the solution after the solver is done.

Parameters
jacobians- Jacobian rows for this constraint (index 0 is first dynamic body first row)
solution- solution (impulse - divide by dt to get force)
dt- time step size used to get solution

Reimplemented in agx::HighLevelConstraintImplementation.

◆ postSolveIndexSetCallback()

void agx::ConstraintImplementation::postSolveIndexSetCallback ( const int8_t *  state)

Callback after the solver is done about the state of each equation in the constraint.

The information is if an equation was at a upper or lower bound or free.

◆ postSystemCallback()

void agx::ConstraintImplementation::postSystemCallback ( DynamicsSystem system)
inlinevirtual

Last in the dynamics system step forward loop, this constraint gets a call with the main system.

This call is made after the data buffers have been written back to the bodies.

Parameters
system- the main dynamics system

Reimplemented in agxPowerLine::PhysicalDimensionMultiBodyConstraintImplementation.

Definition at line 1397 of file ConstraintImplementation.h.

◆ prepare()

virtual void agx::ConstraintImplementation::prepare ( )
virtual

Prepares this constraint.

Update attachment transforms given the current transforms of the bodies (in most cases equivalent to calculate the Jacobian), compute the joint angles (if this constraint supports that) and calculates the amount of data needed.

Reimplemented in agx::HighLevelConstraintImplementation, and agxPowerLine::ActuatorConstraintImplementation.

◆ preSystemCallback()

void agx::ConstraintImplementation::preSystemCallback ( DynamicsSystem system)
inlinevirtual

Before prepare, and before the system writes to the data buffers, this constraint gets a call with the main system it's in.

During this call it's possible to add or remove bodies from the system, bodies this constraint are responsible of.

Parameters
system- the main dynamics system

Reimplemented in agxPowerLine::PhysicalDimensionMultiBodyConstraintImplementation.

Definition at line 1395 of file ConstraintImplementation.h.

◆ rebind()

virtual bool agx::ConstraintImplementation::rebind ( )
inlinevirtual

The general version of rebind takes the first attachment frame and moves the other attachment frame so they have the exact same world transform.

This means that the first rigid body is the reference (other is another rigid body or world). E.g., Prismatic and Hinge axis will be preserved seen from the reference body.

Returns
true if successful - otherwise false

Reimplemented in agx::HighLevelConstraintImplementation.

Definition at line 623 of file ConstraintImplementation.h.

◆ removeElementaryConstraint() [1/2]

virtual bool agx::ConstraintImplementation::removeElementaryConstraint ( agx::ElementaryConstraint elementaryConstraint)
virtual

Remove elementary constraint.

Parameters
elementaryConstraint- elementary constraint to remove
Returns
true if removed

◆ removeElementaryConstraint() [2/2]

virtual bool agx::ConstraintImplementation::removeElementaryConstraint ( const agx::String name)
virtual

Remove elementary constraint.

Parameters
name- name of the elementary constraint to remove
Returns
true if removed

◆ removeNotification()

virtual void agx::ConstraintImplementation::removeNotification ( )
inlinevirtual

Callback when this constraint is removed from Simulation.

Definition at line 586 of file ConstraintImplementation.h.

◆ removeSecondaryConstraint() [1/2]

virtual bool agx::ConstraintImplementation::removeSecondaryConstraint ( agx::ElementaryConstraint secondaryConstraint)
virtual

Remove secondary constraint.

Parameters
secondaryConstraint- secondary constraint to remove
Returns
true if removed

◆ removeSecondaryConstraint() [2/2]

virtual bool agx::ConstraintImplementation::removeSecondaryConstraint ( const agx::String name)
virtual

Remove secondary constraint.

Parameters
name- name of the secondary constraint to remove
Returns
true if removed

◆ reset()

void agx::ConstraintImplementation::reset ( )

Reset the solution vectors of the primary and secondary elementary constraints in the implementation.

◆ setBlockRowIndex()

void agx::ConstraintImplementation::setBlockRowIndex ( agx::UInt  blockRowIndex)
inline

Sets the global start index for this constraint in the global, non-permuted matrix.

Parameters
blockRowIndex- global start row for this constraint in the global, non-permuted matrix

Definition at line 524 of file ConstraintImplementation.h.

◆ setEnable()

virtual void agx::ConstraintImplementation::setEnable ( bool  enable)
virtual

Sets the enable flag.

If this flags sets to false the solver will ignore this constraint.

Parameters
enable- set to true if this constraint should be enabled, false to disable it

◆ setEnableComputeForces()

virtual void agx::ConstraintImplementation::setEnableComputeForces ( agx::Bool  enable)
virtual

Enable (or disable) computation of the forces applied to the dynamic bodies in this constraint.

Matrix-vector operation to compute the forces after solve.

See also
getLastForce
Parameters
enable- true to enable, false to disable

Reimplemented in agx::HighLevelConstraintImplementation.

◆ setEnableLinearization()

void agx::ConstraintImplementation::setEnableLinearization ( bool  enable)

Control whether or not linearization should be performed on the ElementaryConstraints that require it, such as QuatLock.

See also
agx::Constraint::setEnableLinearization

◆ setSimulation()

void agx::ConstraintImplementation::setSimulation ( agxSDK::Simulation simulation)
protected

Set the Simulation this constraint belongs to.

Parameters
simulation- the Simulation this constraint belongs to

◆ setSolveType()

void agx::ConstraintImplementation::setSolveType ( Constraint::SolveType  type)
inline

Set solve type, either DIRECT, ITERATIVE or DIRECT_AND_ITERATIVE.

Definition at line 545 of file ConstraintImplementation.h.

◆ setSupportsComplianceMatrix()

void agx::ConstraintImplementation::setSupportsComplianceMatrix ( Bool  supportsComplianceMatrix)
protected

Enable/disable compliance matrix callbacks from the direct solver where read/write access to the compliance matrix will be available in an implementation of updateComplianceMatrix.

Parameters
supportsComplianceMatrix- true to enable access, false to disable (Default: Disabled).

◆ sort()

void agx::ConstraintImplementation::sort ( )

This method will sort this constraint by global indexing of the bodies.

It creates a permutation vector (i.e., it doesn't reorder the bodies nor the indices) so that one can index m_bodies and m_indices via the permutation.

◆ updateComplianceMatrix()

virtual CALLABLE_IGNORE void agx::ConstraintImplementation::updateComplianceMatrix ( LSquareComplianceMatrix  matrix) const
virtual

Callback with read/write access to the compliance matrix of this constraint in the direct solver.

The lower triangle is accessible and will be used, all entries must be less than or equal to zero. The diagonal has already been written with (negative) regularization parameters of each row of this constraint.

Parameters
matrix- compliance matrix

◆ updateJacobian()

virtual size_t agx::ConstraintImplementation::updateJacobian ( agx::Jacobian6DOFElement jacobians)
virtual

Updated storing of Jacobian matrices.

Row based, each Jacobian6DOFElement is 1x6 separated into spatial and rotational part. The number of used rows should be: number_of_non_static_bodies * number_of_active_rows Start the indexing at 0.

Reimplemented in agx::HighLevelConstraintImplementation, and agxPowerLine::PhysicalDimensionMultiBodyConstraintImplementation.

◆ updateValid()

virtual bool agx::ConstraintImplementation::updateValid ( )
virtual

Updates the valid conditions for this constraint.

This constraint is not valid if for example; one or more bodies are removed (either from simulation or deallocated), one or more bodies are disabled or the number of dynamic bodies in this constraint is zero.

Returns
m_valid, true if valid, otherwise false

Reimplemented in agx::HighLevelConstraintImplementation, agxPowerLine::ActuatorConstraintImplementation, and agxPowerLine::PhysicalDimensionMultiBodyConstraintImplementation.

◆ userAPIgetAttachment() [1/2]

virtual agx::Attachment * agx::ConstraintImplementation::userAPIgetAttachment ( agx::UInt  ) const
inlinevirtual
Returns
the constraint attachment given index

Reimplemented in agx::HighLevelConstraintImplementation.

Definition at line 767 of file ConstraintImplementation.h.

◆ userAPIgetAttachment() [2/2]

virtual agx::Attachment * agx::ConstraintImplementation::userAPIgetAttachment ( const agx::RigidBody ) const
inlinevirtual
Returns
the constraint attachment given a rigid body (returns 0 if invalid)

Reimplemented in agx::HighLevelConstraintImplementation.

Definition at line 762 of file ConstraintImplementation.h.

◆ userAPIgetCompliance()

agx::Real agx::ConstraintImplementation::userAPIgetCompliance ( agx::UInt  dof) const
Returns
the compliance of the i'th constraint row of this constraint

◆ userAPIgetCurrentForce()

agx::Real agx::ConstraintImplementation::userAPIgetCurrentForce ( agx::UInt  dof) const

Consider using getLastForce instead.

This method returns the magnitude of the force in a given degree of freedom (DOF). Enabled controllers in the given DOF will NOT be included, agx::ElementaryConstraint::getCurrentForce has to be used for that.

Returns
the current force magnitude (i.e., the force magnitude last time step) in given DOF >= 0 && <= NUM_DOFS
See also
setEnableComputeForces and getLastForce

◆ userAPIgetDamping()

agx::Real agx::ConstraintImplementation::userAPIgetDamping ( agx::UInt  dof) const
Returns
the damping of the i'th constraint row of this constraint

◆ userAPIgetForceRange()

agx::RangeReal agx::ConstraintImplementation::userAPIgetForceRange ( agx::UInt  dof) const

Get the force range for DOF dof.

Note
Indices > number of DOF for this constraint is not defined, an infinite force range will be returned.
For controllers (secondary constraints), use their specific method, e.g., constraint->getMotor1D()->getForceRange().
Parameters
dof- index of the requested DOF

◆ userAPIgetRegularizationParameters() [1/2]

agx::RegularizationParameters * agx::ConstraintImplementation::userAPIgetRegularizationParameters ( agx::UInt  i)

Get the regularization parameter i, i.e., the regularization parameter for equation i which is constraint dependent.

Parameters
i- corresponds to the i'th constraint row of this constraint
Returns
regularization parameter for equation i

◆ userAPIgetRegularizationParameters() [2/2]

const agx::RegularizationParameters * agx::ConstraintImplementation::userAPIgetRegularizationParameters ( agx::UInt  i) const

◆ userAPIsetCompliance()

void agx::ConstraintImplementation::userAPIsetCompliance ( agx::Real  compliance,
int  dof 
)

Set the compliance for constraint row i of this constraint.

Parameters
compliance- compliance
dof- corresponds to the i'th constraint row of this constraint

◆ userAPIsetDamping()

void agx::ConstraintImplementation::userAPIsetDamping ( agx::Real  damping,
int  dof 
)

Set the damping for constraint row i of this constraint.

Parameters
damping- damping
dof- corresponds to the i'th constraint row of this constraint

◆ userAPIsetForceRange()

void agx::ConstraintImplementation::userAPIsetForceRange ( agx::RangeReal  forceRange,
agx::Int  dof 
)

Assign force range, of an elementary constraint, for a given DOF.

Note
For controllers (secondary constraints), use their specific methods, e.g., constraint->getMotor1D()->setForceRange( fRange ).
Parameters
forceRange- value of force range for the given DOF
dof- index of the DOF (-1 indicates all)

Member Data Documentation

◆ customData

void* agx::ConstraintImplementation::customData

Custom data for the solvers to store data into.

Definition at line 569 of file ConstraintImplementation.h.

◆ m_blockRowIndex

UInt agx::ConstraintImplementation::m_blockRowIndex
protected

Start block row for this constraint in the global matrix.

Definition at line 1019 of file ConstraintImplementation.h.

◆ m_blockStructure

BlockStructure agx::ConstraintImplementation::m_blockStructure
protected

The block structure; number of block, rows, dynamic blocks etc.

Definition at line 1018 of file ConstraintImplementation.h.

◆ m_bodies

◆ m_constrainedBodiesState

ConstrainedBodiesState agx::ConstraintImplementation::m_constrainedBodiesState
protected

State of the included bodies, updated in updateValid.

Definition at line 1015 of file ConstraintImplementation.h.

◆ m_ec

ElementaryConstraint::RefContainer agx::ConstraintImplementation::m_ec
protected

Vector of elementary constraints.

Definition at line 1011 of file ConstraintImplementation.h.

◆ m_enable

bool agx::ConstraintImplementation::m_enable
protected

User controlled enable flag, constraint ignored by solver if false.

Definition at line 1029 of file ConstraintImplementation.h.

◆ m_enableLinearization

bool agx::ConstraintImplementation::m_enableLinearization
protected

When necessary, tweak the values sent to the solver to make violation depend linearly on force or torque.

Definition at line 1030 of file ConstraintImplementation.h.

◆ m_localState

LocalState agx::ConstraintImplementation::m_localState
protected

Current local state, updated all the time, not serialized.

Definition at line 1031 of file ConstraintImplementation.h.

◆ m_numRows

UInt agx::ConstraintImplementation::m_numRows
protected

Number of rows used by this constraint.

Definition at line 1017 of file ConstraintImplementation.h.

◆ m_sc

ElementaryConstraint::RefContainer agx::ConstraintImplementation::m_sc
protected

Vector of secondary constraints.

Definition at line 1012 of file ConstraintImplementation.h.

Referenced by findSecondaryConstraintGivenType().

◆ m_solveType

Constraint::SolveType agx::ConstraintImplementation::m_solveType
protected

Only for supported solvers.

Default: DIRECT. agxData::Values: DIRECT, ITERATIVE or DIRECT_AND_ITERATIVE.

Definition at line 1028 of file ConstraintImplementation.h.

◆ m_subConstraints

ConstraintImplPtrVector agx::ConstraintImplementation::m_subConstraints
mutableprotected

Vector with sub-constraints.

Definition at line 1016 of file ConstraintImplementation.h.

◆ m_tag

int agx::ConstraintImplementation::m_tag
protected

Tag for this constraint.

Default tag is either BINARY or MANY_BODY.

Definition at line 1020 of file ConstraintImplementation.h.


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