X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIFlightPlanCreate.cxx;h=ccb677bb80c60e05b0d1f6316674defc201e6180;hb=666910a7937712d02e62a38a83ced564f6227f52;hp=296a5920cae4f9b8ceb56c49c10ade29b84dbe92;hpb=101ca14a6d4908404324569b7fbb5e2fef62092e;p=flightgear.git diff --git a/src/AIModel/AIFlightPlanCreate.cxx b/src/AIModel/AIFlightPlanCreate.cxx index 296a5920c..ccb677bb8 100644 --- a/src/AIModel/AIFlightPlanCreate.cxx +++ b/src/AIModel/AIFlightPlanCreate.cxx @@ -44,7 +44,7 @@ void FGAIFlightPlan::create(FGAirport *dep, FGAirport *arr, int legNr, int currWpt = wpt_iterator - waypoints.begin(); switch(legNr) { - case 1: + case 1: createPushBack(firstFlight,dep, latitude, longitude, radius, fltType, aircraftType, airline); break; @@ -140,10 +140,9 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + waypoints.push_back(wpt); - // 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 ); @@ -158,6 +157,7 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); geo_direct_wgs_84 ( 0, lat, lon, heading, 2.2*radius, @@ -173,6 +173,7 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } @@ -185,13 +186,13 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, double radius, const string& fltType, const string& acType, const string& airline) { - double wind_speed; - double wind_heading; double heading; - double lat, lon, az; + double lat, lon; double lat2, lon2, az2; waypoint *wpt; + int nrWaypointsToSkip; + if (direction == 1) { // If this function is called during initialization, @@ -256,15 +257,18 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, // fallback mechanism for this. // Starting from gate 0 in this case is a bit of a hack // which requires a more proper solution later on. - FGTaxiRoute route; + //FGTaxiRoute route; + if (taxiRoute) + delete taxiRoute; + taxiRoute = new FGTaxiRoute; if (gateId >= 0) - route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId, + *taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId, runwayId); else - route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(0, runwayId); + *taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(0, runwayId); intVecIterator i; - if (route.empty()) { + if (taxiRoute->empty()) { //Add the runway startpoint; wpt = new waypoint; wpt->name = "Airport Center"; @@ -277,6 +281,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); //Add the runway startpoint; @@ -291,39 +296,45 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } else { int node; - route.first(); + taxiRoute->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++) { + int nrWaypoints = taxiRoute->size(); + nrWaypointsToSkip = rand() % nrWaypoints; + // but make sure we always keep two active waypoints + // to prevent a segmentation fault + for (int i = 0; i < nrWaypointsToSkip-2; i++) { isPushBackPoint = false; - route.next(&node); + taxiRoute->next(&node); } - } - else { + } else { //chop off the first two waypoints, because // those have already been created // by create pushback - int size = route.size(); + int size = taxiRoute->size(); if (size > 2) { - route.next(&node); - route.next(&node); + taxiRoute->next(&node); + taxiRoute->next(&node); } } - while(route.next(&node)) + int route; + while(taxiRoute->next(&node, &route)) { + //FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findSegment(node)->getEnd(); + char buffer[10]; + snprintf (buffer, 10, "%d", 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->name = string(buffer); // fixme: should be the name of the taxiway wpt->latitude = tn->getLatitude(); wpt->longitude = tn->getLongitude(); // Elevation is currently disregarded when on_ground is true @@ -341,10 +352,27 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = route; waypoints.push_back(wpt); } - cerr << endl; - } + //cerr << endl; + // finally, rewind the taxiRoute object to the point where we started + // generating the Flightplan, for AI use. + // This is a bit tricky, because the + taxiRoute->first(); + if (firstFlight) { + for (int i = 0; i < nrWaypointsToSkip-1; i++) { + taxiRoute->next(&node); + } + } else { + int size = taxiRoute->size(); + if (size > 2) { + //taxiRoute->next(&node); + //taxiRoute->next(&node); + //taxiRoute->next(&node); + } + } + } // taxiRoute not empty } else { @@ -361,6 +389,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); //Add the runway startpoint; @@ -375,6 +404,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } } @@ -397,16 +427,19 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, // 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; + //FGTaxiRoute route; + if (taxiRoute) + delete taxiRoute; + taxiRoute = new FGTaxiRoute; if (gateId >= 0) - route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, + *taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, gateId); else - route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 0); + *taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 0); intVecIterator i; // No route found: go from gate directly to runway - if (route.empty()) { + if (taxiRoute->empty()) { //Add the runway startpoint; wpt = new waypoint; wpt->name = "Airport Center"; @@ -419,13 +452,14 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); //Add the runway startpoint; wpt = new waypoint; wpt->name = "Runway Takeoff"; - wpt->latitude = lat2; - wpt->longitude = lon2; + wpt->latitude = lat3; + wpt->longitude = lon3; wpt->altitude = apt->getElevation(); wpt->speed = 15; wpt->crossat = -10000; @@ -433,19 +467,25 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } else { int node; - route.first(); - int size = route.size(); + taxiRoute->first(); + int size = taxiRoute->size(); // Omit the last two waypoints, as // those are created by createParking() + int route; for (int i = 0; i < size-2; i++) { - route.next(&node); + taxiRoute->next(&node, &route); + char buffer[10]; + snprintf (buffer, 10, "%d", node); + //FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node); FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node); wpt = new waypoint; - wpt->name = "taxiway"; // fixme: should be the name of the taxiway + //wpt->name = "taxiway"; // fixme: should be the name of the taxiway + wpt->name = string(buffer);// fixme: should be the name of the taxiway wpt->latitude = tn->getLatitude(); wpt->longitude = tn->getLongitude(); wpt->altitude = apt->getElevation(); @@ -455,8 +495,11 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = route; waypoints.push_back(wpt); } + //taxiRoute->first(); + //taxiRoute->next(&node); } } else @@ -480,6 +523,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); wpt = new waypoint; @@ -493,6 +537,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); //waypoint* wpt; @@ -515,6 +560,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } @@ -527,8 +573,6 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction, ******************************************************************/ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double speed) { - double wind_speed; - double wind_heading; double heading; double lat, lon, az; double lat2, lon2, az2; @@ -554,6 +598,7 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee exit(1); } } + // Acceleration point, 105 meters into the runway, heading = rwy._heading; double azimuth = heading + 180.0; while ( azimuth >= 360.0 ) { azimuth -= 360.0; } @@ -571,19 +616,41 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); lat = lat2; lon = lon2; az = az2; - //Next: the Start of Climb + //Start Climbing to 3000 ft. Let's do this + // at the center of the runway for now: + // geo_direct_wgs_84 ( 0, lat, lon, heading, 2560 * SG_FEET_TO_METER, &lat2, &lon2, &az2 ); wpt = new waypoint; wpt->name = "SOC"; + wpt->latitude = rwy._lat; + wpt->longitude = rwy._lon; + wpt->altitude = apt->getElevation()+1000; + wpt->speed = speed; + wpt->crossat = -10000; + wpt->gear_down = true; + wpt->flaps_down= true; + wpt->finished = false; + wpt->on_ground = false; + wpt->routeIndex = 0; + waypoints.push_back(wpt); + + + geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, + rwy._length * SG_FEET_TO_METER, + &lat2, &lon2, &az2 ); + + wpt = new waypoint; + wpt->name = "3000 ft"; wpt->latitude = lat2; wpt->longitude = lon2; wpt->altitude = apt->getElevation()+3000; @@ -593,7 +660,48 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = false; + wpt->routeIndex = 0; waypoints.push_back(wpt); + +// Finally, add two more waypoints, so that aircraft will remain under + // Tower control until they have reached the 3000 ft climb point + + + geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, + 5000, + &lat2, &lon2, &az2 ); + + + wpt = new waypoint; + wpt->name = "5000 ft"; + wpt->latitude = lat2; + wpt->longitude = lon2; + wpt->altitude = apt->getElevation()+5000; + wpt->speed = speed; + wpt->crossat = -10000; + wpt->gear_down = true; + wpt->flaps_down= true; + wpt->finished = false; + wpt->on_ground = false; + wpt->routeIndex = 0; + waypoints.push_back(wpt); + + // geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, +// 100000, +// &lat2, &lon2, &az2 ); +// wpt = new waypoint; +// wpt->name = "5100 ft"; +// wpt->latitude = lat2; +// wpt->longitude = lon2; +// wpt->altitude = apt->getElevation()+5100; +// wpt->speed = speed; +// wpt->crossat = -10000; +// wpt->gear_down = true; +// wpt->flaps_down= true; +// wpt->finished = false; +// wpt->on_ground = false; +// wpt->routeIndex = 0; +// waypoints.push_back(wpt); } /******************************************************************* @@ -602,11 +710,8 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee ******************************************************************/ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed, double alt) { - double wind_speed; - double wind_heading; double heading; //FGRunway rwy; - double lat, lon, az; double lat2, lon2, az2; //int direction; waypoint *wpt; @@ -634,6 +739,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed, heading = rwy._heading; double azimuth = heading + 180.0; while ( azimuth >= 360.0 ) { azimuth -= 360.0; } + //cerr << "Creating climb at : " << rwy._id << " " << rwy._rwy_no << endl; geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, 10*SG_NM_TO_METER, &lat2, &lon2, &az2 ); @@ -648,6 +754,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = false; + wpt->routeIndex = 0; waypoints.push_back(wpt); @@ -665,73 +772,74 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed, wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = false; + wpt->routeIndex = 0; waypoints.push_back(wpt); } -/******************************************************************* - * 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) -{ - double wind_speed; - double wind_heading; - double heading; - double lat, lon, az; - double lat2, lon2, az2; - double azimuth; - waypoint *wpt; +// /******************************************************************* +// * 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) +// { +// double wind_speed; +// double wind_heading; +// double heading; +// double lat, lon, az; +// double lat2, lon2, az2; +// double azimuth; +// waypoint *wpt; - wpt = new waypoint; - wpt->name = "Cruise"; //wpt_node->getStringValue("name", "END"); - wpt->latitude = latitude; - wpt->longitude = longitude; - wpt->altitude = alt; - wpt->speed = speed; - wpt->crossat = -10000; - wpt->gear_down = false; - wpt->flaps_down= false; - wpt->finished = false; - wpt->on_ground = false; - waypoints.push_back(wpt); +// wpt = new waypoint; +// wpt->name = "Cruise"; //wpt_node->getStringValue("name", "END"); +// wpt->latitude = latitude; +// wpt->longitude = longitude; +// wpt->altitude = alt; +// wpt->speed = speed; +// wpt->crossat = -10000; +// wpt->gear_down = false; +// wpt->flaps_down= false; +// wpt->finished = false; +// wpt->on_ground = false; +// waypoints.push_back(wpt); - // should be changed dynamically to allow "gen" and "mil" - arr->getDynamics()->getActiveRunway("com", 2, activeRunway); - if (!(globals->get_runways()->search(arr->getId(), - activeRunway, - &rwy))) - { - SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << - activeRunway << - " at airport " << arr->getId()); - exit(1); - } - heading = rwy._heading; - azimuth = heading + 180.0; - while ( azimuth >= 360.0 ) { azimuth -= 360.0; } +// // should be changed dynamically to allow "gen" and "mil" +// arr->getDynamics()->getActiveRunway("com", 2, activeRunway); +// if (!(globals->get_runways()->search(arr->getId(), +// activeRunway, +// &rwy))) +// { +// SG_LOG(SG_INPUT, SG_ALERT, "Failed to find runway " << +// activeRunway << +// " at airport " << arr->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, - 110000, - &lat2, &lon2, &az2 ); - wpt = new waypoint; - wpt->name = "BOD"; - wpt->latitude = lat2; - wpt->longitude = lon2; - wpt->altitude = alt; - wpt->speed = speed; - wpt->crossat = alt; - wpt->gear_down = false; - wpt->flaps_down= false; - wpt->finished = false; - wpt->on_ground = false; - waypoints.push_back(wpt); -} +// geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, azimuth, +// 110000, +// &lat2, &lon2, &az2 ); +// wpt = new waypoint; +// wpt->name = "BOD"; +// wpt->latitude = lat2; +// wpt->longitude = lon2; +// wpt->altitude = alt; +// wpt->speed = speed; +// wpt->crossat = alt; +// wpt->gear_down = false; +// wpt->flaps_down= false; +// wpt->finished = false; +// wpt->on_ground = false; +// waypoints.push_back(wpt); +// } /******************************************************************* * CreateDecent @@ -741,11 +849,8 @@ void FGAIFlightPlan::createDecent(FGAirport *apt) { // Ten thousand ft. Slowing down to 240 kts - double wind_speed; - double wind_heading; double heading; //FGRunway rwy; - double lat, lon, az; double lat2, lon2, az2; double azimuth; //int direction; @@ -783,6 +888,7 @@ void FGAIFlightPlan::createDecent(FGAirport *apt) wpt->flaps_down= false; wpt->finished = false; wpt->on_ground = false; + wpt->routeIndex = 0; waypoints.push_back(wpt); // Three thousand ft. Slowing down to 160 kts @@ -800,6 +906,7 @@ void FGAIFlightPlan::createDecent(FGAirport *apt) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = false; + wpt->routeIndex = 0; waypoints.push_back(wpt); } /******************************************************************* @@ -809,11 +916,8 @@ void FGAIFlightPlan::createDecent(FGAirport *apt) void FGAIFlightPlan::createLanding(FGAirport *apt) { // Ten thousand ft. Slowing down to 150 kts - double wind_speed; - double wind_heading; double heading; //FGRunway rwy; - double lat, lon, az; double lat2, lon2, az2; double azimuth; //int direction; @@ -839,6 +943,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); //Full stop at the runway centerpoint @@ -856,6 +961,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, @@ -872,6 +978,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); } @@ -904,6 +1011,7 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); geo_direct_wgs_84 ( 0, lat, lon, heading, 0.1 *radius, @@ -919,6 +1027,7 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); wpt = new waypoint; @@ -932,5 +1041,6 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius) wpt->flaps_down= true; wpt->finished = false; wpt->on_ground = true; + wpt->routeIndex = 0; waypoints.push_back(wpt); }