FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CycloidalPropeller.h
1#ifndef CycloidalPropeller_h_
2#define CycloidalPropeller_h_
53#include <cmath>
54#include <memory>
55#include <string>
56
57#include <Eigen/Eigen>
58#include <sfh/constants.h>
59
60#include <fhsim/simobject/SimObject.h>
61#include <fhsim_environment/EnvironmentProvider.h>
62#include "PropulsorWakeField.h"
63
64namespace Ship{
65
68 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
69 Eigen::Quaterniond Q = Eigen::Quaterniond::Identity();
70 double current = 0;
71 Eigen::Vector3d thrustVectorBody = Eigen::Vector3d::UnitX();
72 Eigen::Vector3d posNED = Eigen::Vector3d::Zero();
73 };
74
75 using CycloidalPropellerCurrentField = PropulsorWakeField<CycloidalWakeState>;
76
77 class CycloidalPropeller: public SimObject{
78 public:
79 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
80 CycloidalPropeller(const std::string simObjectName, ISimObjectCreator* const creator);
81 void Compute(const double T, const double * const X) const;
82 void OdeFcn(const double T, const double *const X, double *const XDot) const;
83 void PreOdeFcn(const double T, const double *const X);
85 void AcceptedStep(double T, const double* X) override;
86
87 const double * ForceNED(const double T, const double * const X);
88 const double * TorqueNED(const double T, const double * const X);
89
90 const double * ForceBody(const double T, const double * const X);
91 const double * TorqueBody(const double T, const double * const X);
92
93 const double* ShaftTorqueCorrectedBody(const double T, const double* const X);
94 const double* ShaftTorqueBody(const double T, const double* const X);
95
96 const double* ShaftPowerCorrected(const double T, const double* const X);
97 const double* ShaftPower(const double T, const double* const X);
98
99 void FinalSetup(const double T, const double *const X, ISimObjectCreator* const creator);
100 #ifdef FH_VISUALIZATION
101 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
102 void RenderUpdate(const double T, const double* const X);
103 #endif
104 private:
105
106 double Ct ( double intensity )const{
107 return std::pow(std::sin( intensity*sfh::pi/2 ),2.0);
108 }
109
110 #ifdef FH_VISUALIZATION
111 int m_rotationState;
112 bool m_reverseRotationDirection;
113
114 Ogre::SceneNode *m_RenderNode;
115 Ogre::SceneNode *m_RenderNodeFoil;
116 #endif
117
118 int m_currentState;
119 double m_ct;
120 mutable double m_ct_angle;
121 double m_cq;
122 mutable double m_cq_angle;
123 double m_D;
124 double m_b;
125
126 mutable double m_shaftTorque;
127 mutable double m_shaftPower;
128
129
130 double m_torqueScale;
131 double m_thrustScale;
132
133 mutable Eigen::Vector3d m_force;
134 mutable Eigen::Vector3d m_torque;
135
136 mutable Eigen::Vector3d m_forceBody;
137 mutable Eigen::Vector3d m_torqueBody;
138
139 ICommonComputation * m_compute;
140
141 ISignalPort * m_inRPM;
142 ISignalPort * m_inThrustIntensity;
143 ISignalPort * m_inThrustVectorBody;
144
145 ISignalPort * m_inPositionNED;
146 ISignalPort * m_inVelocityNED;
147 ISignalPort * m_inOrientationNED;
148
149 environment::EnvironmentProvider *m_environment = nullptr;
150 std::shared_ptr<CycloidalPropellerCurrentField> m_currentField;
151
152 };
153}
154#endif // CycloidalPropeller_h__
Definition CycloidalPropeller.h:77
void AcceptedStep(double T, const double *X) override
Copies the wake state of the accepted state into the jet field (G4).
Definition PropulsorWakeField.h:25
Simple waypoint object.
Definition CableAttach.h:58
The state the cycloidal propeller jet needs, copied after each accepted step (zero jet by default: cu...
Definition CycloidalPropeller.h:67