Program Listing for File LoopConstraintBase.h#
↰ Return to documentation for file (include/Karana/SOADyn/LoopConstraintBase.h)
/*
*Copyright(c)2024-2026KaranaDynamicsPtyLtd.Allrightsreserved.
*
*NOTICETOUSER:
*
*Thissourcecodeand/ordocumentation(the"LicensedMaterials")is
*theconfidentialandproprietaryinformationofKaranaDynamicsInc.
*UseoftheseLicensedMaterialsisgovernedbythetermsandconditions
*ofaseparatesoftwarelicenseagreementbetweenKaranaDynamicsandthe
*Licensee("LicenseAgreement").Unlessexpresslypermittedunderthat
*agreement,anyreproduction,modification,distribution,ordisclosure
*oftheLicensedMaterials,inwholeorinpart,toanythirdparty
*withoutthepriorwrittenconsentofKaranaDynamicsisstrictlyprohibited.
*
*THELICENSEDMATERIALSAREPROVIDED"ASIS"WITHOUTWARRANTYOFANYKIND.
*KARANADYNAMICSDISCLAIMSALLWARRANTIES,EXPRESSORIMPLIED,INCLUDING
*BUTNOTLIMITEDTOWARRANTIESOFMERCHANTABILITY,NON-INFRINGEMENT,AND
*FITNESSFORAPARTICULARPURPOSE.
*
*INNOEVENTSHALLKARANADYNAMICSBELIABLEFORANYDAMAGESWHATSOEVER,
*INCLUDINGBUTNOTLIMITEDTOLOSSOFPROFITS,DATA,ORUSE,EVENIF
*ADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGES,WHETHERINCONTRACT,TORT,
*OROTHERWISEARISINGOUTOFORINCONNECTIONWITHTHELICENSEDMATERIALS.
*
*U.S.GovernmentEndUsers:TheLicensedMaterialsarea"commercialitem"
*asdefinedat48C.F.R.2.101,andareprovidedtotheU.S.Government
*onlyasacommercialenditemunderthetermsofthislicense.
*
*AnyuseoftheLicensedMaterialsinindividualorcommercialsoftwaremust
*include,intheuserdocumentationandinternalsourcecodecomments,
*thisNotice,Disclaimer,andU.S.GovernmentUseProvision.
*/
#pragmaonce
#include"Karana/SOADyn/CoordinateConstraint.h"
namespaceKarana::Dynamics{
classMultibody;
classHingePnode;
classConstraintNode;
classPhysicalHinge;
classLoopConstraintBase:publicBilateralConstraintBase{
//foraccessto_sourceParentPnode
friendclassSubGraph;
//foraccessto_error_f2f
friendclassMultibody;
//foraccesstoresidualmethodsfortheTAalgorithm
friendclassAlgorithms;
public:
LoopConstraintBase(std::string_viewname,
kc::ks_ptr<Multibody>&mb,
kc::ks_ptr<kf::FrameToFrame>constraint_f2f);
kc::ks_ptr<kf::FrameToFrame>constraintFrameToFrame()const{return_constraint_f2f;}
virtualboolhasHinge()const{returnfalse;}
virtualboolconstrainsQ()const{returntrue;}
kc::ks_ptr<ConstraintNode>sourceNode()const{return_source_node;}
kc::ks_ptr<ConstraintNode>targetNode()const{return_target_node;}
protected:
void_lambda2ConstraintForces(constkm::Vec&lambda)const;
public:
structQMats{
public:
km::Matsource_Q;//NOLINT(readability-identifier-naming)
km::Mattarget_Q;//NOLINT(readability-identifier-naming)
km::Matrel_Q;//NOLINT(readability-identifier-naming)
public:
voidresize(size_tn_c){
source_Q.resize(n_c,6);
target_Q.resize(n_c,6);
rel_Q.resize(n_c,6);
}
};
constQMats&getQMats()const{return_matsQ_cache->get();}
protected:
void_discard(kc::ks_ptr<Base>&base)override;
virtualvoid_computeQMats(QMats&val);
kc::ks_ptr<kf::FrameToFrame>_constraint_f2f;
kc::ks_ptr<ConstraintNode>_source_node=nullptr;
kc::ks_ptr<ConstraintNode>_target_node=nullptr;
kc::ks_ptr<kc::DataCache<QMats>>_matsQ_cache=nullptr;
private:
};
classLoopConstraintConVel:publicLoopConstraintBase{
//foraccessto_accelResidual
friendclassAlgorithms;
public:
staticconstkc::ks_ptr<LoopConstraintConVel>
create(std::string_viewname,
kc::ks_ptr<Multibody>&mb,
kc::ks_ptr<kf::FrameToFrame>constraint_f_to_f);
LoopConstraintConVel(std::string_viewname,
kc::ks_ptr<Multibody>&mb,
kc::ks_ptr<kf::FrameToFrame>constraint_f2f);
boolconstrainsQ()constoverride{returnfalse;}
size_tnResiduals()constoverride;
km::VecposeError()constoverride;
voidsetInput(doublevel,doubleaccel);
voidsetUnitAxis(constkm::Vec&axis,boolis_rotational);
constkm::Vec3&getUnitAxis()const;
boolisRotational()const;
boolisReady()constoverride;
km::VecvelError()constoverride;
km::VecaccelError()constoverride;
protected:
void_computeQMats(QMats&val)override;
km::Vec_poseResidual()constoverride;
km::Vec_velResidual()constoverride;
km::Vec_accelResidual()constoverride;
private:
km::Vec3_unit_axis;
bool_is_rotational=true;
double_input_vel=0;
double_input_accel=0;
};
}//namespaceKarana::Dynamics