MassBalance = fdmex->GetMassBalance();
Propulsion = fdmex->GetPropulsion();
Aircraft = fdmex->GetAircraft();
- Propagate = fdmex->GetPropagate();
+ Propagate = fdmex->GetPropagate();
Auxiliary = fdmex->GetAuxiliary();
Inertial = fdmex->GetInertial();
Aerodynamics = fdmex->GetAerodynamics();
Atmosphere->UseInternal();
}
- fgic->SetVNorthFpsIC( -wind_from_north->getDoubleValue() );
- fgic->SetVEastFpsIC( -wind_from_east->getDoubleValue() );
- fgic->SetVDownFpsIC( -wind_from_down->getDoubleValue() );
+ fgic->SetWindNEDFpsIC( -wind_from_north->getDoubleValue(),
+ -wind_from_east->getDoubleValue(),
+ -wind_from_down->getDoubleValue() );
//Atmosphere->SetExTemperature(get_Static_temperature());
//Atmosphere->SetExPressure(get_Static_pressure());
}
// end of egt_degf deprecation patch
- if (fgGetBool("/sim/presets/running")) {
- for (unsigned int i=0; i < Propulsion->GetNumEngines(); i++) {
- SGPropertyNode * node = fgGetNode("engines/engine", i, true);
- node->setBoolValue("running", true);
- Propulsion->GetEngine(i)->SetRunning(true);
- }
- }
-
FCS->SetDfPos( ofNorm, globals->get_controls()->get_flaps() );
common_init();
copy_to_JSBsim();
fdmex->RunIC(); //loop JSBSim once w/o integrating
+ if (fgGetBool("/sim/presets/running")) {
+ Propulsion->InitRunning(-1);
+ for (unsigned int i = 0; i < Propulsion->GetNumEngines(); i++) {
+ FGPiston* eng = (FGPiston*)Propulsion->GetEngine(i);
+ globals->get_controls()->set_magnetos(i, eng->GetMagnetos());
+ globals->get_controls()->set_mixture(i, FCS->GetMixtureCmd(i));
+ }
+ }
copy_from_JSBsim(); //update the bus
SG_LOG( SG_FLIGHT, SG_INFO, " Initialized JSBSim with:" );
{
fgtrim = new FGTrim(fdmex,tGround);
} else {
- fgtrim = new FGTrim(fdmex,tLongitudinal);
+ fgtrim = new FGTrim(fdmex,tFull);
}
if ( !fgtrim->DoTrim() ) {
pitch_trim->setDoubleValue( FCS->GetPitchTrimCmd() );
throttle_trim->setDoubleValue( FCS->GetThrottleCmd(0) );
aileron_trim->setDoubleValue( FCS->GetDaCmd() );
- rudder_trim->setDoubleValue( FCS->GetDrCmd() );
+ rudder_trim->setDoubleValue( -FCS->GetDrCmd() );
globals->get_controls()->set_elevator_trim(FCS->GetPitchTrimCmd());
globals->get_controls()->set_elevator(FCS->GetDeCmd());
globals->get_controls()->set_throttle(i, FCS->GetThrottleCmd(i));
globals->get_controls()->set_aileron(FCS->GetDaCmd());
- globals->get_controls()->set_rudder( FCS->GetDrCmd());
+ globals->get_controls()->set_rudder( -FCS->GetDrCmd());
SG_LOG( SG_FLIGHT, SG_INFO, " Trim complete" );
}
namespace JSBSim {
-static const char *IdSrc = "$Id: FGInitialCondition.cpp,v 1.59 2011/04/03 13:18:51 bcoconni Exp $";
+static const char *IdSrc = "$Id: FGInitialCondition.cpp,v 1.61 2011/05/20 00:47:03 bcoconni Exp $";
static const char *IdHdr = ID_INITIALCONDITION;
//******************************************************************************
FGQuaternion Quat(phi, theta, psi);
Quat.Normalize();
Tl2b = Quat.GetT();
- Tb2l = Quat.GetTInv();
+ Tb2l = Tl2b.Transposed();
vUVW_NED = Tb2l * FGColumnVector3(u0, v0, w0);
vt = vUVW_NED.Magnitude();
FGColumnVector3 _vt_NED = Tb2l * Tw2b * FGColumnVector3(vt, 0., 0.);
FGColumnVector3 _WIND_NED = _vt_NED - vUVW_NED;
- double hdot0 = _vt_NED(eW);
+ double hdot0 = -_vt_NED(eW);
if (fabs(hdot0) < vt) {
double scale = sqrt((vt*vt-hdot*hdot)/(vt*vt-hdot0*hdot0));
_vt_NED(eU) *= scale;
_vt_NED(eV) *= scale;
}
- _vt_NED(eW) = hdot;
+ _vt_NED(eW) = -hdot;
vUVW_NED = _vt_NED - _WIND_NED;
- // The AoA is not modified here but the function SetAlphaRadIC is updating the
- // same angles than SetClimbRateFpsIC needs to update.
- // TODO : create a subroutine that only shares the relevant code.
- SetAlphaRadIC(alpha);
+ // Updating the angles theta and beta to keep the true airspeed amplitude
+ calcThetaBeta(alpha, _vt_NED);
}
//******************************************************************************
void FGInitialCondition::SetAlphaRadIC(double alfa)
{
FGColumnVector3 _vt_NED = Tb2l * Tw2b * FGColumnVector3(vt, 0., 0.);
+ calcThetaBeta(alfa, _vt_NED);
+}
+
+//******************************************************************************
+// When the AoA is modified, we need to update the angles theta and beta to
+// keep the true airspeed amplitude, the climb rate and the heading unchanged.
+// Beta will be modified if the aircraft roll angle is not null.
+void FGInitialCondition::calcThetaBeta(double alfa, const FGColumnVector3& _vt_NED)
+{
double calpha = cos(alfa), salpha = sin(alfa);
double cpsi = cos(psi), spsi = sin(psi);
double cphi = cos(phi), sphi = sin(phi);
FGMatrix33 Tpsi( cpsi, spsi, 0.,
- -spsi, cpsi, 0.,
- 0., 0., 1.);
+ -spsi, cpsi, 0.,
+ 0., 0., 1.);
FGMatrix33 Tphi(1., 0., 0.,
0., cphi, sphi,
0.,-sphi, cphi);
Tl2b = Quat.GetT();
Tb2l = Quat.GetTInv();
- FGColumnVector3 v2 = Talpha * Quat.GetT() * _vt_NED;
+ FGColumnVector3 v2 = Talpha * Tl2b * _vt_NED;
alpha = alfa;
beta = atan2(v2(eV), v2(eU));
- double cbeta=0.0, sbeta=0.0;
+ double cbeta=1.0, sbeta=0.0;
if (vt != 0.0) {
cbeta = v2(eU) / vt;
sbeta = v2(eV) / vt;
double ve0 = vt * sqrt(rho/rhoSL);
altitudeASL=alt;
+ position.SetRadius(alt + sea_level_radius);
+
temperature = fdmex->GetAtmosphere()->GetTemperature(altitudeASL);
soundSpeed = sqrt(SHRatio*Reng*temperature);
rho = fdmex->GetAtmosphere()->GetDensity(altitudeASL);
default: // Make the compiler stop complaining about missing enums
break;
}
-
- position.SetRadius(alt + sea_level_radius);
}
//******************************************************************************
double slr = SGGeodesy::SGGeodToSeaLevelRadius(geodetic_position_v);
_set_Sea_level_radius( slr * SG_METER_TO_FEET );
+ // Set initial Euler angles
+ SG_LOG( SG_FLIGHT, SG_INFO, "...initializing Euler angles..." );
+ set_Euler_Angles( fgGetDouble("/sim/presets/roll-deg")
+ * SGD_DEGREES_TO_RADIANS,
+ fgGetDouble("/sim/presets/pitch-deg")
+ * SGD_DEGREES_TO_RADIANS,
+ fgGetDouble("/sim/presets/heading-deg")
+ * SGD_DEGREES_TO_RADIANS );
+
// Set initial velocities
SG_LOG( SG_FLIGHT, SG_INFO, "...initializing velocities..." );
if ( !fgHasNode("/sim/presets/speed-set") ) {
}
}
- // Set initial Euler angles
- SG_LOG( SG_FLIGHT, SG_INFO, "...initializing Euler angles..." );
- set_Euler_Angles( fgGetDouble("/sim/presets/roll-deg")
- * SGD_DEGREES_TO_RADIANS,
- fgGetDouble("/sim/presets/pitch-deg")
- * SGD_DEGREES_TO_RADIANS,
- fgGetDouble("/sim/presets/heading-deg")
- * SGD_DEGREES_TO_RADIANS );
+ if ( fgHasNode("/sim/presets/glideslope-deg") )
+ set_Gamma_vert_rad( fgGetDouble("/sim/presets/glideslope-deg")
+ * SGD_DEGREES_TO_RADIANS );
+ else if ( fgHasNode( "/velocities/vertical-speed-fps") )
+ set_Climb_Rate( fgGetDouble("/velocities/vertical-speed-fps") );
SG_LOG( SG_FLIGHT, SG_INFO, "End common FDM init" );
}
false);
fgSetArchivable("/position/altitude-ft");
fgTie("/position/altitude-agl-ft", this,
- &FGInterface::get_Altitude_AGL, &FGInterface::set_AltitudeAGL);
+ &FGInterface::get_Altitude_AGL, &FGInterface::set_AltitudeAGL, false);
fgSetArchivable("/position/ground-elev-ft");
fgTie("/position/ground-elev-ft", this,
&FGInterface::get_Runway_altitude); // read-only
fgSetArchivable("/position/sea-level-radius-ft");
fgTie("/position/sea-level-radius-ft", this,
&FGInterface::get_Sea_level_radius,
- &FGInterface::_set_Sea_level_radius);
+ &FGInterface::_set_Sea_level_radius, false);
// Orientation
fgTie("/orientation/roll-deg", this,
&FGInterface::set_Psi_deg, false);
fgSetArchivable("/orientation/heading-deg");
fgTie("/orientation/track-deg", this,
- &FGInterface::get_Track);
+ &FGInterface::get_Track); // read-only
// Body-axis "euler rates" (rotation speed, but in a funny
// representation).
fgTie("/orientation/roll-rate-degps", this,
- &FGInterface::get_Phi_dot_degps, &FGInterface::set_Phi_dot_degps);
+ &FGInterface::get_Phi_dot_degps,
+ &FGInterface::set_Phi_dot_degps, false);
fgTie("/orientation/pitch-rate-degps", this,
- &FGInterface::get_Theta_dot_degps, &FGInterface::set_Theta_dot_degps);
+ &FGInterface::get_Theta_dot_degps,
+ &FGInterface::set_Theta_dot_degps, false);
fgTie("/orientation/yaw-rate-degps", this,
- &FGInterface::get_Psi_dot_degps, &FGInterface::set_Psi_dot_degps);
+ &FGInterface::get_Psi_dot_degps,
+ &FGInterface::set_Psi_dot_degps, false);
- fgTie("/orientation/p-body", this, &FGInterface::get_P_body);
- fgTie("/orientation/q-body", this, &FGInterface::get_Q_body);
- fgTie("/orientation/r-body", this, &FGInterface::get_R_body);
+ fgTie("/orientation/p-body", this, &FGInterface::get_P_body); // read-only
+ fgTie("/orientation/q-body", this, &FGInterface::get_Q_body); // read-only
+ fgTie("/orientation/r-body", this, &FGInterface::get_R_body); // read-only
// Ground speed knots
fgTie("/velocities/groundspeed-kt", this,
- &FGInterface::get_V_ground_speed_kt);
+ &FGInterface::get_V_ground_speed_kt); // read-only
// Calibrated airspeed
fgTie("/velocities/airspeed-kt", this,
false);
fgTie("/velocities/equivalent-kt", this,
- &FGInterface::get_V_equiv_kts);
+ &FGInterface::get_V_equiv_kts); // read-only
// Mach number
fgTie("/velocities/mach", this,
&FGInterface::get_V_down, &FGInterface::set_V_down, false);
fgTie("/velocities/north-relground-fps", this,
- &FGInterface::get_V_north_rel_ground);
+ &FGInterface::get_V_north_rel_ground); // read-only
fgTie("/velocities/east-relground-fps", this,
- &FGInterface::get_V_east_rel_ground);
+ &FGInterface::get_V_east_rel_ground); // read-only
fgTie("/velocities/down-relground-fps", this,
- &FGInterface::get_V_down_rel_ground);
+ &FGInterface::get_V_down_rel_ground); // read-only
// Relative wind
// Climb and slip (read-only)
fgTie("/velocities/vertical-speed-fps", this,
&FGInterface::get_Climb_Rate,
- &FGInterface::set_Climb_Rate );
+ &FGInterface::set_Climb_Rate, false );
fgTie("/velocities/glideslope", this,
&FGInterface::get_Gamma_vert_rad,
- &FGInterface::set_Gamma_vert_rad );
+ &FGInterface::set_Gamma_vert_rad, false );
fgTie("/orientation/side-slip-rad", this,
- &FGInterface::get_Beta, &FGInterface::_set_Beta);
+ &FGInterface::get_Beta, &FGInterface::_set_Beta, false);
fgTie("/orientation/side-slip-deg", this,
&FGInterface::get_Beta_deg); // read-only
fgTie("/orientation/alpha-deg", this,
- &FGInterface::get_Alpha_deg, &FGInterface::set_Alpha_deg); // read-only
+ &FGInterface::get_Alpha_deg, &FGInterface::set_Alpha_deg, false);
fgTie("/accelerations/nlf", this,
&FGInterface::get_Nlf); // read-only
// NED accelerations
fgTie("/accelerations/ned/north-accel-fps_sec",
- this, &FGInterface::get_V_dot_north);
+ this, &FGInterface::get_V_dot_north); // read-only
fgTie("/accelerations/ned/east-accel-fps_sec",
- this, &FGInterface::get_V_dot_east);
+ this, &FGInterface::get_V_dot_east); // read-only
fgTie("/accelerations/ned/down-accel-fps_sec",
- this, &FGInterface::get_V_dot_down);
+ this, &FGInterface::get_V_dot_down); // read-only
// Pilot accelerations
fgTie("/accelerations/pilot/x-accel-fps_sec",
- this, &FGInterface::get_A_X_pilot, &FGInterface::set_A_X_pilot);
+ this, &FGInterface::get_A_X_pilot, &FGInterface::set_A_X_pilot, false);
fgTie("/accelerations/pilot/y-accel-fps_sec",
- this, &FGInterface::get_A_Y_pilot, &FGInterface::set_A_Y_pilot);
+ this, &FGInterface::get_A_Y_pilot, &FGInterface::set_A_Y_pilot, false);
fgTie("/accelerations/pilot/z-accel-fps_sec",
- this, &FGInterface::get_A_Z_pilot, &FGInterface::set_A_Z_pilot);
+ this, &FGInterface::get_A_Z_pilot, &FGInterface::set_A_Z_pilot, false);
- fgTie("/accelerations/n-z-cg-fps_sec", this, &FGInterface::get_N_Z_cg);
+ fgTie("/accelerations/n-z-cg-fps_sec",
+ this, &FGInterface::get_N_Z_cg); // read-only
}