X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIFlightPlanCreate.cxx;h=64df906f5fb51400a9848fd04f6da461a09d8b98;hb=acbcf94bde0ea73132a1dfadc0ebfd161d25f96d;hp=22a2616ed8544c8303285fa01e9c79a4e656889e;hpb=c7e9c7a61052ab01162a85f6912452524b714706;p=flightgear.git diff --git a/src/AIModel/AIFlightPlanCreate.cxx b/src/AIModel/AIFlightPlanCreate.cxx index 22a2616ed..64df906f5 100644 --- a/src/AIModel/AIFlightPlanCreate.cxx +++ b/src/AIModel/AIFlightPlanCreate.cxx @@ -148,15 +148,36 @@ FGAIFlightPlan::cloneWithPos(FGAIAircraft *ac, waypoint* aWpt, const std::string return wpt; } +FGAIFlightPlan::waypoint* +FGAIFlightPlan::clone(waypoint* aWpt) +{ + waypoint* wpt = new waypoint; + wpt->name = aWpt->name; + wpt->longitude = aWpt->longitude; + wpt->latitude = aWpt->latitude; + + wpt->altitude = aWpt->altitude; + wpt->speed = aWpt->speed; + wpt->crossat = aWpt->crossat; + wpt->gear_down = aWpt->gear_down; + wpt->flaps_down= aWpt->flaps_down; + wpt->finished = aWpt->finished; + wpt->on_ground = aWpt->on_ground; + wpt->routeIndex = 0; + + return wpt; +} + + void FGAIFlightPlan::createDefaultTakeoffTaxi(FGAIAircraft *ac, FGAirport* aAirport, FGRunway* aRunway) { SGGeod runwayTakeoff = aRunway->pointOnCenterline(5.0); double airportElev = aAirport->getElevation(); waypoint* wpt; - wpt = createOnGround(ac, "Airport Center", aAirport->geod(), airportElev, 15); + wpt = createOnGround(ac, "Airport Center", aAirport->geod(), airportElev, ac->getPerformance()->vTaxi()); waypoints.push_back(wpt); - wpt = createOnGround(ac, "Runway Takeoff", runwayTakeoff, airportElev, 15); + wpt = createOnGround(ac, "Runway Takeoff", runwayTakeoff, airportElev, ac->getPerformance()->vTaxi()); waypoints.push_back(wpt); } @@ -265,7 +286,7 @@ void FGAIFlightPlan::createTakeoffTaxi(FGAIAircraft *ac, bool firstFlight, char buffer[10]; snprintf (buffer, 10, "%d", node); FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node); - waypoint* wpt = createOnGround(ac, buffer, tn->geod(), apt->getElevation(), 15); + waypoint* wpt = createOnGround(ac, buffer, tn->getGeod(), apt->getElevation(), ac->getPerformance()->vTaxi()); wpt->routeIndex = route; waypoints.push_back(wpt); } @@ -278,14 +299,14 @@ void FGAIFlightPlan::createDefaultLandingTaxi(FGAIAircraft *ac, FGAirport* aAirp double airportElev = aAirport->getElevation(); waypoint* wpt; - wpt = createOnGround(ac, "Runway Exit", lastWptPos, airportElev, 15); + wpt = createOnGround(ac, "Runway Exit", lastWptPos, airportElev, ac->getPerformance()->vTaxi()); waypoints.push_back(wpt); - wpt = createOnGround(ac, "Airport Center", aAirport->geod(), airportElev, 15); + wpt = createOnGround(ac, "Airport Center", aAirport->geod(), airportElev, ac->getPerformance()->vTaxi()); waypoints.push_back(wpt); double heading, lat, lon; aAirport->getDynamics()->getParking(gateId, &lat, &lon, &heading); - wpt = createOnGround(ac, "END", SGGeod::fromDeg(lon, lat), airportElev, 15); + wpt = createOnGround(ac, "END", SGGeod::fromDeg(lon, lat), airportElev, ac->getPerformance()->vTaxi()); waypoints.push_back(wpt); } @@ -337,7 +358,7 @@ void FGAIFlightPlan::createLandingTaxi(FGAIAircraft *ac, FGAirport *apt, char buffer[10]; snprintf (buffer, 10, "%d", node); FGTaxiNode *tn = gn->findNode(node); - waypoint* wpt = createOnGround(ac, buffer, tn->geod(), apt->getElevation(), 15); + waypoint* wpt = createOnGround(ac, buffer, tn->getGeod(), apt->getElevation(), ac->getPerformance()->vTaxi()); wpt->routeIndex = route; waypoints.push_back(wpt); } @@ -349,15 +370,18 @@ void FGAIFlightPlan::createLandingTaxi(FGAIAircraft *ac, FGAirport *apt, ******************************************************************/ void FGAIFlightPlan::createTakeOff(FGAIAircraft *ac, bool firstFlight, FGAirport *apt, double speed, const string &fltType) { - double accel = ac->getPerformance()->acceleration(); - double vRotate = ac->getPerformance()->vRotate(); + double accel = ac->getPerformance()->acceleration(); + double vTaxi = ac->getPerformance()->vTaxi(); + double vRotate = ac->getPerformance()->vRotate(); +// double vTakeoff = ac->getPerformance()->vTakeoff(); + double vClimb = ac->getPerformance()->vClimb(); // Acceleration = dV / dT // Acceleration X dT = dV // dT = dT / Acceleration //d = (Vf^2 - Vo^2) / (2*a) - double accelTime = (vRotate - 15) / accel; +// double accelTime = (vRotate - vTaxi) / accel; //cerr << "Using " << accelTime << " as total acceleration time" << endl; - double accelDistance = (vRotate*vRotate - 15*15) / (2*accel); + double accelDistance = (vRotate*vRotate - vTaxi*vTaxi) / (2*accel); //cerr << "Using " << accelDistance << " " << accel << " " << vRotate << endl; waypoint *wpt; // Get the current active runway, based on code from David Luff @@ -376,9 +400,9 @@ void FGAIFlightPlan::createTakeOff(FGAIAircraft *ac, bool firstFlight, FGAirport double airportElev = apt->getElevation(); // Acceleration point, 105 meters into the runway, SGGeod accelPoint = rwy->pointOnCenterline(105.0); - wpt = createOnGround(ac, "accel", accelPoint, airportElev, speed); - waypoints.push_back(wpt); - + wpt = createOnGround(ac, "accel", accelPoint, airportElev, vClimb); + waypoints.push_back(wpt); + //Start Climbing to 3000 ft. Let's do this // at the center of the runway for now: SGGeod rotate = rwy->pointOnCenterline(105.0+accelDistance); @@ -406,8 +430,9 @@ void FGAIFlightPlan::createTakeOff(FGAIAircraft *ac, bool firstFlight, FGAirport void FGAIFlightPlan::createClimb(FGAIAircraft *ac, bool firstFlight, FGAirport *apt, double speed, double alt, const string &fltType) { waypoint *wpt; - bool planLoaded = false; +// bool planLoaded = false; string fPLName; + double vClimb = ac->getPerformance()->vClimb(); if (firstFlight) { string rwyClass = getRunwayClassFromTrafficType(fltType); @@ -415,27 +440,16 @@ void FGAIFlightPlan::createClimb(FGAIAircraft *ac, bool firstFlight, FGAirport * apt->getDynamics()->getActiveRunway(rwyClass, 1, activeRunway, heading); rwy = apt->getRunwayByIdent(activeRunway); } - if (fgGetBool("/sim/traffic-manager/use-custom-scenery-data") == true) { - string_list sc = globals->get_fg_scenery(); - char buffer[64]; - // NOTE: Currently for testing only. A slightly more elaborate naming convention - // needs to be dropped here. - snprintf(buffer, 64, "%s.SID-%s-01.xml", apt->getId().c_str(), activeRunway.c_str() ); - string airportDir = expandICAODirs(apt->getId()); - for (string_list_iterator i = sc.begin(); i != sc.end(); i++) { - SGPath aptpath( *i ); - aptpath.append( "Airports" ); - aptpath.append ( airportDir ); - aptpath.append( string(buffer) ); - if (aptpath.exists()) { - planLoaded = loadSID(aptpath.str()); - cerr << "Reading " << aptpath.str() << endl; - } - } - } - if (!planLoaded) { + if (sid) { + for (wpt_vector_iterator i = sid->getFirstWayPoint(); + i != sid->getLastWayPoint(); + i++) { + waypoints.push_back(clone(*(i))); + //cerr << " Cloning waypoint " << endl; + } + } else { SGGeod climb1 = rwy->pointOnCenterline(10*SG_NM_TO_METER); - wpt = createInAir(ac, "10000ft climb", climb1, speed, 10000); + wpt = createInAir(ac, "10000ft climb", climb1, vClimb, 10000); wpt->gear_down = true; wpt->flaps_down= true; waypoints.push_back(wpt); @@ -447,59 +461,6 @@ void FGAIFlightPlan::createClimb(FGAIAircraft *ac, bool firstFlight, FGAirport * } } -bool FGAIFlightPlan::loadSID(const string& filename) -{ - SGPropertyNode root; - try { - readProperties(filename, &root); - } catch (const sg_exception &e) { - SG_LOG(SG_GENERAL, SG_ALERT, - "Error reading AI flight plan: " << filename); - // cout << path.str() << endl; - return false; - } - - SGPropertyNode * node = root.getNode("flightplan"); - for (int i = 0; i < node->nChildren(); i++) { - //cout << "Reading waypoint " << i << endl; - waypoint* wpt = new waypoint; - SGPropertyNode * wpt_node = node->getChild(i); - wpt->name = wpt_node->getStringValue("name", "END"); - wpt->latitude = wpt_node->getDoubleValue("lat", 0); - wpt->longitude = wpt_node->getDoubleValue("lon", 0); - wpt->altitude = wpt_node->getDoubleValue("alt", 0); - wpt->speed = wpt_node->getDoubleValue("ktas", 0); - wpt->crossat = wpt_node->getDoubleValue("crossat", -10000); - wpt->gear_down = wpt_node->getBoolValue("gear-down", false); - wpt->flaps_down= wpt_node->getBoolValue("flaps-down", false); - wpt->on_ground = wpt_node->getBoolValue("on-ground", false); - wpt->time_sec = wpt_node->getDoubleValue("time-sec", 0); - wpt->time = wpt_node->getStringValue("time", ""); - - if (wpt->name == "END") wpt->finished = true; - else wpt->finished = false; - - waypoints.push_back( wpt ); - } - - //wpt_iterator = waypoints.begin(); - //cout << waypoints.size() << " waypoints read." << endl; - return true; -} - -// NOTE: This is just copied from Airports/readXML. -string FGAIFlightPlan::expandICAODirs(const string in){ - //cerr << "Expanding " << in << endl; - if (in.size() == 4) { - char buffer[11]; - snprintf(buffer, 11, "%c/%c/%c", in[0], in[1], in[2]); - //cerr << "result: " << buffer << endl; - return string(buffer); - } else { - return in; - } - //exit(1); -} /******************************************************************* @@ -510,6 +471,8 @@ void FGAIFlightPlan::createDecent(FGAIAircraft *ac, FGAirport *apt, const string { // Ten thousand ft. Slowing down to 240 kts waypoint *wpt; +double vDecent = ac->getPerformance()->vDescent(); + double vApproach = ac->getPerformance()->vApproach(); //Beginning of Decent //string name; @@ -520,13 +483,13 @@ void FGAIFlightPlan::createDecent(FGAIAircraft *ac, FGAirport *apt, const string rwy = apt->getRunwayByIdent(activeRunway); SGGeod descent1 = rwy->pointOnCenterline(-100000); // 100km out - wpt = createInAir(ac, "Dec 10000ft", descent1, apt->getElevation(), 240); + wpt = createInAir(ac, "Dec 10000ft", descent1, apt->getElevation(), vDecent); wpt->crossat = 10000; waypoints.push_back(wpt); // Three thousand ft. Slowing down to 160 kts SGGeod descent2 = rwy->pointOnCenterline(-8*SG_NM_TO_METER); // 8nm out - wpt = createInAir(ac, "DEC 3000ft", descent2, apt->getElevation(), 160); + wpt = createInAir(ac, "DEC 3000ft", descent2, apt->getElevation(), vApproach); wpt->crossat = 3000; wpt->gear_down = true; wpt->flaps_down= true; @@ -538,20 +501,22 @@ void FGAIFlightPlan::createDecent(FGAIAircraft *ac, FGAirport *apt, const string ******************************************************************/ void FGAIFlightPlan::createLanding(FGAIAircraft *ac, FGAirport *apt) { - // Ten thousand ft. Slowing down to 150 kts + double vTouchdown = ac->getPerformance()->vTouchdown(); + double vTaxi = ac->getPerformance()->vTaxi(); + waypoint *wpt; double aptElev = apt->getElevation(); //Runway Threshold - wpt = createOnGround(ac, "Threshold", rwy->threshold(), aptElev, 150); + wpt = createOnGround(ac, "Threshold", rwy->threshold(), aptElev, vTouchdown); wpt->crossat = apt->getElevation(); waypoints.push_back(wpt); // Roll-out - wpt = createOnGround(ac, "Center", rwy->geod(), aptElev, 30); + wpt = createOnGround(ac, "Center", rwy->geod(), aptElev, vTaxi*2); waypoints.push_back(wpt); SGGeod rollOut = rwy->pointOnCenterline(rwy->lengthM() * 0.9); - wpt = createOnGround(ac, "Roll Out", rollOut, aptElev, 15); + wpt = createOnGround(ac, "Roll Out", rollOut, aptElev, vTaxi); wpt->crossat = apt->getElevation(); waypoints.push_back(wpt); } @@ -564,10 +529,13 @@ void FGAIFlightPlan::createParking(FGAIAircraft *ac, FGAirport *apt, double radi { waypoint* wpt; double aptElev = apt->getElevation(); - double lat, lat2; - double lon, lon2; - double az2; - double heading; + double lat = 0.0, lat2 = 0.0; + double lon = 0.0, lon2 = 0.0; + double az2 = 0.0; + double heading = 0.0; + + double vTaxi = ac->getPerformance()->vTaxi(); + double vTaxiReduced = vTaxi * (2.0/3.0); apt->getDynamics()->getParking(gateId, &lat, &lon, &heading); heading += 180.0; if (heading > 360) @@ -575,17 +543,17 @@ void FGAIFlightPlan::createParking(FGAIAircraft *ac, FGAirport *apt, double radi geo_direct_wgs_84 ( 0, lat, lon, heading, 2.2*radius, &lat2, &lon2, &az2 ); - wpt = createOnGround(ac, "taxiStart", SGGeod::fromDeg(lon2, lat2), aptElev, 10); + wpt = createOnGround(ac, "taxiStart", SGGeod::fromDeg(lon2, lat2), aptElev, vTaxiReduced); waypoints.push_back(wpt); geo_direct_wgs_84 ( 0, lat, lon, heading, 0.1 *radius, &lat2, &lon2, &az2 ); - wpt = createOnGround(ac, "taxiStart2", SGGeod::fromDeg(lon2, lat2), aptElev, 10); + wpt = createOnGround(ac, "taxiStart2", SGGeod::fromDeg(lon2, lat2), aptElev, vTaxiReduced); waypoints.push_back(wpt); - wpt = createOnGround(ac, "END", SGGeod::fromDeg(lon, lat), aptElev, 10); + wpt = createOnGround(ac, "END", SGGeod::fromDeg(lon, lat), aptElev, vTaxiReduced); waypoints.push_back(wpt); }