]> git.mxchange.org Git - flightgear.git/commitdiff
Bugfixes and feature improvements related to AI auto flightplan generation.
authordurk <durk>
Sun, 19 Mar 2006 07:41:48 +0000 (07:41 +0000)
committerdurk <durk>
Sun, 19 Mar 2006 07:41:48 +0000 (07:41 +0000)
When AIFlightPlanCreateTaxi() function is called with the firstFlight
argument set to true, this is supposed to handle situations where the
the aircraft's timetable indicates it should have left between about 5 to
20 minutes earlier. In the previous version, all these aircraft started
taxiing from the first parking location available in the network, due
to the fact that the variable gateId was not assigned a value. In this
patch, route tracing starts from an assigned gate and the network node
following code is fast forwarded to a random location along the taxiways
to give a more realistic and natural distribution of taxiing aircraft
after startup.
    This patch further addresses some weird ballet-dancing behavior that
aircraft were showing just prior to/right after parking and which was
related to a number of more or less duplicate waypoints in the transition
from createTaxi() to createParking() to createPushBack() to createTaxi().
    Finally, a blatant typing error in the getParking() function was fixed.

src/AIModel/AIAircraft.cxx
src/AIModel/AIFlightPlan.hxx
src/AIModel/AIFlightPlanCreate.cxx
src/Airports/dynamics.cxx
src/Airports/groundnetwork.hxx

index 00bad5ebdd213af4aa644f071d5507bf0115c043..8b54c2bdd7d73512d3cfc851e4e75f3739e1312a 100644 (file)
@@ -703,18 +703,19 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now )
          {
            dep->getDynamics()->releaseParking(fp->getGate());
          }
-       // Some debug messages, specific to TESTING THE Logical networks.
+       // Some debug messages, specific to testing the Logical networks.
        //if ((arr->getId() == string("EHAM")) && (prev->name  == "Center"))
        //  {
        //    
        //    cerr << "Schiphol ground " 
+       //       << trafficRef->getRegistration() << " "
        //       << trafficRef->getCallSign();
        //    if (trafficRef->getHeavy())
        //      cerr << "Heavy";
        //    cerr << " landed runway " 
        //       << fp->getRunway()
        //       << " request taxi to gate " 
-       //       << arr->getParkingName(fp->getGate()) 
+       //       << arr->getDynamics()->getParkingName(fp->getGate()) 
        //       << endl;
        //  }
        if (prev->name == "END")
index 388cfb281d4843927c1b35fb7f7954c0596d1592..eee1ac531ec958d9d4102fac8bd9255b2326303b 100644 (file)
@@ -117,7 +117,7 @@ private:
   void createCruise(bool, FGAirport*, FGAirport*, double, double, double, double);
   void createDecent(FGAirport *);
   void createLanding(FGAirport *);
-  void createParking(FGAirport *);
+  void createParking(FGAirport *, double radius);
   void deleteWaypoints(); 
   void resetWaypoints();
 };    
index 9dcfb99439f1ecffd3aabea95e28ff0f0bf7a54f..296a5920cae4f9b8ceb56c49c10ade29b84dbe92 100644 (file)
  * dynamically create a flight plan for AI traffic, based on data provided by the
  * Traffic Manager, when reading a filed flightplan failes. (DT, 2004/07/10) 
  *
- * This is the top-level function, and the only one that publicly available.
+ * This is the top-level function, and the only one that is publicly available.
  *
  */ 
 
 
 // Check lat/lon values during initialization;
-void FGAIFlightPlan::create(FGAirport *dep, FGAirport *arr, int legNr, double alt, double speed, 
-                           double latitude, double longitude, bool firstFlight,
-                           double radius, const string& fltType, const string& aircraftType, const string& airline)
+void FGAIFlightPlan::create(FGAirport *dep, FGAirport *arr, int legNr, 
+                           double alt, double speed, double latitude, 
+                           double longitude, bool firstFlight,double radius, 
+                           const string& fltType, const string& aircraftType, 
+                           const string& airline)
 { 
   int currWpt = wpt_iterator - waypoints.begin();
   switch(legNr)
     {
     case 1:
-      //cerr << "Creating Push_Back" << endl;
-      createPushBack(firstFlight,dep, latitude, longitude, radius, fltType, aircraftType, airline);
-      //cerr << "Done" << endl;
+      createPushBack(firstFlight,dep, latitude, longitude, 
+                    radius, fltType, aircraftType, airline);
       break;
     case 2: 
-      //cerr << "Creating Taxi" << endl;
-      createTaxi(firstFlight, 1, dep, latitude, longitude, radius, fltType, aircraftType, airline);
+      createTaxi(firstFlight, 1, dep, latitude, longitude, 
+                radius, fltType, aircraftType, airline);
       break;
     case 3: 
-      //cerr << "Creating TAkeoff" << endl;
       createTakeOff(firstFlight, dep, speed);
       break;
     case 4: 
-      //cerr << "Creating Climb" << endl;
       createClimb(firstFlight, dep, speed, alt);
       break;
     case 5: 
-      //cerr << "Creating Cruise" << endl;
       createCruise(firstFlight, dep,arr, latitude, longitude, speed, alt);
       break;
     case 6: 
-      //cerr << "Creating Decent" << endl;
       createDecent(arr);
       break;
     case 7: 
-      //cerr << "Creating Landing" << endl;
       createLanding(arr);
       break;
     case 8: 
-      //cerr << "Creating Taxi 2" << endl;
-      createTaxi(false, 2, arr, latitude, longitude, radius, fltType, aircraftType, airline);
+      createTaxi(false, 2, arr, latitude, longitude, radius, 
+                fltType, aircraftType, airline);
       break;
-    case 9: 
-      //cerr << "Creating Parking" << endl;
-      createParking(arr);
+      case 9: 
+       createParking(arr, radius);
       break;
     default:
       //exit(1);
-      cerr << "Unknown case: " << legNr << endl;
+      SG_LOG(SG_INPUT, SG_ALERT, "AIFlightPlan::create() attempting to create unknown leg"
+            " this is probably an internal program error");
     }
   wpt_iterator = waypoints.begin()+currWpt;
   leg++;
@@ -92,12 +88,12 @@ void FGAIFlightPlan::create(FGAirport *dep, FGAirport *arr, int legNr, double al
  * initialize the Aircraft at the parking location
  ******************************************************************/
 void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep, 
-                                   double latitude,
-                                   double longitude,
-                                   double radius,
-                                   const string& fltType,
-                                   const string& aircraftType,
-                                   const string& airline)
+                                   double latitude,
+                                   double longitude,
+                                   double radius,
+                                   const string& fltType,
+                                   const string& aircraftType,
+                                   const string& airline)
 {
   double heading;
   double lat;
@@ -115,19 +111,20 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   if (firstFlight)
     {
       if (!(dep->getDynamics()->getAvailableParking(&lat, &lon, 
-                                                   &heading, &gateId, 
-                                                   radius, fltType, 
-                                                   aircraftType, airline)))
-       {
-         cerr << "Could not find parking " << endl;
-       }
+                                                   &heading, &gateId, 
+                                                   radius, fltType, 
+                                                   aircraftType, airline)))
+       {
+         SG_LOG(SG_INPUT, SG_WARN, "Could not find parking for a " << 
+                aircraftType <<
+                " of flight type " << fltType << 
+                " of airline     " << airline <<
+                " at airport     " << dep->getId());
+       }
     }
   else
     {
       dep->getDynamics()->getParking(gateId, &lat, &lon, &heading);
-      //lat     = latitude;
-      //lon     = longitude;
-      //heading = getHeading();
     }
   heading += 180.0;
   if (heading > 360)
@@ -148,8 +145,8 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   // Add park twice, because it uses park once for initialization and once
   // to trigger the departure ATC message 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
-                     10, 
-                     &lat2, &lon2, &az2 );
+                     10, 
+                     &lat2, &lon2, &az2 );
   wpt = new waypoint;
   wpt->name      = "park2";
   wpt->latitude  = lat2;
@@ -163,8 +160,8 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   wpt->on_ground = true;
   waypoints.push_back(wpt); 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
-                     radius,                 // push back one entire aircraft radius
-                     &lat2, &lon2, &az2 );
+                     2.2*radius,           
+                     &lat2, &lon2, &az2 );
   wpt = new waypoint;
   wpt->name      = "taxiStart";
   wpt->latitude  = lat2;
@@ -176,33 +173,56 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
-  waypoints.push_back(wpt); 
-
-  
+  waypoints.push_back(wpt);  
 }
 
 /*******************************************************************
  * createCreate Taxi. 
  * initialize the Aircraft at the parking location
  ******************************************************************/
-void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt, double latitude, double longitude, double radius, const string& fltType, const string& acType, const string& airline)
+void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, 
+                               FGAirport *apt, double latitude, double longitude, 
+                               double radius, const string& fltType, 
+                               const string& acType, const string& airline)
 {
   double wind_speed;
   double wind_heading;
   double heading;
-  //FGRunway rwy;
   double lat, lon, az;
   double lat2, lon2, az2;
-  //int direction;
   waypoint *wpt;
 
-  // Erase all existing waypoints.
-  //   wpt_vector_iterator i= waypoints.begin();
-  //resetWaypoints();
-  //int currWpt = wpt_iterator - waypoints.begin();
-  if (direction == 1)
+   if (direction == 1)
     {
-      //string name;
+      // If this function is called during initialization,
+      // make sure we obtain a valid gate ID first
+      // and place the model at the location of the gate.
+      if (firstFlight)
+       {
+         if (!(apt->getDynamics()->getAvailableParking(&lat, &lon, 
+                                                       &heading, &gateId, 
+                                                       radius, fltType, 
+                                                       acType, airline)))
+           {
+             SG_LOG(SG_INPUT, SG_WARN, "Could not find parking for a " << 
+                    acType <<
+                    " of flight type " << fltType <<
+                    " of airline     " << airline <<
+                    " at airport     " << apt->getId());
+           }
+         //waypoint *wpt = new waypoint;
+         //wpt->name      = "park";
+         //wpt->latitude  = lat;
+         //wpt->longitude = lon;
+         //wpt->altitude  = apt->getElevation();
+         //wpt->speed     = -10; 
+         //wpt->crossat   = -10000;
+         //wpt->gear_down = true;
+         //wpt->flaps_down= true;
+         //wpt->finished  = false;
+         //wpt->on_ground = true;
+         //waypoints.push_back(wpt);  
+       }
       // "NOTE: this is currently fixed to "com" for commercial traffic
       // Should be changed to be used dynamically to allow "gen" and "mil"
       // as well
@@ -211,38 +231,39 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
                                            activeRunway, 
                                            &rwy)))
        {
-         cout << "Failed to find runway for " << apt->getId() << endl;
-         // Hmm, how do we handle a potential error like this?
-         exit(1);
-       }
-      //string test;
-      //apt->getActiveRunway(string("com"), 1, test);
-      //exit(1);
-      
+          SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << 
+                 activeRunway << 
+                 " at airport     " << apt->getId());
+          exit(1);
+       } 
+
+      // Determine the beginning of he runway
       heading = rwy._heading;
       double azimuth = heading + 180.0;
       while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
       geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, 
                          rwy._length * SG_FEET_TO_METER * 0.5 - 5.0,
                          &lat2, &lon2, &az2 );
+
       if (apt->getDynamics()->getGroundNetwork()->exists())
        {
          intVec ids;
-         int runwayId = apt->getDynamics()->getGroundNetwork()->findNearestNode(lat2, lon2);
-         //int currId   = apt->getGroundNetwork()->findNearestNode(latitude,longitude);
-         //exit(1);
+         int runwayId = apt->getDynamics()->getGroundNetwork()->findNearestNode(lat2, 
+                                                                                lon2);
+
          
          // A negative gateId indicates an overflow parking, use a
          // fallback mechanism for this. 
-         // Starting from gate 0 is a bit of a hack...
+         // Starting from gate 0 in this case is a bit of a hack
+         // which requires a more proper solution later on.
          FGTaxiRoute route;
          if (gateId >= 0)
-           route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId, runwayId);
+           route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId, 
+                                                                             runwayId);
          else
            route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(0, runwayId);
          intVecIterator i;
-         //cerr << "creating route : ";
-         // No route found: go from gate directly to runway
+        
          if (route.empty()) {
            //Add the runway startpoint;
            wpt = new waypoint;
@@ -274,18 +295,47 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
          } else {
            int node;
            route.first();
+           bool isPushBackPoint = false;
+           if (firstFlight) {
+             // If this is called during initialization, randomly
+             // skip a number of waypoints to get a more realistic
+             // taxi situation.
+             isPushBackPoint = true;
+             int nrWaypoints = route.size();
+             int nrWaypointsToSkip = rand() % nrWaypoints;
+             for (int i = 0; i < nrWaypointsToSkip; i++) {
+               isPushBackPoint = false;
+               route.next(&node);
+             }
+           }
+           else {
+             //chop off the first two waypoints, because
+             // those have already been created
+             // by create pushback
+             int size = route.size();
+             if (size > 2) {
+               route.next(&node);
+               route.next(&node);
+             }
+           }
            while(route.next(&node))
              {
-               //i = ids.end()-1;
-               //cerr << "Creating Node: " << node << endl;
                FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
                //ids.pop_back();  
                wpt = new waypoint;
                wpt->name      = "taxiway"; // fixme: should be the name of the taxiway
                wpt->latitude  = tn->getLatitude();
                wpt->longitude = tn->getLongitude();
-               wpt->altitude  = apt->getElevation(); // should maybe be tn->elev too
-               wpt->speed     = 15; 
+               // Elevation is currently disregarded when on_ground is true
+               // because the AIModel obtains a periodic ground elevation estimate.
+               wpt->altitude  = apt->getElevation();
+               if (isPushBackPoint) {
+                 wpt->speed = -10;
+                 isPushBackPoint = false;
+               }
+               else {
+                 wpt->speed     = 15; 
+               }
                wpt->crossat   = -10000;
                wpt->gear_down = true;
                wpt->flaps_down= true;
@@ -295,10 +345,10 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
              }
            cerr << endl;
          }
-         //exit(1);
        }
       else 
        {
+         // This is the fallback mechanism, in case no ground network is available
          //Add the runway startpoint;
          wpt = new waypoint;
          wpt->name      = "Airport Center";
@@ -326,63 +376,35 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
          wpt->finished  = false;
          wpt->on_ground = true;
          waypoints.push_back(wpt);
-         //wpt = new waypoint;
-         //wpt->finished = false;
-         //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
        }
     }
   else  // Landing taxi
     {
-      //string name;
-      // "NOTE: this is currently fixed to "com" for commercial traffic
-      // Should be changed to be used dynamically to allow "gen" and "mil"
-      // as well
-      //apt->getActiveRunway("com", 1, name);
-      //if (!(globals->get_runways()->search(apt->getId(), 
-      //                                   name, 
-      //                           &rwy)))
-      //{//
-      //cout << "Failed to find runway for " << apt->getId() << endl;
-      // Hmm, how do we handle a potential error like this?
-      // exit(1);
-      //       }
-      //string test;
-      //apt->getActiveRunway(string("com"), 1, test);
-      //exit(1);
-      
-      //heading = rwy._heading;
-      //double azimuth = heading + 180.0;
-      //while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
-      //geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, 
-      //                 rwy._length * SG_FEET_TO_METER * 0.5 - 5.0,
-      //                 &lat2, &lon2, &az2 );
-      apt->getDynamics()->getAvailableParking(&lat, &lon, &heading, &gateId, radius, fltType, acType, airline);
-      heading += 180.0;
-      if (heading > 360)
-       heading -= 360;
-      geo_direct_wgs_84 ( 0, lat, lon, heading, 
-                         100,
-                         &lat2, &lon2, &az2 );
+      apt->getDynamics()->getAvailableParking(&lat, &lon, &heading, 
+                                             &gateId, radius, fltType, 
+                                             acType, airline);
+     
       double lat3 = (*(waypoints.end()-1))->latitude;
       double lon3 = (*(waypoints.end()-1))->longitude;
-      cerr << (*(waypoints.end()-1))->name << endl;
+      //cerr << (*(waypoints.end()-1))->name << endl;
+      
+      // Find a route from runway end to parking/gate.
       if (apt->getDynamics()->getGroundNetwork()->exists())
        {
          intVec ids;
-         int runwayId = apt->getDynamics()->getGroundNetwork()->findNearestNode(lat3, lon3);
-         //int currId   = apt->getGroundNetwork()->findNearestNode(latitude,longitude);
-         //exit(1);
-         
+         int runwayId = apt->getDynamics()->getGroundNetwork()->findNearestNode(lat3, 
+                                                                                lon3);
          // A negative gateId indicates an overflow parking, use a
          // fallback mechanism for this. 
          // Starting from gate 0 is a bit of a hack...
          FGTaxiRoute route;
          if (gateId >= 0)
-           route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, gateId);
+           route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 
+                                                                             gateId);
          else
            route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 0);
          intVecIterator i;
-         //cerr << "creating route : ";
+        
          // No route found: go from gate directly to runway
          if (route.empty()) {
            //Add the runway startpoint;
@@ -415,17 +437,18 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
          } else {
            int node;
            route.first();
-           while(route.next(&node))
+           int size = route.size();
+           // Omit the last two waypoints, as 
+           // those are created by createParking()
+           for (int i = 0; i < size-2; i++)
              {
-               //i = ids.end()-1;
-               //cerr << "Creating Node: " << node << endl;
+               route.next(&node);
                FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
-               //ids.pop_back();  
                wpt = new waypoint;
                wpt->name      = "taxiway"; // fixme: should be the name of the taxiway
                wpt->latitude  = tn->getLatitude();
                wpt->longitude = tn->getLongitude();
-               wpt->altitude  = apt->getElevation(); // should maybe be tn->elev too
+               wpt->altitude  = apt->getElevation();
                wpt->speed     = 15; 
                wpt->crossat   = -10000;
                wpt->gear_down = true;
@@ -434,13 +457,18 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
                wpt->on_ground = true;
                waypoints.push_back(wpt);
              }
-           cerr << endl;
          }
-         //exit(1);
        }
       else
        {
-         //Add the runway startpoint;
+         // Use a fallback mechanism in case no ground network is available
+         // obtain the location of the gate entrance point 
+         heading += 180.0;
+         if (heading > 360)
+           heading -= 360;
+         geo_direct_wgs_84 ( 0, lat, lon, heading, 
+                             100,
+                             &lat2, &lon2, &az2 );
          wpt = new waypoint;
          wpt->name      = "Airport Center";
          wpt->latitude  = apt->getLatitude();
@@ -453,32 +481,44 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, FGAirport *apt,
          wpt->finished  = false;
          wpt->on_ground = true;
          waypoints.push_back(wpt);
+        
+         wpt = new waypoint;
+         wpt->name      = "Begin Parking"; //apt->getId(); //wpt_node->getStringValue("name", "END");
+         wpt->latitude  = lat2;
+         wpt->longitude = lon2;
+         wpt->altitude  = apt->getElevation();
+         wpt->speed     = 15; 
+         wpt->crossat   = -10000;
+         wpt->gear_down = true;
+         wpt->flaps_down= true;
+         wpt->finished  = false;
+         wpt->on_ground = true;
+         waypoints.push_back(wpt); 
+
+         //waypoint* wpt;
+         //double lat;
+         //double lon;
+         //double heading;
+         apt->getDynamics()->getParking(gateId, &lat, &lon, &heading);
+         heading += 180.0;
+         if (heading > 360)
+           heading -= 360; 
          
+         wpt = new waypoint;
+         wpt->name      = "END"; //wpt_node->getStringValue("name", "END");
+         wpt->latitude  = lat;
+         wpt->longitude = lon;
+         wpt->altitude  = 19;
+         wpt->speed     = 15; 
+         wpt->crossat   = -10000;
+         wpt->gear_down = true;
+         wpt->flaps_down= true;
+         wpt->finished  = false;
+         wpt->on_ground = true;
+         waypoints.push_back(wpt);
        }
-
-
-
-
-      // Add the final destination waypoint
-      wpt = new waypoint;
-      wpt->name      = "Begin Parking"; //apt->getId(); //wpt_node->getStringValue("name", "END");
-      wpt->latitude  = lat2;
-      wpt->longitude = lon2;
-      wpt->altitude  = apt->getElevation();
-      wpt->speed     = 15; 
-      wpt->crossat   = -10000;
-      wpt->gear_down = true;
-      wpt->flaps_down= true;
-      wpt->finished  = false;
-      wpt->on_ground = true;
-      waypoints.push_back(wpt); 
-
-     
+      
     }
-  // wpt_iterator = waypoints.begin();
-  //if (!firstFlight)
-  // wpt_iterator++; 
-  //wpt_iterator = waypoints.begin()+currWpt;
 }
 
 /*******************************************************************
@@ -490,23 +530,10 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
   double wind_speed;
   double wind_heading;
   double heading;
-  //FGRunway rwy;
   double lat, lon, az;
   double lat2, lon2, az2;
-  //int direction;
   waypoint *wpt;
   
-  
-  // Erase all existing waypoints.
-  // wpt_vector_iterator i= waypoints.begin();
-  //while(waypoints.begin() != waypoints.end())
-  //  {      
-  //    delete *(i);
-  //    waypoints.erase(i);
-  //  }
-  //resetWaypoints();
-  
-  
   // Get the current active runway, based on code from David Luff
   // This should actually be unified and extended to include 
   // Preferential runway use schema's 
@@ -521,15 +548,12 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
                                              activeRunway, 
                                              &rwy)))
          {
-           cout << "Failed to find runway for " << apt->getId() << endl;
-           // Hmm, how do we handle a potential error like this?
+           SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << 
+                  activeRunway << 
+                  " at airport     " << apt->getId());
            exit(1);
          }
-       //string test;
-      //apt->getActiveRunway(string("com"), 1, test);
-      //exit(1);
     }
-  
   heading = rwy._heading;
   double azimuth = heading + 180.0;
   while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
@@ -570,11 +594,6 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt);
-  //  waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
-  // wpt_iterator = waypoints.begin();
-  //if (!firstFlight)
-  // wpt_iterator++;
 }
  
 /*******************************************************************
@@ -592,19 +611,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
   //int direction;
   waypoint *wpt;
 
-  // Erase all existing waypoints.
-  // wpt_vector_iterator i= waypoints.begin();
-  //while(waypoints.begin() != waypoints.end())
-  //  {      
-  //    delete *(i);
-  //    waypoints.erase(i);
-  //  }
-  //resetWaypoints();
-  
-  
-  // Get the current active runway, based on code from David Luff
-  // This should actually be unified and extended to include 
-  // Preferential runway use schema's 
   if (firstFlight)
     {
       //string name;
@@ -616,13 +623,11 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
                                              activeRunway, 
                                              &rwy)))
          {
-           cout << "Failed to find runway for " << apt->getId() << endl;
-           // Hmm, how do we handle a potential error like this?
+           SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << 
+                  activeRunway << 
+                  " at airport     " << apt->getId());
            exit(1);
          }
-       //string test;
-       //apt->getActiveRunway(string("com"), 1, test);
-      //exit(1);
     }
   
   
@@ -661,11 +666,6 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt); 
-  //waypoints.push_back(wpt); 
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
-  // wpt_iterator = waypoints.begin();
-  //if (!firstFlight)
-  // wpt_iterator++;
 }
 
 
@@ -673,27 +673,19 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
  * CreateCruise
  * initialize the Aircraft at the parking location
  ******************************************************************/
-void FGAIFlightPlan::createCruise(bool firstFlight, FGAirport *dep, FGAirport *arr, double latitude, double longitude, double speed, double alt)
+void FGAIFlightPlan::createCruise(bool firstFlight, FGAirport *dep, 
+                                 FGAirport *arr, double latitude, 
+                                 double longitude, double speed, 
+                                 double alt)
 {
   double wind_speed;
   double wind_heading;
   double heading;
-  //FGRunway rwy;
   double lat, lon, az;
   double lat2, lon2, az2;
   double azimuth;
-  //int direction;
   waypoint *wpt;
 
-  // Erase all existing waypoints.
-  // wpt_vector_iterator i= waypoints.begin();
-  //while(waypoints.begin() != waypoints.end())
-  //  {      
-  //    delete *(i);
-  //    waypoints.erase(i);
-  //  }
-  //resetWaypoints();
-
   wpt = new waypoint;
   wpt->name      = "Cruise"; //wpt_node->getStringValue("name", "END");
   wpt->latitude  = latitude;
@@ -706,42 +698,29 @@ void FGAIFlightPlan::createCruise(bool firstFlight, FGAirport *dep, FGAirport *a
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt); 
-  //Beginning of Decent
+  
  
-  //string name;
   // should be changed dynamically to allow "gen" and "mil"
   arr->getDynamics()->getActiveRunway("com", 2, activeRunway);
   if (!(globals->get_runways()->search(arr->getId(), 
                                       activeRunway, 
                                       &rwy)))
     {
-      cout << "Failed to find runway for " << arr->getId() << endl;
-      // Hmm, how do we handle a potential error like this?
+      SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << 
+            activeRunway << 
+            " at airport     " << arr->getId());
       exit(1);
     }
-  //string test;
-  //arr->getActiveRunway(string("com"), 1, test);
-  //exit(1);
-  
-  //cerr << "Altitude = " << alt << endl;
-  //cerr << "Done" << endl;
-  //if (arr->getId() == "EHAM")
-  //  {
-  //    cerr << "Creating cruise to EHAM " << latitude << " " << longitude << endl;
-  //  }
   heading = rwy._heading;
   azimuth = heading + 180.0;
   while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
   
   
-  // Note: This places us at the location of the active 
-  // runway during initial cruise. This needs to be 
-  // fixed later. 
   geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, 
                      110000,
                      &lat2, &lon2, &az2 );
   wpt = new waypoint;
-  wpt->name      = "BOD"; //wpt_node->getStringValue("name", "END");
+  wpt->name      = "BOD";
   wpt->latitude  = lat2;
   wpt->longitude = lon2;
   wpt->altitude  = alt;
@@ -752,11 +731,6 @@ void FGAIFlightPlan::createCruise(bool firstFlight, FGAirport *dep, FGAirport *a
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt); 
-  //waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault.  
-  //wpt_iterator = waypoints.begin();
-  //if (!firstFlight)
-  // wpt_iterator++;
 }
 
 /*******************************************************************
@@ -777,38 +751,23 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
   //int direction;
   waypoint *wpt;
 
-  //// Erase all existing waypoints.
-  // wpt_vector_iterator i= waypoints.begin();
-  //while(waypoints.begin() != waypoints.end())
-  //  {      
-  //    delete *(i);
-  //    waypoints.erase(i);
-  //  }
-  //resetWaypoints();
-
   //Beginning of Decent
   //string name;
   // allow "mil" and "gen" as well
   apt->getDynamics()->getActiveRunway("com", 2, activeRunway);
-    if (!(globals->get_runways()->search(apt->getId(), 
-                                         activeRunway, 
-                                         &rwy)))
-      {
-       cout << "Failed to find runway for " << apt->getId() << endl;
-       // Hmm, how do we handle a potential error like this?
-       exit(1);
-      }
-    //string test;
-    //apt->getActiveRunway(string("com"), 1, test);
-  //exit(1);
-
-  //cerr << "Done" << endl;
+  if (!(globals->get_runways()->search(apt->getId(), 
+                                      activeRunway, 
+                                      &rwy)))
+    {
+      SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << 
+            activeRunway << 
+            " at airport     " << apt->getId());
+      exit(1);
+    }
+  
   heading = rwy._heading;
   azimuth = heading + 180.0;
   while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
-  
-  
-  
   geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, 
                      100000,
                      &lat2, &lon2, &az2 );
@@ -825,11 +784,11 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt);  
-
+  
   // Three thousand ft. Slowing down to 160 kts
   geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, 
-                    8*SG_NM_TO_METER,
-                    &lat2, &lon2, &az2 );
+                     8*SG_NM_TO_METER,
+                     &lat2, &lon2, &az2 );
   wpt = new waypoint;
   wpt->name      = "DEC 3000ft"; //wpt_node->getStringValue("name", "END");
   wpt->latitude  = lat2;
@@ -842,15 +801,6 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
   wpt->finished  = false;
   wpt->on_ground = false;
   waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
-  //wpt_iterator = waypoints.begin();
-  //wpt_iterator++;
-  //if (apt->getId() == "EHAM")
-  //  {
-  //    cerr << "Created Decend to EHAM " << lat2 << " " << lon2 << ": Runway = " << rwy._rwy_no 
-  //      << "heading " << heading << endl;
-  //  }
 }
 /*******************************************************************
  * CreateLanding
@@ -858,7 +808,7 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
  ******************************************************************/
 void FGAIFlightPlan::createLanding(FGAirport *apt)
 {
-  // Ten thousand ft. Slowing down to 240 kts
+  // Ten thousand ft. Slowing down to 150 kts
   double wind_speed;
   double wind_heading;
   double heading;
@@ -923,47 +873,59 @@ void FGAIFlightPlan::createLanding(FGAirport *apt)
   wpt->finished  = false;
   wpt->on_ground = true;
   waypoints.push_back(wpt); 
-  //waypoints.push_back(wpt); 
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
-  //wpt_iterator = waypoints.begin();
-  //wpt_iterator++;
-
-  //if (apt->getId() == "EHAM")
-  //{
-  //  cerr << "Created Landing to EHAM " << lat2 << " " << lon2 << ": Runway = " << rwy._rwy_no 
-  //    << "heading " << heading << endl;
-  //}
 }
 
 /*******************************************************************
  * CreateParking
  * initialize the Aircraft at the parking location
  ******************************************************************/
-void FGAIFlightPlan::createParking(FGAirport *apt)
+void FGAIFlightPlan::createParking(FGAirport *apt, double radius)
 {
   waypoint* wpt;
-  double lat;
-  double lon;
+  double lat, lat2;
+  double lon, lon2;
+  double az2;
   double heading;
   apt->getDynamics()->getParking(gateId, &lat, &lon, &heading);
   heading += 180.0;
   if (heading > 360)
     heading -= 360; 
+  geo_direct_wgs_84 ( 0, lat, lon, heading, 
+                     2.2*radius,           
+                     &lat2, &lon2, &az2 );
+  wpt = new waypoint;
+  wpt->name      = "taxiStart";
+  wpt->latitude  = lat2;
+  wpt->longitude = lon2;
+  wpt->altitude  = apt->getElevation();
+  wpt->speed     = 10; 
+  wpt->crossat   = -10000;
+  wpt->gear_down = true;
+  wpt->flaps_down= true;
+  wpt->finished  = false;
+  wpt->on_ground = true;
+  waypoints.push_back(wpt); 
+  geo_direct_wgs_84 ( 0, lat, lon, heading, 
+                     0.1 *radius,           
+                     &lat2, &lon2, &az2 );
+  wpt = new waypoint;
+  wpt->name      = "taxiStart";
+  wpt->latitude  = lat2;
+  wpt->longitude = lon2;
+  wpt->altitude  = apt->getElevation();
+  wpt->speed     = 10; 
+  wpt->crossat   = -10000;
+  wpt->gear_down = true;
+  wpt->flaps_down= true;
+  wpt->finished  = false;
+  wpt->on_ground = true;
+  waypoints.push_back(wpt);   
 
-  // Erase all existing waypoints.
-  // wpt_vector_iterator i= waypoints.begin();
-  //while(waypoints.begin() != waypoints.end())
-  //  {      
-  //    delete *(i);
-  //    waypoints.erase(i);
-  //  }
-  //resetWaypoints();
-  // And finally one more named "END"
   wpt = new waypoint;
   wpt->name      = "END"; //wpt_node->getStringValue("name", "END");
   wpt->latitude  = lat;
   wpt->longitude = lon;
-  wpt->altitude  = 19;
+  wpt->altitude  = apt->getElevation();
   wpt->speed     = 15; 
   wpt->crossat   = -10000;
   wpt->gear_down = true;
@@ -971,8 +933,4 @@ void FGAIFlightPlan::createParking(FGAirport *apt)
   wpt->finished  = false;
   wpt->on_ground = true;
   waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);
-  //waypoints.push_back(wpt);  // add one more to prevent a segfault. 
-  //wpt_iterator = waypoints.begin();
-  //wpt_iterator++;
 }
index 4e3384e64e7c666c232249cf6b178d230f44d5da..57cce5526061446a6c00965a0f41119c89dfed12 100644 (file)
@@ -297,7 +297,7 @@ void FGAirportDynamics::getParking (int id, double *lat, double* lon, double *he
            {
              *lat     = i->getLatitude();
              *lon     = i->getLongitude();
-             *heading = i->getLongitude();
+             *heading = i->getHeading();
            }
        }
     }
index 52b91ed0bd8382c3f9ebfa882ef338172526ffa8..2d779b5b86272e635bfd7e0fb7b62dac4deb8620 100644 (file)
@@ -124,6 +124,7 @@ public:
   bool next(int *val); 
   
   void first() { currNode = nodes.begin(); };
+  int size() { return nodes.end() - nodes.begin(); };
 };
 
 typedef vector<FGTaxiRoute> TaxiRouteVector;