20 #ifndef _RIGID_BODY_H_
21 #define _RIGID_BODY_H_
23 #include "mbsim/body.h"
24 #include "mbsim/functions/auxiliary_functions.h"
26 #ifdef HAVE_OPENMBVCPPINTERFACE
27 #include "mbsim/utils/boost_parameters.h"
28 #include "mbsim/utils/openmbv_utils.h"
35 class FixedRelativeFrame;
36 class CompoundContour;
68 constraint = constraint_;
71 virtual void updatedq(
double t,
double dt);
72 virtual void updateqd(
double t);
73 virtual void updateT(
double t);
74 virtual void updateh(
double t,
int j=0);
75 virtual void updatehInverseKinetics(
double t,
int j=0);
76 virtual void updateStateDerivativeDependentVariables(
double t);
77 virtual void updateM(
double t,
int i=0) { (this->*
updateM_)(t,i); }
78 virtual void updateStateDependentVariables(
double t) {
82 virtual void updateJacobians(
double t,
int j=0) { (this->*updateJacobians_[j])(t); }
83 void updateJacobians0(
double t) {
87 void updateJacobians1(
double t) {
88 updateJacobiansForRemainingFramesAndContours1(t);
90 virtual void calcqSize();
91 virtual void calcuSize(
int j=0);
103 virtual std::string
getType()
const {
return "RigidBody"; }
104 virtual void plot(
double t,
double dt=1);
126 virtual void updateJacobiansForRemainingFramesAndContours1(
double t);
137 fPrPK->setParent(
this);
138 fPrPK->setName(
"GeneralTranslation");
154 void setTranslation(Function<fmatvec::Vec3(fmatvec::VecV,
double)> *fPrPK_) {
setGeneralTranslation(fPrPK_); }
165 fAPK->setParent(
this);
166 fAPK->setName(
"GeneralRotation");
178 void setRotation(Function<fmatvec::RotMat3(fmatvec::VecV,
double)>* fAPK_) {
setGeneralRotation(fAPK_); }
182 void setTranslationDependentRotation(
bool dep) { translationDependentRotation = dep; }
196 void setMass(
double m_) {
m = m_; }
197 double getMass()
const {
return m; }
198 FixedRelativeFrame* getFrameForKinematics() {
return K; };
199 FixedRelativeFrame* getFrameC() {
return C; };
207 const fmatvec::SymMat3& getInertiaTensor()
const {
return SThetaS;}
208 fmatvec::SymMat3& getInertiaTensor() {
return SThetaS;}
210 void addFrame(FixedRelativeFrame *
frame);
219 void setFrameForInertiaTensor(Frame *
frame);
221 #ifdef HAVE_OPENMBVCPPINTERFACE
222 void setOpenMBVRigidBody(
const boost::shared_ptr<OpenMBV::RigidBody> &body);
223 void setOpenMBVFrameOfReference(Frame *
frame) {openMBVFrame=
frame; }
224 const Frame* getOpenMBVFrameOfReference()
const {
return openMBVFrame; }
227 BOOST_PARAMETER_MEMBER_FUNCTION( (
void), enableOpenMBVWeight, tag, (optional (scaleLength,(
double),1)(scaleSize,(
double),1)(referencePoint,(OpenMBV::Arrow::ReferencePoint),OpenMBV::Arrow::toPoint)(diffuseColor,(
const fmatvec::Vec3&),
"[-1;1;1]")(transparency,(
double),0))) {
228 OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
229 FWeight=ombv.createOpenMBV();
233 BOOST_PARAMETER_MEMBER_FUNCTION( (
void), enableOpenMBVJointForce, tag, (optional (scaleLength,(
double),1)(scaleSize,(
double),1)(referencePoint,(OpenMBV::Arrow::ReferencePoint),OpenMBV::Arrow::toPoint)(diffuseColor,(
const fmatvec::Vec3&),
"[-1;1;1]")(transparency,(
double),0))) {
234 OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
235 FArrow=ombv.createOpenMBV();
239 BOOST_PARAMETER_MEMBER_FUNCTION( (
void), enableOpenMBVJointMoment, tag, (optional (scaleLength,(
double),1)(scaleSize,(
double),1)(referencePoint,(OpenMBV::Arrow::ReferencePoint),OpenMBV::Arrow::toPoint)(diffuseColor,(
const fmatvec::Vec3&),
"[-1;1;1]")(transparency,(
double),0))) {
240 OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
241 MArrow=ombv.createOpenMBV();
245 virtual void initializeUsingXML(xercesc::DOMElement *element);
246 virtual xercesc::DOMElement* writeXMLFile(xercesc::DOMNode *element);
248 virtual void updatePositionAndOrientationOfFrame(
double t, Frame *P);
249 virtual void updateAccelerations(
double t, Frame *P);
250 virtual void updateRelativeJacobians(
double t, Frame *P);
251 virtual void updateRelativeJacobians(
double t, Frame *P, fmatvec::Mat3xV &WJTrel, fmatvec::Mat3xV &WJRrel);
252 const fmatvec::Mat3xV& getWJTrel()
const {
return WJTrel;}
253 const fmatvec::Mat3xV& getWJRrel()
const {
return WJRrel;}
254 fmatvec::Mat3xV& getWJTrel() {
return WJTrel;}
255 fmatvec::Mat3xV& getWJRrel() {
return WJRrel;}
263 fmatvec::Mat3xV& getPJT(
int i=0) {
return PJT[i];}
264 fmatvec::Mat3xV& getPJR(
int i=0) {
return PJR[i];}
266 int getqRelSize()
const {
return nq;}
267 int getuRelSize(
int i=0)
const {
return nu[i];}
269 bool transformCoordinates()
const {
return fTR!=NULL;}
294 fmatvec::Vec3 PjhT, PjhR, PjbT, PjbR;
311 Function<fmatvec::MatV(fmatvec::VecV)> *fTR;
316 Function<fmatvec::Vec3(fmatvec::VecV, double)> *
fPrPK;
321 Function<fmatvec::RotMat3(fmatvec::VecV, double)> *
fAPK;
353 void (
RigidBody::*updateJacobians_[2])(
double t);
365 fmatvec::VecV qTRel, qRRel, uTRel, uRRel;
366 fmatvec::Mat3xV WJTrel, WJRrel, PJTT, PJRR;
370 Frame *frameForJacobianOfRotation;
372 std::vector<FixedRelativeFrame*> RBF;
373 std::vector<CompoundContour*> RBC;
375 Frame *frameForInertiaTensor;
379 bool translationDependentRotation, constJT, constJR, constjT, constjR;
381 fmatvec::Vec3 WF, WM;
384 #ifdef HAVE_OPENMBVCPPINTERFACE
388 Frame * openMBVFrame;
389 boost::shared_ptr<OpenMBV::Arrow> FWeight, FArrow, MArrow;
void setInertiaTensor(const fmatvec::SymMat3 &RThetaR)
Definition: rigid_body.h:205
void facLLMConst(int i=0)
Cholesky decomposition of constant mass matrix.
Definition: rigid_body.h:346
void(RigidBody::* updateM_)(double t, int i)
function pointer to update mass matrix
Definition: rigid_body.h:326
void facLLMNotConst(int i=0)
Cholesky decomposition of time dependent mass matrix.
Definition: rigid_body.h:351
void setGeneralTranslation(Function< fmatvec::Vec3(fmatvec::VecV, double)> *fPrPK_)
set Kinematic for genral translational motion
Definition: rigid_body.h:135
void setFrameForKinematics(Frame *frame)
Definition: rigid_body.cc:69
Function< fmatvec::RotMat3(fmatvec::VecV, double)> * getRotation()
get Kinematic for rotational motion
Definition: rigid_body.h:194
void setStateDependentRotation(Function< fmatvec::RotMat3(fmatvec::VecV)> *fAPK_)
set Kinematic for only state dependent rotational motion
Definition: rigid_body.h:177
virtual void facLLM(int i=0)
perform Cholesky decomposition of mass martix
Definition: rigid_body.h:98
void(RigidBody::* facLLM_)(int i)
function pointer for Cholesky decomposition of mass matrix
Definition: rigid_body.h:341
virtual void updateuRef(const fmatvec::Vec &ref)
references to velocities of dynamic system parent
Definition: rigid_body.cc:544
void updateMConst(double t, int i=0)
update constant mass matrix
Definition: rigid_body.cc:559
double m
mass
Definition: rigid_body.h:275
cartesian frame on rigid bodies
Definition: frame.h:187
virtual void plot(double t, double dt=1)
plots time dependent data
Definition: rigid_body.cc:355
void updateMNotConst(double t, int i=0)
update time dependend mass matrix
Definition: rigid_body.cc:563
fmatvec::Mat3xV PJT[2]
Definition: body.h:173
virtual std::string getType() const
Definition: rigid_body.h:103
bool coordinateTransformation
boolean to use body fixed Frame for rotation
Definition: rigid_body.h:292
virtual void setUpInverseKinetics()
TODO.
Definition: rigid_body.cc:342
Function< fmatvec::Vec3(fmatvec::VecV, double)> * getTranslation()
get Kinematic for translational motion
Definition: rigid_body.h:189
void setStateDependentTranslation(Function< fmatvec::Vec3(fmatvec::VecV)> *fPrPK_)
set Kinematic for only state dependent translational motion
Definition: rigid_body.h:151
virtual void updateqRef(const fmatvec::Vec &ref)
references to positions of dynamic system parent
Definition: rigid_body.cc:539
InitStage
The stages of the initialization.
Definition: element.h:97
virtual ~RigidBody()
destructor
Definition: rigid_body.cc:63
FixedRelativeFrame * C
Definition: rigid_body.h:356
fmatvec::SymMat3 SThetaS
inertia tensor with respect to centre of gravity in centre of gravity and world Frame ...
Definition: rigid_body.h:280
void setGeneralRotation(Function< fmatvec::RotMat3(fmatvec::VecV, double)> *fAPK_)
set Kinematic for general rotational motion
Definition: rigid_body.h:163
fmatvec::SqrMat3 APK
rotation matrix from kinematic Frame to parent Frame
Definition: rigid_body.h:299
std::string name
name of element
Definition: element.h:290
std::vector< Frame * > frame
vector of frames and contours
Definition: body.h:162
Class for constraints between generalized coordinates of objects.
Definition: constraint.h:39
cartesian frame on bodies used for application of e.g. links and loads
Definition: frame.h:39
Function< fmatvec::RotMat3(fmatvec::VecV, double)> * fAPK
rotation from kinematic Frame to parent Frame
Definition: rigid_body.h:321
virtual void updateJacobiansForRemainingFramesAndContours(double t, int j=0)
updates remaining JACOBIANS for kinematics starting with and from cog Frame
Definition: rigid_body.cc:518
virtual void updateKinematicsForRemainingFramesAndContours(double t)
updates kinematics for remaining Frames starting with and from cog Frame
Definition: rigid_body.cc:504
virtual void initz()
Definition: rigid_body.cc:333
virtual void updateKinematicsForSelectedFrame(double t)
updates kinematics of kinematic Frame starting from reference Frame
Definition: rigid_body.cc:424
virtual void addContour(Contour *contour)
Definition: body.cc:140
RigidBody(const std::string &name="")
constructor
Definition: rigid_body.cc:50
virtual void updateJacobiansForSelectedFrame0(double t)
updates JACOBIAN for kinematics starting from reference Frame
Definition: rigid_body.cc:466
Function< fmatvec::Vec3(fmatvec::VecV, double)> * fPrPK
translation from parent Frame to kinematic Frame in parent system
Definition: rigid_body.h:316
fmatvec::Vec3 WvPKrel
translational and angular velocity from parent to kinematic Frame in world system ...
Definition: rigid_body.h:309
fmatvec::SymMat Mbuf
TODO.
Definition: rigid_body.h:287
void setTimeDependentRotation(Function< fmatvec::RotMat3(double)> *fAPK_)
set Kinematic for only time dependent rotational motion
Definition: rigid_body.h:172
fmatvec::Vec3 PrPK
translation from parent to kinematic Frame in parent and world system
Definition: rigid_body.h:304
void setTimeDependentTranslation(Function< fmatvec::Vec3(double)> *fPrPK_)
set Kinematic for only time dependent translational motion
Definition: rigid_body.h:144
virtual void init(InitStage stage)
initialize object at start of simulation with respect to contours and frames
Definition: rigid_body.cc:107
base class for all mechanical bodies with mass and generalised coordinates
Definition: body.h:52
rigid bodies with arbitrary kinematics
Definition: rigid_body.h:53
virtual void facLLM(int i=0)
perform Cholesky decomposition of mass martix
Definition: object.h:217