]> git.mxchange.org Git - flightgear.git/commitdiff
Sync'ed with JSBSim:
authorBertrand Coconnier <bcoconni@users.sourceforge.net>
Sun, 12 Jun 2016 09:36:45 +0000 (11:36 +0200)
committerRoland Haeder <roland@mxchange.org>
Thu, 22 Sep 2016 21:27:36 +0000 (23:27 +0200)
* Fixed the trim on ground algorithm. Now JSBSim aircrafts should no longer be 'dropped' on the runway at start.
* Removed a correction on the propeller induced velocity that was giving erratic results when the aircraft aero velocity is very small.
* Various source comments updates.

src/FDM/JSBSim/initialization/FGTrim.cpp
src/FDM/JSBSim/models/FGAerodynamics.cpp
src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp
src/FDM/JSBSim/models/propulsion/FGPropeller.cpp

index 9472400c92f3648749c1852fecfbdedf8563c910..4b56b9ff79055b8bf8b9c0a61c67c67f7681c89e 100644 (file)
@@ -57,7 +57,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGTrim.cpp,v 1.30 2015/12/29 13:44:39 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGTrim.cpp,v 1.34 2016/06/12 09:09:02 bcoconni Exp $");
 IDENT(IdHdr,ID_TRIM);
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -198,9 +198,8 @@ bool FGTrim::DoTrim(void) {
   double rudder0 = FCS->GetDrCmd();
   double PitchTrim0 = FCS->GetPitchTrimCmd();
 
-  for(int i=0;i < fdmex->GetGroundReactions()->GetNumGearUnits();i++){
+  for(int i=0;i < fdmex->GetGroundReactions()->GetNumGearUnits();i++)
     fdmex->GetGroundReactions()->GetGearUnit(i)->SetReport(false);
-  }
 
   fdmex->SetTrimStatus(true);
   fdmex->SuspendIntegration();
@@ -340,12 +339,12 @@ bool FGTrim::DoTrim(void) {
         cout << endl << "  Trim failed" << endl;
   }
 
+  fdmex->GetPropagate()->InitializeDerivatives();
   fdmex->ResumeIntegration();
   fdmex->SetTrimStatus(false);
 
-  for(int i=0;i < fdmex->GetGroundReactions()->GetNumGearUnits();i++){
+  for(int i=0;i < fdmex->GetGroundReactions()->GetNumGearUnits();i++)
     fdmex->GetGroundReactions()->GetGearUnit(i)->SetReport(true);
-  }
 
   return !trim_failed;
 }
@@ -383,18 +382,22 @@ void FGTrim::trimOnGround(void)
   vector<ContactPoints> contacts;
   FGLocation CGLocation = Propagate->GetLocation();
   FGMatrix33 Tec2b = Propagate->GetTec2b();
-  FGMatrix33 Tl2b = Propagate->GetTl2b();
+  FGMatrix33 Tb2l = Propagate->GetTb2l();
   double hmin = 1E+10;
   int contactRef = -1;
 
   // Build the list of the aircraft contact points and take opportunity of the
   // loop to find which one is closer to (or deeper into) the ground.
-  for (int i = 0; i < GroundReactions->GetNumGearUnits(); i++) {
+  for (int i = 0; i < GroundReactions->GetNumGearUnits(); ++i) {
     ContactPoints c;
     FGLGear* gear = GroundReactions->GetGearUnit(i);
-    c.location = gear->GetLocalGear();
-    FGLocation gearLoc = CGLocation.LocalToLocation(c.location);
-    c.location = Tl2b * c.location;
+
+    // Skip the retracted landing gears
+    if (!gear->GetGearUnitDown())
+      continue;
+
+    c.location = gear->GetBodyLocation();
+    FGLocation gearLoc = CGLocation.LocalToLocation(Tb2l * c.location);
 
     FGColumnVector3 normal, vDummy;
     FGLocation lDummy;
@@ -405,7 +408,7 @@ void FGTrim::trimOnGround(void)
 
     if (height < hmin) {
       hmin = height;
-      contactRef = i;
+      contactRef = contacts.size() - 1;
     }
   }
 
@@ -437,7 +440,7 @@ void FGTrim::trimOnGround(void)
   // Apply the computed rotation to all the contact points
   FGMatrix33 rot = q0.GetTInv();
   vector<ContactPoints>::iterator iter;
-  for (iter = contacts.begin(); iter != contacts.end(); iter++)
+  for (iter = contacts.begin(); iter != contacts.end(); ++iter)
     iter->location = contact0 + rot * (iter->location - contact0);
 
   // Remove the second point to come in contact with the ground from the list.
@@ -461,7 +464,7 @@ void FGTrim::trimOnGround(void)
   FGQuaternion q1(rParam.angleMin, rotationAxis);
 
   // Update the aircraft orientation
-  FGColumnVector3 euler = (q0 * q1 * fgic.GetOrientation()).GetEuler();
+  FGColumnVector3 euler = (fgic.GetOrientation() * q0 * q1).GetEuler();
 
   fgic.SetPhiRadIC(euler(1));
   fgic.SetThetaRadIC(euler(2));
@@ -486,7 +489,7 @@ FGTrim::RotationParameters FGTrim::calcRotation(vector<ContactPoints>& contacts,
 
   rParam.angleMin = 3.0 * M_PI;
 
-  for (iter = contacts.begin(); iter != contacts.end(); iter++) {
+  for (iter = contacts.begin(); iter != contacts.end(); ++iter) {
     // Below the processed contact point is named 'M'
     // Construct an orthonormal basis (u, v, t). The ground normal is obtained
     // from iter->normal.
index 6422a45cc707b86186ec4b56b349667cbe41f224..8e718fe4406f41b36288b5d0dd07028aad25a368 100644 (file)
@@ -50,7 +50,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGAerodynamics.cpp,v 1.59 2016/05/23 17:23:36 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGAerodynamics.cpp,v 1.60 2016/05/30 19:05:58 bcoconni Exp $");
 IDENT(IdHdr,ID_AERODYNAMICS);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -147,9 +147,13 @@ bool FGAerodynamics::Run(bool Holding)
   unsigned int axis_ctr;
   const double twovel=2*in.Vt;
 
-  // Calculate lift coefficient squared
-  // Make sure that aero/cl-squared is computed with the current qbar
+  // The lift coefficient squared (property aero/cl-squared) is computed before
+  // the aero functions are called to make sure that they use the same value for
+  // qbar.
   if ( in.Qbar > 1.0) {
+    // Skip the computation if qbar is close to zero to avoid huge values for
+    // aero/cl-squared when a non-null lift coincides with a very small aero
+    // velocity (i.e. when qbar is close to zero).
     clsq = (vFw(eLift) + vFwAtCG(eLift))/ (in.Wingarea*in.Qbar);
     clsq *= clsq;
   }
index a62cad1cdee7518bca3cc0702a84d564803735f3..a5f6e8e54dcb00c859f65951e6f2cca3ec77df7d 100644 (file)
@@ -153,9 +153,6 @@ double FGStandardAtmosphere::GetPressure(double altitude) const
   double Lmb, Exp, Tmb, deltaH, factor;
   double numRows = StdAtmosTemperatureTable->GetNumRows();
 
-//if (altitude > 328084) // Karman line
-//  altitude = 328084;
-
   // Iterate through the altitudes to find the current Base Altitude
   // in the table. That is, if the current altitude (the argument passed in)
   // is 20000 ft, then the base altitude from the table is 0.0. If the
index f8a4d345c7d68b102ea42acf9b727fb65dfb0f7c..7153d4e69b6e4812dfede84b487261c2f70954e5 100644 (file)
@@ -45,7 +45,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPropeller.cpp,v 1.57 2016/01/02 17:42:53 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGPropeller.cpp,v 1.58 2016/06/04 11:06:51 bcoconni Exp $");
 IDENT(IdHdr,ID_PROPELLER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -241,20 +241,6 @@ double FGPropeller::Calculate(double EnginePower)
     Vinduced = 0.5 * (-Vel + sqrt(Vel2sum));
   else
     Vinduced = 0.5 * (-Vel - sqrt(-Vel2sum));
-
-  // We need to drop the case where the downstream velocity is opposite in
-  // direction to the aircraft velocity. For example, in such a case, the
-  // direction of the airflow on the tail would be opposite to the airflow on
-  // the wing tips. When such complicated airflows occur, the momentum theory
-  // breaks down and the formulas above are no longer applicable
-  // (see H. Glauert, "The Elements of Airfoil and Airscrew Theory",
-  // 2nd edition, ยง16.3, pp. 219-221)
-
-  if ((Vel+2.0*Vinduced)*Vel < 0.0) {
-    // The momentum theory is no longer applicable so let's assume the induced
-    // saturates to -0.5*Vel so that the total velocity Vel+2*Vinduced equals 0.
-    Vinduced = -0.5*Vel;
-  }
     
   // P-factor is simulated by a shift of the acting location of the thrust.
   // The shift is a multiple of the angle between the propeller shaft axis