FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CRigidBody.h
1#ifndef C_RigidBody_H
2#define C_RigidBody_H
3
4#include <fhsim/simobject/SimObject.h>
5
6#include <Eigen/Eigen>
7namespace environment
8{
9class EnvironmentProvider;
10
11}
12namespace rigidbody
13{
14typedef Eigen::Matrix<double, 6, 6> mat6;
15typedef Eigen::Matrix<double, 6, 1> vec6;
16typedef Eigen::Matrix<double, 3, 3> mat3;
17typedef Eigen::Matrix<double, 3, 1> vec3;
18typedef Eigen::Matrix<double, 13, 1> vec13;
19typedef Eigen::Matrix<double, 13, 13> mat13;
20typedef Eigen::Matrix<double, 3, 4> mat34;
21typedef Eigen::Matrix<double, 6, 4> mat64;
22typedef Eigen::Quaternion<double> quat;
23
25{
26 public:
27 virtual ~CRigidBody(){};
28
29 // r: global
30 // q: global
31 // dX: bodylocal
32 // return: bodylocal
33 virtual vec6 GetInternalForces(const vec6& dX, const vec3& r, const quat& q, environment::EnvironmentProvider* environment, double time, const double* states) = 0;
34
39 virtual mat64 GetGravityForceDerivative(const quat& q) = 0;
40
41 // return: bodylocal
42 virtual mat6 GetInertiaMatrix(const vec3& r, double time, const double* states, environment::EnvironmentProvider* environment) = 0;
43
44 // all global coords
45 vec13 GetSecondDerivative(const vec3& r, const quat& q, const vec3& v, const vec3 w, const vec6& externalForces, environment::EnvironmentProvider* environment, double time, const double* states);
46
55 mat13 GetSecondDerivativeJacobian(const vec3& r, const quat& q, const vec3& v, const vec3& w, const vec6& externalForces, environment::EnvironmentProvider* environment, double time, const double* states);
56
60 void WriteStateJacobian(const double* X, int positionIndex, int quaterIndex, int velocityIndex, int omegaIndex, const vec6& externalForces, environment::EnvironmentProvider* environment, double time, double* J, int nStates);
61
62 // bodylocal coords
63 static vec6 GetCoriolisForce(const vec6& dX, const mat6& Inertia);
65 static mat6 GetCoriolisForceDerivative(const vec6& dX, const mat6& Inertia);
66
67
68#ifdef FH_VISUALIZATION
69 virtual void DrawBody(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr) = 0;
70#endif
71
72 //static mat6 reorientInertiaRotateTranslate(const mat6& Inertia, const vec6& orientation);
73 static mat6 ReorientInertiaTranslateRotate(const mat6& Inertia, const vec6& orientation);
74 static mat3 MakeDyadic(const vec3& vector);
75 static mat34 RotationDerivative(const quat& q, const vec3& x);
76 static mat34 ConjugateRotationDerivative(const quat& q, const vec3& x);
77 static mat3 GetRotation(const vec3& angle);
78 static mat6 GetRotation6(const vec3& angle);
79
80 private:
82 vec6 GetBodyAcceleration(const vec3& r, const quat& q, const vec6& dX, const vec6& bodyExternalForces, const mat6& Inertia, environment::EnvironmentProvider* environment, double time, const double* states);
83 static vec6 RotateToBody(const quat& q, const vec6& globalVector);
84 static mat6 GetCoriolisMatrix(const vec6& dX);
85};
86}; // namespace rigidbody
87#endif
Definition CRigidBody.h:25
static mat6 GetCoriolisForceDerivative(const vec6 &dX, const mat6 &Inertia)
d(GetCoriolisForce)/d(dX) at a fixed inertia matrix, bodylocal.
void WriteStateJacobian(const double *X, int positionIndex, int quaterIndex, int velocityIndex, int omegaIndex, const vec6 &externalForces, environment::EnvironmentProvider *environment, double time, double *J, int nStates)
mat13 GetSecondDerivativeJacobian(const vec3 &r, const quat &q, const vec3 &v, const vec3 &w, const vec6 &externalForces, environment::EnvironmentProvider *environment, double time, const double *states)
virtual mat64 GetGravityForceDerivative(const quat &q)=0