FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CRigidBody.h
1#ifndef C_RigidBody_H
2#define C_RigidBody_H
3
9#include <fhsim/simobject/SimObject.h>
10
11#include <Eigen/Eigen>
12namespace environment
13{
14class EnvironmentProvider;
15
16}
17namespace rigidbody
18{
19typedef Eigen::Matrix<double, 6, 6> mat6;
20typedef Eigen::Matrix<double, 6, 1> vec6;
21typedef Eigen::Matrix<double, 3, 3> mat3;
22typedef Eigen::Matrix<double, 3, 1> vec3;
23typedef Eigen::Matrix<double, 13, 1> vec13;
24typedef Eigen::Matrix<double, 13, 13> mat13;
25typedef Eigen::Matrix<double, 3, 4> mat34;
26typedef Eigen::Matrix<double, 6, 4> mat64;
27typedef Eigen::Quaternion<double> quat;
28
30{
31 public:
32 virtual ~CRigidBody(){};
33
34 // r: global
35 // q: global
36 // dX: bodylocal
37 // return: bodylocal
38 virtual vec6 GetInternalForces(const vec6& dX, const vec3& r, const quat& q, environment::EnvironmentProvider* environment, double time, const double* states) = 0;
39
44 virtual mat64 GetGravityForceDerivative(const quat& q) = 0;
45
46 // return: bodylocal
47 virtual mat6 GetInertiaMatrix(const vec3& r, double time, const double* states, environment::EnvironmentProvider* environment) = 0;
48
49 // all global coords
52 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);
53
62 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);
63
67 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);
68
69 // bodylocal coords
70 static vec6 GetCoriolisForce(const vec6& dX, const mat6& Inertia);
72 static mat6 GetCoriolisForceDerivative(const vec6& dX, const mat6& Inertia);
73
74
75#ifdef FH_VISUALIZATION
76 virtual void DrawBody(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr) = 0;
77#endif
78
79 //static mat6 reorientInertiaRotateTranslate(const mat6& Inertia, const vec6& orientation);
80 static mat6 ReorientInertiaTranslateRotate(const mat6& Inertia, const vec6& orientation);
81 static mat3 MakeDyadic(const vec3& vector);
82
84 static constexpr double kQuaterConvergenceTime = 0.01;
86 static constexpr double QuaterCorrectionRate() { return 1.0 / (2.0 * kQuaterConvergenceTime); }
87 static mat34 RotationDerivative(const quat& q, const vec3& x);
88 static mat34 ConjugateRotationDerivative(const quat& q, const vec3& x);
89 static mat3 GetRotation(const vec3& angle);
90 static mat6 GetRotation6(const vec3& angle);
91
92 private:
94 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);
95 static vec6 RotateToBody(const quat& q, const vec6& globalVector);
96 static mat6 GetCoriolisMatrix(const vec6& dX);
97};
98}; // namespace rigidbody
99#endif
Definition CRigidBody.h:30
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)
static constexpr double kQuaterConvergenceTime
Time constant [s] with which the norm feedback of GetSecondDerivative drives |q| towards 1 (the defau...
Definition CRigidBody.h:84
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)
static constexpr double QuaterCorrectionRate()
1 / (2 tau), the gain of the norm feedback (1 - |q|^2) q.
Definition CRigidBody.h:86
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)
virtual mat64 GetGravityForceDerivative(const quat &q)=0