443#include <fhsim/simobject/SimObject.h>
444#include <fhsim_environment/EnvironmentProvider.h>
447class PrintDuringExec;
470enum class AuvRudderPlane
482 double pos[3] = {-0.85, 0.0, 0.0};
486class Auv :
public SimObject
489 Auv(std::string simObjectName, ISimObjectCreator* creator);
500 void OdeFcn(
const double dT,
const double*
const adX,
double*
const adXDot)
const override;
541 void OdeJacobian(
double T,
const double* X,
double* J,
int nStates)
override;
542 int GetJacobianSparsity(
int nStates,
int* rowPtr,
int* colIdx)
override;
594 void InputPortJacobian(
const std::string& portName,
double T,
const double* X,
595 double* dF_dInput,
int portSize,
int nStates)
override;
596 void OutputPortJacobian(
const std::string& portName,
double T,
const double* X,
597 double* dPort_dX,
int portSize,
int nStates,
int index)
override;
600 void FinalSetup(
const double dT,
const double*
const adX, ISimObjectCreator*
const creator)
override;
654 double axialDragCoeff,
double wrench_d[6]);
699 double rho,
double crossFlowDragCoeff,
int sectionCount,
const double* sectionX,
700 const double* sectionDiameter,
const double* sectionLength,
double wrench_d[6]);
733 int sectionCount,
const double* sectionX,
const double* sectionDiameter,
734 const double* sectionLength,
double wrench_d[6],
double (*dWrench_dVelocity)[6] =
nullptr);
774 static void RudderWrench(AuvRudderPlane plane,
const double relVel_d[3],
const double omega_d[3],
808 double dWrench_dVelocity[6][6],
double dWrench_dDeflection[6]);
810#ifdef FH_VISUALIZATION
822 void RenderInit(Ogre::Root*
const ogreRoot, ISimObjectCreator*
const creator)
override;
834 void RenderUpdate(
const double dT,
const double*
const adX)
override;
880 virtual double ComputeThrust(
double propulsionPower,
double surgeSpeed)
const;
889 virtual void CalcOutput(
const double dT,
const double*
const adX);
896 const double* OutPos(
const double dT,
const double*
const adX);
897 const double* OutVel(
const double dT,
const double*
const adX);
898 const double* OutQuater(
const double dT,
const double*
const adX);
899 const double* OutEuler(
const double dT,
const double*
const adX);
900 const double* OutHeading(
const double dT,
const double*
const adX);
901 const double* OutPitch(
const double dT,
const double*
const adX);
902 const double* OutDepth(
const double dT,
const double*
const adX);
903 const double* OutSpeed(
const double dT,
const double*
const adX);
904 const double* OutAltitude(
const double dT,
const double*
const adX);
905 const double* OutSeaDepth(
const double dT,
const double*
const adX);
906 const double* OutBattery(
const double dT,
const double*
const adX);
907 const double* OutBatteryFraction(
const double dT,
const double*
const adX);
908 const double* OutThrust(
const double dT,
const double*
const adX);
983 return static_cast<int>(globalStateIndex -
m_IStateBase);
988 double ma_mdR[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
1014#ifdef FH_VISUALIZATION
1025 double HullRadiusAt(
double bodyX)
const;
1031 void BuildHullSurface(Ogre::ManualObject*
const hull)
const;
1043 void BuildFinPlane(Ogre::ManualObject*
const fins, AuvRudderPlane plane)
const;
1045 Ogre::SceneManager* m_sceneMgr =
nullptr;
1046 Ogre::SceneNode* m_renderNode =
nullptr;
1047 Ogre::SceneNode* m_diveFinNode =
nullptr;
1048 Ogre::SceneNode* m_yawFinNode =
nullptr;
1049 Ogre::ManualObject* m_hullObject =
nullptr;
1050 Ogre::ManualObject* m_diveFinObject =
nullptr;
1051 Ogre::ManualObject* m_yawFinObject =
nullptr;
double ma_dCommandedPower
The commanded propulsion power of the current derivative evaluation, W, before the clamp.
Definition Auv.h:998
double ma_dRudderYaw
The commanded yaw-plane deflection of the current derivative evaluation, rad, before the clamp.
Definition Auv.h:1000
static AuvHullProperties HullPropertiesOf(double length, double diameter, double averageDensity)
double m_maxPropulsionPower
The largest propulsion power accepted, W.
Definition Auv.h:923
virtual void AddRudderForces(const double dT, const double *const adX)
Adds the wrench of both fin planes, and caches the two commanded deflections.
const double * ma_adXPos_n
The NED position state.
Definition Auv.h:991
static double RollDampingMoment(double rollRate, double linear, double quadratic)
double m_length
The hull length, m. Kept because the visualisation draws it.
Definition Auv.h:912
double m_sectionX[kSectionCount]
The body-frame x of each section centroid, m.
Definition Auv.h:930
double m_outThrust
Thrust along body x, N.
Definition Auv.h:1012
double ma_adSumForces[6]
Body-frame force in [0..2] and moment about the origin in [3..5].
Definition Auv.h:987
unsigned long m_IStateQuater
Global index of the attitude quaternion state.
Definition Auv.h:968
double m_sectionDiameter[kSectionCount]
The cross-flow diameter of each section, m.
Definition Auv.h:931
static void RudderWrench(AuvRudderPlane plane, const double relVel_d[3], const double omega_d[3], double deflection, const AuvRudderProperties &rudder, double wrench_d[6])
virtual void CalcDerivatives(double *const adXDot)
Turns the accumulated wrench into the state derivatives.
double m_massInverse[6][6]
The inverse of the constant mass matrix.
Definition Auv.h:915
static double SubmergedFraction(double axisDepth, double radius)
double m_sectionLength[kSectionCount]
The length of each section, m.
Definition Auv.h:932
static void CrossFlowStripWrench(const double relVel_d[3], const double omega_d[3], double rho, double crossFlowDragCoeff, int sectionCount, const double *sectionX, const double *sectionDiameter, const double *sectionLength, double wrench_d[6])
double AuthorityCheckCruiseSpeed() const
The forward speed the dive-authority check assumes, from this vehicle's own parameters.
unsigned long m_IStateLocalVel
Global index of the body-frame velocity state.
Definition Auv.h:969
void CalcOutputCommon(const double dT, const double *const adX) const
Trampoline registered as the common computation of every output port.
double m_crossFlowDragCoeff
The two-dimensional cross-flow drag coefficient of a section.
Definition Auv.h:929
const double * ma_adXQuater
The attitude quaternion state.
Definition Auv.h:992
double m_cOG[3]
The centre of gravity in the body frame, m.
Definition Auv.h:914
static void RudderWrenchJacobian(AuvRudderPlane plane, const double relVel_d[3], const double omega_d[3], double deflection, const AuvRudderProperties &rudder, double dWrench_dVelocity[6][6], double dWrench_dDeflection[6])
double m_outPos[3]
Position in NED, m.
Definition Auv.h:1003
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Calculates the state derivatives.
double m_rigidInertia[6]
The diagonal of the rigid-body mass matrix.
Definition Auv.h:916
ICommonComputation * m_commonCalc
Shared recomputation behind every output port.
Definition Auv.h:949
double ma_dRudderDive
The commanded dive-plane deflection of the current derivative evaluation, rad, before the clamp.
Definition Auv.h:999
double ma_adXVel_n[3]
The velocity of the origin in NED, m/s.
Definition Auv.h:989
ISignalPort * m_inRudderDive
Commanded dive-plane fin deflection, rad.
Definition Auv.h:946
ISignalPort * m_inExternalForce
An external force in NED, N.
Definition Auv.h:947
double ClampedPropulsionPower(double commandedPower) const
Clamps a commanded power to the range the thruster accepts, [0, MaxPropulsionPower].
double m_initialBattery
The battery energy at the start of the mission, J.
Definition Auv.h:919
ISignalPort * m_inThrustPower
Commanded propulsion power, W.
Definition Auv.h:944
double m_outVel[3]
Velocity in NED, m/s.
Definition Auv.h:1004
virtual void AddThrustForces(const double dT, const double *const adX)
Adds the thruster wrench and caches the propulsion power the battery pays for.
double m_rollDampingQuadratic
The quadratic roll damping, N·m·s².
Definition Auv.h:934
virtual void AddExternalForces(const double dT, const double *const adX)
Adds the ExternalForce input port, at the body origin.
double m_outSpeed
Forward speed through the water, m/s.
Definition Auv.h:1008
double m_outQuater[4]
Attitude quaternion.
Definition Auv.h:1005
const double * ma_adXOmega
The body-frame angular velocity state.
Definition Auv.h:994
static const int kSectionCount
The number of hull sections the cross-flow strip theory divides the hull into.
Definition Auv.h:657
environment::EnvironmentProvider * m_environment
The shared environment.
Definition Auv.h:940
double m_axialDragCoeff
The hull drag coefficient on the frontal area.
Definition Auv.h:926
virtual void AddInternalForces(const double dT)
Adds the weight at COG and the buoyancy at the origin.
unsigned long m_IStateBattery
Global index of the battery energy state.
Definition Auv.h:971
void WarnIfTheFinsCannotDive(const std::string &simObjectName, double diveAngle) const
unsigned long m_IStatePos
Global index of the NED position state.
Definition Auv.h:967
bool HasJacobians() const override
double m_outBatteryFraction
Remaining battery energy as a fraction of InitialBattery.
Definition Auv.h:1011
static const double kInflowSpeedEpsilon
Definition Auv.h:755
int LocalIndex(unsigned long globalStateIndex) const
Definition Auv.h:981
double m_thrusterPos[3]
The thruster position in the body frame, m.
Definition Auv.h:925
double m_outEuler[3]
Roll, pitch and yaw, rad.
Definition Auv.h:1006
double m_outSeaDepth
Seafloor depth below the surface, m.
Definition Auv.h:1010
static const double kCrossFlowSpeedEpsilon
Definition Auv.h:668
double ma_adRelVel_d[3]
The velocity of the body relative to the fluid, in the body frame, m/s.
Definition Auv.h:996
const double * ma_adXVel_d
The body-frame velocity state.
Definition Auv.h:993
PrintDuringExec * m_print
The simulation logger, null under a headless or mock host.
Definition Auv.h:941
double m_outDepth
Depth below the surface, m.
Definition Auv.h:1007
virtual void CalcOutput(const double dT, const double *const adX)
Recomputes every output port from the given time and state.
double ma_adWaterVel_d[3]
The fluid velocity at the body, in the body frame, m/s.
Definition Auv.h:990
unsigned long m_IStateOmega
Global index of the body-frame angular velocity state.
Definition Auv.h:970
static void AxialDragWrench(const double relVel_d[3], double rho, double frontalArea, double axialDragCoeff, double wrench_d[6])
AuvRudderProperties m_rudder
The fin geometry and coefficients.
Definition Auv.h:938
double ma_dPropulsionPower
The clamped propulsion power of the current derivative evaluation, W.
Definition Auv.h:997
double m_hotelPower
The constant payload and computer load, W.
Definition Auv.h:924
double ma_mdR[3][3]
The body-to-NED rotation matrix.
Definition Auv.h:988
unsigned long m_IStateBase
Global index of this object's first state, cached in the constructor.
Definition Auv.h:972
double m_outAltitude
Height above the seafloor, m.
Definition Auv.h:1009
virtual void CalcFoundation(const double dT, const double *const adX)
Zeroes the force accumulator and caches the pose, the rotation matrix and the fluid velocity.
AuvHullProperties m_hull
The derived radius, volume, mass and inertia.
Definition Auv.h:913
static void SlenderBodyLiftWrench(const double relVel_d[3], const double omega_d[3], double rho, int sectionCount, const double *sectionX, const double *sectionDiameter, const double *sectionLength, double wrench_d[6], double(*dWrench_dVelocity)[6]=nullptr)
double m_addedMass[6]
The diagonal of the added mass, AddedMass.
Definition Auv.h:917
bool HasPortJacobians() const override
virtual void AddHullHydroForces()
Adds the axial hull drag, the cross-flow strip wrench and the explicit roll damping.
double m_rollDampingLinear
The linear roll damping, N·m·s.
Definition Auv.h:933
const double * ma_adXBattery
The battery energy state.
Definition Auv.h:995
double m_thrustPerPower
Thrust per watt of propulsion power, N/W.
Definition Auv.h:922
virtual double ComputeThrust(double propulsionPower, double surgeSpeed) const
double m_rhoWater
The density of the surrounding fluid, kg/m³.
Definition Auv.h:918
ISignalPort * m_inRudderYaw
Commanded yaw-plane fin deflection, rad.
Definition Auv.h:945
double izz
Yaw inertia about the body z axis, kg·m².
Definition Auv.h:462
double mass
Vehicle mass, kg.
Definition Auv.h:459
double iyy
Pitch inertia about the body y axis, kg·m².
Definition Auv.h:461
double frontalArea
Frontal area of the cylinder, pi r², m².
Definition Auv.h:458
double volume
Displaced volume, m³.
Definition Auv.h:457
double ixx
Roll inertia about the body x axis, kg·m².
Definition Auv.h:460
double radius
Hull radius, m.
Definition Auv.h:456
Everything one fin plane needs beyond its inflow and its commanded deflection.
Definition Auv.h:478
double rho
The density of the sea water, kg/m³.
Definition Auv.h:480
double pos[3]
Where the fin wrench acts, body frame, m.
Definition Auv.h:482
AuvFoilProperties foil
The lift and drag coefficient parameters.
Definition Auv.h:479
double area
The planform area of the fin plane, m².
Definition Auv.h:481
double maxDeflection
The mechanical stop on the command, rad.
Definition Auv.h:483