43#include "FGTransmission.h"
54 ThrusterMoment(1.0), EngineMoment(1.0), EngineFriction(0.0),
55 ClutchCtrlNorm(1.0), BrakeCtrlNorm(0.0), MaxBrakePower(0.0)
58 FreeWheelLag =
Filter(200.0,dt);
60 BindModel(num, PropertyManager.get());
78void FGTransmission::InitDynamics(
void)
80 FreeWheelTransmission = 1.0;
81 EngineRPM = ThrusterRPM = 0.0;
88void FGTransmission::Calculate(
double EnginePower,
double ThrusterTorque,
double dt) {
90 double coupling = 1.0, coupling_sq = 1.0;
93 double d_omega = 0.0, engine_d_omega = 0.0, thruster_d_omega = 0.0;
95 double engine_omega = rpm_to_omega(EngineRPM);
96 double safe_engine_omega = engine_omega < 1e-1 ? 1e-1 : engine_omega;
97 double engine_torque = EnginePower / safe_engine_omega;
99 double thruster_omega = rpm_to_omega(ThrusterRPM);
100 double safe_thruster_omega = thruster_omega < 1e-1 ? 1e-1 : thruster_omega;
102 engine_torque -= EngineFriction / safe_engine_omega;
103 ThrusterTorque +=
Constrain(0.0, BrakeCtrlNorm, 1.0) * MaxBrakePower / safe_thruster_omega;
106 engine_d_omega = engine_torque/EngineMoment * dt;
107 thruster_d_omega = - ThrusterTorque/ThrusterMoment * dt;
109 if ( thruster_omega+thruster_d_omega > engine_omega+engine_d_omega ) {
111 FreeWheelTransmission = 0.0;
113 FreeWheelTransmission = 1.0;
116 fw_mult = FreeWheelLag.execute(FreeWheelTransmission);
117 coupling = fw_mult *
Constrain(0.0, ClutchCtrlNorm, 1.0);
119 if (coupling < 0.999999) {
122 (engine_torque - ThrusterTorque*coupling)/(ThrusterMoment*coupling + EngineMoment) * dt;
124 (engine_torque*coupling - ThrusterTorque)/(ThrusterMoment + EngineMoment*coupling) * dt;
126 EngineRPM += omega_to_rpm(engine_d_omega);
127 ThrusterRPM += omega_to_rpm(thruster_d_omega);
130 coupling_sq = coupling*coupling;
131 EngineRPM = (1.0-coupling_sq) * EngineRPM + coupling_sq * 0.02 * (49.0*EngineRPM + ThrusterRPM);
132 ThrusterRPM = (1.0-coupling_sq) * ThrusterRPM + coupling_sq * 0.02 * (EngineRPM + 49.0*ThrusterRPM);
135 if ( fabs(EngineRPM-ThrusterRPM) < 1e-3 ) {
136 EngineRPM = ThrusterRPM = 0.5 * (EngineRPM+ThrusterRPM);
139 d_omega = (engine_torque - ThrusterTorque)/(ThrusterMoment + EngineMoment) * dt;
140 EngineRPM = ThrusterRPM += omega_to_rpm(d_omega);
144 if (EngineRPM < 0.0 ) EngineRPM = 0.0;
145 if (ThrusterRPM < 0.0 ) ThrusterRPM = 0.0;
151bool FGTransmission::BindModel(
int num, FGPropertyManager* PropertyManager)
153 string property_name, base_property_name;
154 base_property_name = CreateIndexedPropertyName(
"propulsion/engine", num);
156 property_name = base_property_name +
"/brake-ctrl-norm";
157 PropertyManager->Tie( property_name.c_str(),
this,
158 &FGTransmission::GetBrakeCtrlNorm, &FGTransmission::SetBrakeCtrlNorm);
160 property_name = base_property_name +
"/clutch-ctrl-norm";
161 PropertyManager->Tie( property_name.c_str(),
this,
162 &FGTransmission::GetClutchCtrlNorm, &FGTransmission::SetClutchCtrlNorm);
164 property_name = base_property_name +
"/free-wheel-transmission";
165 PropertyManager->Tie( property_name.c_str(),
this,
166 &FGTransmission::GetFreeWheelTransmission);
190void FGTransmission::Debug(
int from)
192 if (debug_lvl <= 0)
return;
198 if (debug_lvl & 2 ) {
199 FGLogging log(LogLevel::DEBUG);
200 if (from == 0) log <<
"Instantiated: FGTransmission\n";
201 if (from == 1) log <<
"Destroyed: FGTransmission\n";
203 if (debug_lvl & 4 ) {
205 if (debug_lvl & 8 ) {
207 if (debug_lvl & 16) {
209 if (debug_lvl & 64) {
Encapsulates the JSBSim simulation executive.
std::shared_ptr< FGPropertyManager > GetPropertyManager(void) const
Returns a pointer to the property manager object.
First order, (low pass / lag) filter.
static constexpr double Constrain(double min, double value, double max)
Constrain a value between a minimum and a maximum value.
FGTransmission(FGFDMExec *exec, int num, double dt)
Constructor for FGTransmission.
void ResetToIC(void)
Reset the initial conditions.
~FGTransmission()
Destructor for FGTransmission.
Main namespace for the JSBSim Flight Dynamics Model.