33 #ifndef DART_DYNAMICS_POINTMASS_HPP_ 34 #define DART_DYNAMICS_POINTMASS_HPP_ 37 #include <Eigen/Dense> 38 #include "dart/dynamics/Entity.hpp" 39 #include "dart/math/Helpers.hpp" 47 class PointMassNotifier;
72 const Eigen::Vector3d& positions = Eigen::Vector3d::Zero(),
73 const Eigen::Vector3d& velocities = Eigen::Vector3d::Zero(),
74 const Eigen::Vector3d& accelerations = Eigen::Vector3d::Zero(),
75 const Eigen::Vector3d& forces = Eigen::Vector3d::Zero());
77 bool operator==(
const State& other)
const;
79 virtual ~
State() =
default;
119 const Eigen::Vector3d& _X0 = Eigen::Vector3d::Zero(),
120 double _mass = 0.0005,
121 const std::vector<std::size_t>& _connections
122 = std::vector<std::size_t>(),
123 const Eigen::Vector3d& _positionLowerLimits
124 = Eigen::Vector3d::Constant(-math::constantsd::inf()),
125 const Eigen::Vector3d& _positionUpperLimits
126 = Eigen::Vector3d::Constant(math::constantsd::inf()),
127 const Eigen::Vector3d& _velocityLowerLimits
128 = Eigen::Vector3d::Constant(-math::constantsd::inf()),
129 const Eigen::Vector3d& _velocityUpperLimits
130 = Eigen::Vector3d::Constant(math::constantsd::inf()),
131 const Eigen::Vector3d& _accelerationLowerLimits
132 = Eigen::Vector3d::Constant(-math::constantsd::inf()),
133 const Eigen::Vector3d& _accelerationUpperLimits
134 = Eigen::Vector3d::Constant(math::constantsd::inf()),
135 const Eigen::Vector3d& _forceLowerLimits
136 = Eigen::Vector3d::Constant(-math::constantsd::inf()),
137 const Eigen::Vector3d& _forceUpperLimits
138 = Eigen::Vector3d::Constant(math::constantsd::inf()));
140 void setRestingPosition(
const Eigen::Vector3d& _x);
142 void setMass(
double _mass);
144 bool operator==(
const Properties& other)
const;
146 bool operator!=(
const Properties& other)
const;
165 std::size_t getIndexInSoftBodyNode()
const;
168 void setMass(
double _mass);
171 double getMass()
const;
174 double getPsi()
const;
177 double getImplicitPsi()
const;
180 double getPi()
const;
183 double getImplicitPi()
const;
186 void addConnectedPointMass(
PointMass* _pointMass);
189 std::size_t getNumConnectedPointMasses()
const;
192 PointMass* getConnectedPointMass(std::size_t _idx);
195 const PointMass* getConnectedPointMass(std::size_t _idx)
const;
210 std::size_t getNumDofs()
const;
223 void setPosition(std::size_t _index,
double _position);
226 double getPosition(std::size_t _index)
const;
229 void setPositions(
const Eigen::Vector3d& _positions);
232 const Eigen::Vector3d& getPositions()
const;
235 void resetPositions();
242 void setVelocity(std::size_t _index,
double _velocity);
245 double getVelocity(std::size_t _index)
const;
248 void setVelocities(
const Eigen::Vector3d& _velocities);
251 const Eigen::Vector3d& getVelocities()
const;
254 void resetVelocities();
261 void setAcceleration(std::size_t _index,
double _acceleration);
264 double getAcceleration(std::size_t _index)
const;
267 void setAccelerations(
const Eigen::Vector3d& _accelerations);
270 const Eigen::Vector3d& getAccelerations()
const;
276 void resetAccelerations();
283 void setForce(std::size_t _index,
double _force);
286 double getForce(std::size_t _index);
289 void setForces(
const Eigen::Vector3d& _forces);
292 const Eigen::Vector3d& getForces()
const;
302 void setVelocityChange(std::size_t _index,
double _velocityChange);
305 double getVelocityChange(std::size_t _index);
308 void resetVelocityChanges();
315 void setConstraintImpulse(std::size_t _index,
double _impulse);
318 double getConstraintImpulse(std::size_t _index);
321 void resetConstraintImpulses();
328 void integratePositions(
double _dt);
331 void integrateVelocities(
double _dt);
340 void addExtForce(
const Eigen::Vector3d& _force,
bool _isForceLocal =
false);
343 void clearExtForce();
350 void setConstraintImpulse(
351 const Eigen::Vector3d& _constImp,
bool _isLocal =
false);
355 const Eigen::Vector3d& _constImp,
bool _isLocal =
false);
365 void setRestingPosition(
const Eigen::Vector3d& _p);
368 const Eigen::Vector3d& getRestingPosition()
const;
371 const Eigen::Vector3d& getLocalPosition()
const;
374 const Eigen::Vector3d& getWorldPosition()
const;
378 Eigen::Matrix<double, 3, Eigen::Dynamic> getWorldJacobian();
460 const Eigen::Vector3d& _gravity,
bool _withExternalForces =
false);
470 double _timeStep,
double _withDampingForces,
double _withSpringForces);
483 void updateMassMatrix();
486 void aggregateMassMatrix(Eigen::MatrixXd& _MCol,
int _col);
489 void aggregateAugMassMatrix(
490 Eigen::MatrixXd& _MCol,
int _col,
double _timeStep);
493 void updateInvMassMatrix();
496 void updateInvAugMassMatrix();
499 void aggregateInvMassMatrix(Eigen::MatrixXd& _MInvCol,
int _col);
502 void aggregateInvAugMassMatrix(
503 Eigen::MatrixXd& _MInvCol,
int _col,
double _timeStep);
506 void aggregateGravityForceVector(
507 Eigen::VectorXd& _g,
const Eigen::Vector3d& _gravity);
510 void updateCombinedVector();
513 void aggregateCombinedVector(
514 Eigen::VectorXd& _Cg,
const Eigen::Vector3d& _gravity);
524 Eigen::Vector3d mM_dV;
527 Eigen::Vector3d mM_F;
531 Eigen::Vector3d mBiasForceForInvMeta;
535 Eigen::Vector3d mG_F;
539 Eigen::Vector3d mCg_dV;
542 Eigen::Vector3d mCg_F;
599 mutable Eigen::Vector3d
mW;
602 mutable Eigen::Vector3d
mX;
605 mutable Eigen::Vector3d
mV;
611 Eigen::Vector3d mAlpha;
614 Eigen::Vector3d mBeta;
617 mutable Eigen::Vector3d
mA;
626 mutable double mImplicitPsi;
632 mutable double mImplicitPi;
677 bool needsPartialAccelerationUpdate()
const;
679 void clearTransformNotice();
680 void clearVelocityNotice();
681 void clearPartialAccelerationNotice();
682 void clearAccelerationNotice();
684 void dirtyTransform()
override;
685 void dirtyVelocity()
override;
686 void dirtyAcceleration()
override;
689 const std::string& setName(
const std::string& _name)
override;
692 const std::string& getName()
const override;
697 bool mNeedPartialAccelerationUpdate;
706 #endif // DART_DYNAMICS_POINTMASS_HPP_ const Eigen::Vector3d & getBodyVelocity() const
The number of the generalized coordinates by which this node is affected.
Definition: PointMass.cpp:690
State(const Eigen::Vector3d &positions=Eigen::Vector3d::Zero(), const Eigen::Vector3d &velocities=Eigen::Vector3d::Zero(), const Eigen::Vector3d &accelerations=Eigen::Vector3d::Zero(), const Eigen::Vector3d &forces=Eigen::Vector3d::Zero())
Default constructor.
Definition: PointMass.cpp:51
Eigen::Vector3d mDelV
Velocity change due to constraint impulse.
Definition: PointMass.hpp:648
Eigen::Vector3d mFext
External force.
Definition: PointMass.hpp:638
std::vector< std::size_t > mDependentGenCoordIndices
A increasingly sorted list of dependent dof indices.
Definition: PointMass.hpp:641
Eigen::Vector3d mAccelerationsDeriv
Derivatives w.r.t. an arbitrary scalr variable.
Definition: PointMass.hpp:574
virtual ~PointMass()
Default destructor.
Definition: PointMass.cpp:178
const Eigen::Vector3d & getPartialAccelerations() const
Get the Eta term of this PointMass.
Definition: PointMass.cpp:421
The Subject class is a base class for any object that wants to report when it gets destroyed...
Definition: Subject.hpp:57
Eigen::Vector3d mPositions
Position.
Definition: PointMass.hpp:59
Eigen::Vector3d mAccelerations
Generalized acceleration.
Definition: PointMass.hpp:65
void setColliding(bool _isColliding)
Set whether this point mass is colliding with other objects.
Definition: PointMass.cpp:282
Eigen::Vector3d mForceLowerLimits
Min value allowed.
Definition: PointMass.hpp:113
Eigen::Vector3d mForces
Generalized force.
Definition: PointMass.hpp:68
SoftBodyNode represent a soft body that has one deformable skin.
Definition: SoftBodyNode.hpp:45
Properties for each PointMass.
Definition: PointMass.hpp:83
Eigen::Vector3d mW
Current position viewed in world frame.
Definition: PointMass.hpp:599
void updateArtInertiaFD(double _timeStep) const
Update articulated body inertia.
Definition: PointMass.cpp:787
Eigen::Vector3d mV
Current velocity viewed in parent soft body node frame.
Definition: PointMass.hpp:605
void updateConstrainedTermsFD(double _timeStep)
Update constrained terms due to the constraint impulses.
Definition: PointMass.cpp:952
std::size_t mIndex
Index of this PointMass within the SoftBodyNode.
Definition: PointMass.hpp:553
PointMass(SoftBodyNode *_softBodyNode)
Constructor used by SoftBodyNode.
Definition: PointMass.cpp:141
Eigen::Vector3d mImpAlpha
Cache data for mImpB.
Definition: PointMass.hpp:655
SoftBodyNode * mParentSoftBodyNode
SoftBodyNode that this PointMass belongs to.
Definition: PointMass.hpp:550
Entity class is a base class for any objects that exist in the kinematic tree structure of DART...
Definition: Entity.hpp:60
Eigen::Matrix< double, 3, Eigen::Dynamic > getBodyJacobian()
Definition: PointMass.cpp:632
Eigen::Vector3d getWorldVelocity() const
Get the generalized velocity at the position of this point mass where the velocity is expressed in th...
Definition: PointMass.cpp:698
Eigen::Vector3d mX
Current position viewed in parent soft body node frame.
Definition: PointMass.hpp:602
State & getState()
State of this PointMass.
Definition: PointMass.cpp:184
void updateVelocityChangeFD()
Update body velocity change.
Definition: PointMass.cpp:917
Definition: Aspect.cpp:40
Eigen::Vector3d getWorldAcceleration() const
Get the generalized acceleration at the position of this point mass where the acceleration is express...
Definition: PointMass.cpp:712
bool mIsColliding
Whether the node is currently in collision with another node.
Definition: PointMass.hpp:644
Eigen::Vector3d mB
Bias force.
Definition: PointMass.hpp:635
Eigen::Vector3d mVelocityLowerLimits
Min value allowed.
Definition: PointMass.hpp:101
Definition: PointMass.hpp:50
void updateTransmittedForce()
Update body force. Forward dynamics routine.
Definition: PointMass.cpp:884
const Eigen::Vector3d & getBodyVelocityChange() const
Return velocity change due to impulse.
Definition: PointMass.cpp:659
void updateBiasForceFD(double _dt, const Eigen::Vector3d &_gravity)
Update bias force associated with the articulated body inertia.
Definition: PointMass.cpp:823
void updateJointForceID(double _timeStep, double _withDampingForces, double _withSpringForces)
Update the joint force. Inverse dynamics routine.
Definition: PointMass.cpp:812
void updateTransmittedImpulse()
Update body force. Impulse-based forward dynamics routine.
Definition: PointMass.cpp:944
void updateTransform() const
Update transformation.
Definition: PointMass.cpp:726
Eigen::Vector3d mImpF
Generalized impulsive body force w.r.t. body frame.
Definition: PointMass.hpp:661
Eigen::Vector3d mX0
Resting position viewed in the parent SoftBodyNode frame.
Definition: PointMass.hpp:86
void updateTransmittedForceID(const Eigen::Vector3d &_gravity, bool _withExternalForces=false)
Update body force. Inverse dynamics routine.
Definition: PointMass.cpp:769
Eigen::Vector3d mAccelerationLowerLimits
Min value allowed.
Definition: PointMass.hpp:107
double mMass
Mass.
Definition: PointMass.hpp:89
Eigen::Vector3d mPositionLowerLimits
Lower limit of position.
Definition: PointMass.hpp:95
Eigen::Vector3d mVelocities
Generalized velocity.
Definition: PointMass.hpp:62
void updateVelocity() const
Update body velocity.
Definition: PointMass.cpp:739
Eigen::Vector3d mVelocityChanges
Change of generalized velocity.
Definition: PointMass.hpp:588
void updateBiasImpulseFD()
Update bias impulse associated with the articulated body inertia.
Definition: PointMass.cpp:902
void clearConstraintImpulse()
Clear constraint impulse.
Definition: PointMass.cpp:584
bool isColliding()
Return whether this point mass is set to be colliding with other objects.
Definition: PointMass.cpp:288
Eigen::Vector3d mImpBeta
Cache data for mImpB.
Definition: PointMass.hpp:658
Eigen::Vector3d mForcesDeriv
Derivatives w.r.t. an arbitrary scalr variable.
Definition: PointMass.hpp:581
void aggregateExternalForces(Eigen::VectorXd &_Fext)
Aggregate the external forces mFext in the generalized coordinates recursively.
Definition: PointMass.cpp:1082
Eigen::Vector3d mImpB
Impulsive bias force due to external impulsive force exerted on bodies of the parent skeleton...
Definition: PointMass.hpp:652
Eigen::Vector3d mVelocityUpperLimits
Max value allowed.
Definition: PointMass.hpp:104
Eigen::Vector3d mPositionUpperLimits
Upper limit of position.
Definition: PointMass.hpp:98
void addConstraintImpulse(const Eigen::Vector3d &_constImp, bool _isLocal=false)
Add constraint impulse.
Definition: PointMass.cpp:562
Eigen::Vector3d mPositionDeriv
Derivatives w.r.t. an arbitrary scalr variable.
Definition: PointMass.hpp:560
Eigen::Vector3d mAccelerationUpperLimits
upper limit of generalized acceleration
Definition: PointMass.hpp:110
const Eigen::Vector3d & getBodyAcceleration() const
Get the generalized acceleration at the position of this point mass where the acceleration is express...
Definition: PointMass.cpp:704
void addExtForce(const Eigen::Vector3d &_force, bool _isForceLocal=false)
Add linear Cartesian force to this node.
Definition: PointMass.cpp:526
void updateAccelerationFD()
Update body acceleration. Forward dynamics routine.
Definition: PointMass.cpp:864
Eigen::Vector3d getConstraintImpulses() const
Get constraint impulse.
Definition: PointMass.cpp:578
std::vector< std::size_t > mConnectedPointMassIndices
Indices of connected Point Masses.
Definition: PointMass.hpp:92
Eigen::Vector3d mA
Current acceleration viewed in parent body node frame.
Definition: PointMass.hpp:617
State for each PointMass.
Definition: PointMass.hpp:56
void updateAccelerationID() const
Update body acceleration with the partial body acceleration.
Definition: PointMass.cpp:758
Definition: PointMass.hpp:672
Eigen::Vector3d mForceUpperLimits
Max value allowed.
Definition: PointMass.hpp:116
Eigen::Vector3d mEta
Partial Acceleration of this PointMass.
Definition: PointMass.hpp:608
void updatePartialAcceleration() const
Update partial body acceleration due to parent joint's velocity.
Definition: PointMass.cpp:749
Eigen::Vector3d mVelocitiesDeriv
Derivatives w.r.t. an arbitrary scalr variable.
Definition: PointMass.hpp:567
Eigen::Vector3d mConstraintImpulses
Generalized constraint impulse.
Definition: PointMass.hpp:594