/*! * @file ContactConstraint.h * @brief Virtual class of Contact Constraint logic * * To make a child class, you need to implement virtual function, * UpdateExternalForces, UpdateQdot */ #ifndef CONTACT_CONSTRAINT_H #define CONTACT_CONSTRAINT_H #include #include "Collision/Collision.h" #include "Dynamics/FloatingBaseModel.h" #include "Utilities/Utilities_print.h" #include "cppTypes.h" #define CC ContactConstraint /*! * Contact dynamics for a floating base model */ template class ContactConstraint { public: /*! * Construct a contact model for the given floating base model * @param model : FloatingBaseModel for the contact */ ContactConstraint(FloatingBaseModel* model) : _nContact(0), _nCollision(0) { _model = model; for (size_t i(0); i < _model->_nGroundContact; ++i) { _cp_force_list.push_back(Vec3::Zero()); } } virtual ~ContactConstraint() {} /*! * Add collision object * @param collision : collision objects */ void AddCollision(Collision* collision) { _collision_list.push_back(collision); ++_nCollision; } /*! * Add external forces to the floating base model in response to collisions * Used for spring damper based contact constraint method * @param K : Spring constant * @param D : Damping constant * @param dt : time step (sec) */ virtual void UpdateExternalForces(T K, T D, T dt) = 0; /*! * Adjust q_dot on the floating base model in response to collisions * Used for impulse based contact constraint method * @param state : full state of a floating system full state */ virtual void UpdateQdot(FBModelState& state) = 0; /*! * For visualization * @return cp_pos_list : all contact point position in the global frame. */ const vectorAligned>& getContactPosList() { return _cp_pos_list; } /*! * For visualization * @return cp_force_list : all linear contact force described in the global * frame. */ const Vec3& getGCForce(size_t idx) { return _cp_force_list[idx]; } protected: vectorAligned> deflectionRate; void _groundContactWithOffset(T K, T D); size_t _CheckContact(); vectorAligned> _tangentialDeflections; size_t _nContact; size_t _nCollision; FloatingBaseModel* _model; std::vector*> _collision_list; std::vector _idx_list; std::vector _cp_resti_list; std::vector _cp_mu_list; std::vector _cp_penetration_list; vectorAligned> _cp_force_list; // For All contact point w.r.t Global vectorAligned> _cp_local_force_list; vectorAligned> _cp_pos_list; vectorAligned> _cp_frame_list; }; #endif