9#include <fhsim/simobject/SimObject.h>
14class EnvironmentProvider;
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;
38 virtual vec6 GetInternalForces(
const vec6& dX,
const vec3& r,
const quat& q, environment::EnvironmentProvider* environment,
double time,
const double* states) = 0;
47 virtual mat6 GetInertiaMatrix(
const vec3& r,
double time,
const double* states, environment::EnvironmentProvider* environment) = 0;
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);
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);
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);
70 static vec6 GetCoriolisForce(
const vec6& dX,
const mat6& Inertia);
75#ifdef FH_VISUALIZATION
76 virtual void DrawBody(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr) = 0;
80 static mat6 ReorientInertiaTranslateRotate(
const mat6& Inertia,
const vec6& orientation);
81 static mat3 MakeDyadic(
const vec3& vector);
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);
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);
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