1
0
Fork 0

AI Improvements

* Relax runway exit route requirement to 80°
* Ensure parking is only reset if airport for AI aircraft has changed
* Heading Error signed and arrival lead distance
This commit is contained in:
PortreeKid 2021-08-30 15:44:30 +02:00 committed by James Turner
parent 06c03a0672
commit f1a44c98df
11 changed files with 381 additions and 187 deletions

View file

@ -255,9 +255,10 @@ void FGAIAircraft::ClimbTo(double alt_ft ) {
void FGAIAircraft::TurnTo(double heading) { void FGAIAircraft::TurnTo(double heading) {
if( fabs(heading) < 0.1 ) { if( fabs(heading) < 0.1 ) {
SG_LOG(SG_AI, SG_WARN, "Heading reset"); SG_LOG(SG_AI, SG_WARN, "Heading reset to zero");
} }
tgt_heading = heading; tgt_heading = heading;
// SG_LOG(SG_AI, SG_BULK, "Turn tgt_heading to " << tgt_heading);
hdg_lock = true; hdg_lock = true;
} }
@ -397,8 +398,11 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
} }
} }
if (next) { if (next && !curr->contains("END") && !curr->contains("PushBackPointlegend")) {
fp->setLeadDistance(tgt_speed, tgt_heading, curr, next); fp->setLeadDistance(tgt_speed, tgt_heading, curr, next);
} else {
// If we are ending in a parking
fp->setLeadDistance(1);
} }
// Calculate a target altitude for any leg in which at least one waypoint is in the air. // Calculate a target altitude for any leg in which at least one waypoint is in the air.
@ -768,11 +772,12 @@ void FGAIAircraft::handleFirstWaypoint() {
//TODO fp should handle this //TODO fp should handle this
fp->IncrementWaypoint(eraseWaypoints); fp->IncrementWaypoint(eraseWaypoints);
if (!(fp->getNextWaypoint()) && trafficRef) if (!(fp->getNextWaypoint()) && trafficRef) {
if (!loadNextLeg()) { if (!loadNextLeg()) {
setDie(true); setDie(true);
return; return;
} }
}
prev = fp->getPreviousWaypoint(); //first waypoint prev = fp->getPreviousWaypoint(); //first waypoint
SG_LOG(SG_AI, SG_BULK, "Previous WP \t" << prev->getName()); SG_LOG(SG_AI, SG_BULK, "Previous WP \t" << prev->getName());
@ -785,7 +790,11 @@ void FGAIAircraft::handleFirstWaypoint() {
setLatitude(prev->getLatitude()); setLatitude(prev->getLatitude());
setLongitude(prev->getLongitude()); setLongitude(prev->getLongitude());
setSpeed(prev->getSpeed()); if(fp->getLeg()==1) {
setSpeed(0);
} else {
setSpeed(prev->getSpeed());
}
setAltitude(prev->getAltitude()); setAltitude(prev->getAltitude());
if (prev->getSpeed() > 0.0) if (prev->getSpeed() > 0.0)
@ -798,8 +807,11 @@ void FGAIAircraft::handleFirstWaypoint() {
// If next doesn't exist, as in incrementally created flightplans for // If next doesn't exist, as in incrementally created flightplans for
// AI/Trafficmanager created plans, // AI/Trafficmanager created plans,
// Make sure lead distance is initialized otherwise // Make sure lead distance is initialized otherwise
if (next) { // If we are ending in a parking
if (next && !curr->contains("END") && !curr->contains("PushBackPointlegend")) {
fp->setLeadDistance(speed, hdg, curr, next); fp->setLeadDistance(speed, hdg, curr, next);
} else {
fp->setLeadDistance(1);
} }
if (curr->getCrossat() > -1000.0) //use a calculated descent/climb rate if (curr->getCrossat() > -1000.0) //use a calculated descent/climb rate
@ -828,7 +840,6 @@ void FGAIAircraft::handleFirstWaypoint() {
prevSpeed = 0; prevSpeed = 0;
} }
/** /**
* Check Execution time (currently once every 100 ms) * Check Execution time (currently once every 100 ms)
* Add a bit of randomization to prevent the execution of all flight plans * Add a bit of randomization to prevent the execution of all flight plans
@ -855,18 +866,35 @@ bool FGAIAircraft::leadPointReached(FGAIWaypoint* curr, FGAIWaypoint* next, int
double dist_to_go_m = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr); double dist_to_go_m = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
// Leaddistance should be ft // Leaddistance should be ft
double lead_dist = fp->getLeadDistance(); double lead_dist = fp->getLeadDistance();
// experimental: Use fabs, because speed can be negative (I hope) during push_back. const double arrivalDist = fabs(10.0*fp->getCurrentWaypoint()->getSpeed());
if ((dist_to_go_m < fabs(10.0* speed)) && (speed < 0) && (tgt_speed < 0) && fp->getCurrentWaypoint()->contains("PushBackPoint")) { // arrive at pushback end
tgt_speed = -(dist_to_go_m / 10.0); if ((dist_to_go_m < arrivalDist) && (speed < 0) && (tgt_speed < 0) && fp->getCurrentWaypoint()->contains("PushBackPoint")) {
if (tgt_speed > -0.5) { // tgt_speed = -(dist_to_go_m / 10.0);
tgt_speed = -0.5; tgt_speed = -std::sqrt((pow(arrivalDist,2)-pow(arrivalDist-dist_to_go_m,2)));
SG_LOG(SG_AI, SG_BULK, "tgt_speed " << tgt_speed);
if (tgt_speed > -1) {
// Speed is int and cannot go below 1 knot
tgt_speed = -1;
} }
if (fp->getPreviousWaypoint()->getSpeed() < tgt_speed) { if (fp->getPreviousWaypoint()->getSpeed() < tgt_speed) {
SG_LOG(SG_AI, SG_BULK, "Set speed of WP from " << fp->getPreviousWaypoint()->getSpeed() << " to " << tgt_speed); SG_LOG(SG_AI, SG_BULK, "Set speed of WP from " << fp->getPreviousWaypoint()->getSpeed() << " to " << tgt_speed);
fp->getPreviousWaypoint()->setSpeed(tgt_speed); fp->getPreviousWaypoint()->setSpeed(tgt_speed);
} }
} }
// arrive at parking
if ((dist_to_go_m < arrivalDist) && (speed > 0) && (tgt_speed > 0) && fp->getCurrentWaypoint()->contains("END")) {
tgt_speed = (dist_to_go_m / 10.0);
if (tgt_speed < 1) {
// Speed is int and cannot go below 1 knot
tgt_speed = 1;
}
if (fp->getPreviousWaypoint()->getSpeed() < tgt_speed) {
SG_LOG(SG_AI, SG_BULK, "Set speed of WP from " << fp->getPreviousWaypoint()->getSpeed() << " to " << tgt_speed);
fp->getPreviousWaypoint()->setSpeed(tgt_speed);
}
}
if (lead_dist < fabs(2*speed)) { if (lead_dist < fabs(2*speed)) {
//don't skip over the waypoint //don't skip over the waypoint
@ -903,15 +931,22 @@ bool FGAIAircraft::leadPointReached(FGAIWaypoint* curr, FGAIWaypoint* next, int
if ((dist_to_go_m < lead_dist) || if ((dist_to_go_m < lead_dist) ||
((dist_to_go_m > prev_dist_to_go) && (bearing > (minBearing * 1.1))) ) { ((dist_to_go_m > prev_dist_to_go) && (bearing > (minBearing * 1.1))) ) {
SG_LOG(SG_AI, SG_BULK, "Leadpoint reached " << bearing << "\t" << nextBearing); SG_LOG(SG_AI, SG_BULK, "Leadpoint reached Bearing : " << bearing << "\tNext Bearing : " << nextBearing);
minBearing = 360; minBearing = 360;
speedFraction = 1.0; speedFraction = 1.0;
prev_dist_to_go = HUGE_VAL; prev_dist_to_go = HUGE_VAL;
return true; return true;
} else { } else {
if (prev_dist_to_go == dist_to_go_m) { if (prev_dist_to_go == dist_to_go_m && fabs(groundTargetSpeed)>0) {
//FIXME must be suppressed when parked //FIXME must be suppressed when parked
SG_LOG(SG_AI, SG_WARN, "Aircraft " << _callsign << " stuck. Speed " << speed); SG_LOG(SG_AI, SG_BULK, "Aircraft " << _callsign << " stuck. Speed " << speed);
stuckCounter++;
if (stuckCounter>AI_STUCK_LIMIT) {
SG_LOG(SG_AI, SG_WARN, "Stuck flight " << _callsign << " killed" );
setDie(true);
}
} else {
stuckCounter = 0;
} }
prev_dist_to_go = dist_to_go_m; prev_dist_to_go = dist_to_go_m;
return false; return false;
@ -966,6 +1001,8 @@ bool FGAIAircraft::handleAirportEndPoints(FGAIWaypoint* prev, time_t now) {
// This is the last taxi waypoint, and marks the the end of the flight plan // This is the last taxi waypoint, and marks the the end of the flight plan
// so, the schedule should update and wait for the next departure time. // so, the schedule should update and wait for the next departure time.
if (prev->contains("END")) { if (prev->contains("END")) {
SG_LOG(SG_AI, SG_BULK, "Reached " << prev->getName() );
//FIXME Heading Error should be reset //FIXME Heading Error should be reset
time_t nextDeparture = trafficRef->getDepartureTime(); time_t nextDeparture = trafficRef->getDepartureTime();
// make sure to wait at least 20 minutes at parking to prevent "nervous" taxi behavior // make sure to wait at least 20 minutes at parking to prevent "nervous" taxi behavior
@ -985,11 +1022,7 @@ bool FGAIAircraft::handleAirportEndPoints(FGAIWaypoint* prev, time_t now) {
* @param curr * @param curr
*/ */
void FGAIAircraft::controlHeading(FGAIWaypoint* curr) { void FGAIAircraft::controlHeading(FGAIWaypoint* curr) {
double calc_bearing = fp->getBearing(pos, curr); const double calc_bearing = speed < 0?SGMiscd::normalizePeriodic(0, 360, fp->getBearing(pos, curr) + 180.0):fp->getBearing(pos, curr);
if (speed < 0) {
calc_bearing +=180;
SG_NORMALIZE_RANGE(calc_bearing, 0.0, 360.0);
}
if (fgIsFinite(calc_bearing)) { if (fgIsFinite(calc_bearing)) {
double hdg_error = calc_bearing - tgt_heading; double hdg_error = calc_bearing - tgt_heading;
@ -1020,7 +1053,12 @@ void FGAIAircraft::controlSpeed(FGAIWaypoint* curr, FGAIWaypoint* next) {
if (fabs(speed_diff) > 10) { if (fabs(speed_diff) > 10) {
prevSpeed = speed; prevSpeed = speed;
if (next) { if (next) {
fp->setLeadDistance(speed, tgt_heading, curr, next); if (next && !curr->contains("END") && !curr->contains("PushBackPointlegend")) {
fp->setLeadDistance(speed, tgt_heading, curr, next);
} else {
// If we are ending in a parking the heading will be a
fp->setLeadDistance(1);
}
} }
} }
} }
@ -1100,19 +1138,21 @@ void FGAIAircraft::updateHeading(double dt) {
if (roll != 0.0) { if (roll != 0.0) {
// If on ground, calculate heading change directly // If on ground, calculate heading change directly
if (onGround()) { if (onGround()) {
double headingDiff = fabs(hdg-tgt_heading); const double headingDiff = SGMiscd::normalizePeriodic(-180, 180, hdg-tgt_heading);
if (headingDiff > 180) {
headingDiff = fabs(headingDiff - 360);
}
// When pushback behind us we still want to move but ...
groundTargetSpeed = tgt_speed * cos(headingDiff * SG_DEGREES_TO_RADIANS); groundTargetSpeed = tgt_speed * cos(headingDiff * SG_DEGREES_TO_RADIANS);
if (sign(groundTargetSpeed) != sign(tgt_speed)) { if (sign(groundTargetSpeed) != sign(tgt_speed) && fabs(tgt_speed) > 0) {
if (fabs(speed) < 2 ) { if (fabs(speed) < 2 && fp->isActive(globals->get_time_params()->get_cur_time())) {
// This seems to happen in case there is a change from forward to pushback. // This seems to happen in case there is a change from forward to pushback.
// which should never happen. // which should never happen.
SG_LOG(SG_AI, SG_BULK, "Oh dear we're stuck. Speed is " << speed ); SG_LOG(SG_AI, SG_BULK, "Oh dear " << _callsign << " might get stuck aka next point is behind us. Speed is " << speed );
stuckCounter++;
if (stuckCounter>AI_STUCK_LIMIT) {
SG_LOG(SG_AI, SG_WARN, "Stuck flight " << _callsign << " killed" );
setDie(true);
}
} }
// Negative Cosinus means angle > 90° // Negative Cosinus means angle > 90°
groundTargetSpeed = 0.21 * sign(tgt_speed); // to prevent speed getting stuck in 'negative' mode groundTargetSpeed = 0.21 * sign(tgt_speed); // to prevent speed getting stuck in 'negative' mode
@ -1120,12 +1160,18 @@ void FGAIAircraft::updateHeading(double dt) {
// Only update the target values when we're not moving because otherwise we might introduce an enormous target change rate while waiting a the gate, or holding. // Only update the target values when we're not moving because otherwise we might introduce an enormous target change rate while waiting a the gate, or holding.
if (speed != 0) { if (speed != 0) {
if (headingDiff > 30.0) { if (fabs(headingDiff) > 30.0) {
// invert if pushed backward // invert if pushed backward
headingChangeRate += 10.0 * dt * sign(roll); if( sign(headingChangeRate) == sign(headingDiff)) {
// left/right change
headingChangeRate = 10.0 * dt * sign(headingDiff) * -1;
} else {
headingChangeRate -= 10.0 * dt * sign(headingDiff);
}
// Clamp the maximum steering rate to 30 degrees per second, // Clamp the maximum steering rate to 30 degrees per second,
// But only do this when the heading error is decreasing. // But only do this when the heading error is decreasing.
// FIXME
if ((headingDiff < headingError)) { if ((headingDiff < headingError)) {
if (headingChangeRate > 30) if (headingChangeRate > 30)
headingChangeRate = 30; headingChangeRate = 30;
@ -1134,18 +1180,29 @@ void FGAIAircraft::updateHeading(double dt) {
} }
} else { } else {
if (speed != 0) { if (speed != 0) {
if (fabs(headingChangeRate) > headingDiff) if( sign(headingChangeRate) == sign(headingDiff)) {
// left/right change
headingChangeRate = 3 * dt * sign(headingDiff) * -1;
} else {
headingChangeRate -= 3 * dt * sign(headingDiff);
}
/*
if (headingChangeRate > headingDiff ||
headingChangeRate < headingDiff) {
headingChangeRate = headingDiff*sign(roll); headingChangeRate = headingDiff*sign(roll);
else }
else {
headingChangeRate += dt * sign(roll); headingChangeRate += dt * sign(roll);
}
*/
} }
} }
} }
hdg += headingChangeRate * dt * sqrt(fabs(speed) / 15); hdg += headingChangeRate * dt * sqrt(fabs(speed) / 15);
SG_NORMALIZE_RANGE(headingDiff, 0.0, 360.0);
headingError = headingDiff; headingError = headingDiff;
// SG_LOG(SG_AI, SG_BULK, "Headingerror " << headingError );
if (fabs(headingError) < 1.0) { if (fabs(headingError) < 1.0) {
hdg = tgt_heading; hdg = tgt_heading;
} }
@ -1262,8 +1319,6 @@ void FGAIAircraft::handleATCRequests(double dt)
if (!this->getTrafficRef()) { if (!this->getTrafficRef()) {
return; return;
} }
time_t startTime = this->getTrafficRef()->getDepartureTime(); /* <startTime> is unused. */
time_t now = globals->get_time_params()->get_cur_time(); /* <now> is unused. */
//TODO implement NullController for having no ATC to save the conditionals //TODO implement NullController for having no ATC to save the conditionals
if (controller) { if (controller) {
@ -1491,9 +1546,9 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "Lat\t"; o << "Lat\t";
o << "Lon\t"; o << "Lon\t";
o << "Callsign\t"; o << "Callsign\t";
o << "heading change rate\t";
o << "headingErr\t";
o << "headingDiff\t"; o << "headingDiff\t";
o << "headingChangeRate\t";
o << "headingError\t";
o << "hdg\t"; o << "hdg\t";
o << "tgt_heading\t"; o << "tgt_heading\t";
o << "tgt_speed\t"; o << "tgt_speed\t";
@ -1504,9 +1559,7 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "groundTargetSpeed\t"; o << "groundTargetSpeed\t";
o << "getVerticalSpeedFPM\t"; o << "getVerticalSpeedFPM\t";
o << "getTrueHeadingDeg\t"; o << "getTrueHeadingDeg\t";
o << "Bearing\t"; o << "bearingToWP\t";
o << "headingChangeRate\t";
o << "headingError\t";
o << "Name\t"; o << "Name\t";
o << "WP Lat\t"; o << "WP Lat\t";
@ -1519,25 +1572,23 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "Leg\t"; o << "Leg\t";
o << "Num WP\t"; o << "Num WP\t";
o << "Leaddistance\t"; o << "Leaddistance\t";
o << "no_roll"; o << "no_roll\t";
o << "roll\t";
o << "stuckCounter";
o << endl; o << endl;
} }
void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) { void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) {
double headingDiff = fabs(hdg-tgt_heading); const double headingDiff = SGMiscd::normalizePeriodic(-180, 180, hdg-tgt_heading);
if (headingDiff > 180) {
headingDiff = fabs(headingDiff - 360);
}
o << lineIndex << "\t"; o << lineIndex << "\t";
o << setprecision(12); o << setprecision(12);
o << this->getGeodPos().getLatitudeDeg() << "\t"; o << this->getGeodPos().getLatitudeDeg() << "\t";
o << this->getGeodPos().getLongitudeDeg() << "\t"; o << this->getGeodPos().getLongitudeDeg() << "\t";
o << this->getCallSign() << "\t"; o << this->getCallSign() << "\t";
o << headingChangeRate << "\t";
o << headingError << "\t";
o << headingDiff << "\t"; o << headingDiff << "\t";
o << headingChangeRate << "\t";
o << headingError << "\t";
o << hdg << "\t"; o << hdg << "\t";
o << tgt_heading << "\t"; o << tgt_heading << "\t";
o << tgt_speed << "\t"; o << tgt_speed << "\t";
@ -1550,8 +1601,6 @@ void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) {
o << round(this->getVerticalSpeedFPM()) << "\t"; o << round(this->getVerticalSpeedFPM()) << "\t";
o << this->getTrueHeadingDeg() << "\t"; o << this->getTrueHeadingDeg() << "\t";
FGAIFlightPlan* fp = this->GetFlightPlan(); FGAIFlightPlan* fp = this->GetFlightPlan();
o << headingChangeRate << "\t";
o << headingError << "\t";
FGAIWaypoint* currentWP = this->GetFlightPlan()->getCurrentWaypoint(); FGAIWaypoint* currentWP = this->GetFlightPlan()->getCurrentWaypoint();
if (currentWP) { if (currentWP) {
o << this->GetFlightPlan()->getBearing(this->getGeodPos(), this->GetFlightPlan()->getCurrentWaypoint()) << "\t"; o << this->GetFlightPlan()->getBearing(this->getGeodPos(), this->GetFlightPlan()->getCurrentWaypoint()) << "\t";
@ -1565,16 +1614,18 @@ void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) {
double dist_to_go_m = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), currentWP); double dist_to_go_m = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), currentWP);
o << dist_to_go_m << "\t"; o << dist_to_go_m << "\t";
} else { } else {
o << "\t\t\t\t\t\t\t\t"; o << "No WP\t\t\t\t\t\t\t\t";
} }
if (fp->isValidPlan()) { if (fp->isValidPlan()) {
o << fp->getLeg() << "\t"; o << fp->getLeg() << "\t";
o << fp->getNrOfWayPoints() << "\t"; o << fp->getNrOfWayPoints() << "\t";
o << fp->getLeadDistance() << "\t"; o << fp->getLeadDistance() << "\t";
} else { } else {
o << "NotValid\t\t"; o << "FP NotValid\t\t";
} }
o << this->onGround(); o << this->onGround() << "\t";
o << roll << "\t";
o << stuckCounter;
o << endl; o << endl;
} }
@ -1587,4 +1638,4 @@ std::string FGAIAircraft::getTimeString(int timeOffset)
tm* timeinfo = gmtime(&rawtime); tm* timeinfo = gmtime(&rawtime);
strftime(ret, 11, "%w/%H:%M:%S", timeinfo); strftime(ret, 11, "%w/%H:%M:%S", timeinfo);
return ret; return ret;
} }

View file

@ -128,6 +128,7 @@ private:
double headingError; double headingError;
double minBearing; double minBearing;
double speedFraction; double speedFraction;
/**Zero if FP is not active*/
double groundTargetSpeed; double groundTargetSpeed;
double groundOffset; double groundOffset;
@ -172,6 +173,9 @@ private:
std::string transponderCode; std::string transponderCode;
int spinCounter; int spinCounter;
/**Kills a flight when it's stuck */
const int AI_STUCK_LIMIT = 100;
int stuckCounter;
double prevSpeed; double prevSpeed;
double prev_dist_to_go; double prev_dist_to_go;

View file

@ -457,6 +457,9 @@ void FGAIFlightPlan::setLeadDistance(double speed, double bearing,
//lead_distance = turn_radius * sin(leadInAngle * SG_DEGREES_TO_RADIANS); //lead_distance = turn_radius * sin(leadInAngle * SG_DEGREES_TO_RADIANS);
lead_distance = turn_radius * tan((leadInAngle * SG_DEGREES_TO_RADIANS)/2); lead_distance = turn_radius * tan((leadInAngle * SG_DEGREES_TO_RADIANS)/2);
if (lead_distance > 1000) {
SG_LOG(SG_AI, SG_BULK, "Excessive leaddistance possible direction change " << lead_distance << " leadInAngle " << leadInAngle << " inbound " << inbound << " outbound " << outbound);
}
/* /*
if ((lead_distance > (3*turn_radius)) && (current->on_ground == false)) { if ((lead_distance > (3*turn_radius)) && (current->on_ground == false)) {
SG_LOG(SG_AI, SG_ALERT, "Warning: Lead-in distance is large. Inbound = " << inbound SG_LOG(SG_AI, SG_ALERT, "Warning: Lead-in distance is large. Inbound = " << inbound
@ -531,18 +534,19 @@ void FGAIFlightPlan::addWaypoint(FGAIWaypoint* wpt)
void FGAIFlightPlan::pushBackWaypoint(FGAIWaypoint *wpt) void FGAIFlightPlan::pushBackWaypoint(FGAIWaypoint *wpt)
{ {
const size_t pos = std::distance(waypoints.cbegin(), wpt_iterator); size_t pos = wpt_iterator - waypoints.begin();
if (waypoints.size()>0) {
if (!waypoints.empty()) { double dist = SGGeodesy::distanceM( waypoints.back()->getPos(), wpt->getPos());
const double dist = SGGeodesy::distanceM( waypoints.back()->getPos(), wpt->getPos()); if( dist == 0 ) {
if ( dist < 0.5 ) { SG_LOG(SG_AI, SG_DEBUG, "Double WP : \t" << wpt->getName() << " not added ");
SG_LOG(SG_AI, SG_DEV_ALERT, "Double WP : \t" << wpt->getName() << " not added "); } else {
waypoints.push_back(wpt);
SG_LOG(SG_AI, SG_BULK, "Added WP : \t" << setprecision(12) << wpt->getName() << "\t" << wpt->getPos() << "\t" << wpt->getSpeed());
} }
} } else {
waypoints.push_back(wpt); waypoints.push_back(wpt);
SG_LOG(SG_AI, SG_BULK, "Added WP : \t" << wpt->getName() << "\t" << wpt->getPos() << "\t" << wpt->getSpeed()); SG_LOG(SG_AI, SG_BULK, "Added WP : \t" << setprecision(12) << wpt->getName() << "\t" << wpt->getPos() << "\t" << wpt->getSpeed());
}
// std::vector::push_back invalidates waypoints // std::vector::push_back invalidates waypoints
// so we should restore wpt_iterator after push_back // so we should restore wpt_iterator after push_back
// (or it could be an index in the vector) // (or it could be an index in the vector)

View file

@ -417,7 +417,7 @@ void FGAIFlightPlan::createDefaultLandingTaxi(FGAIAircraft * ac,
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
if (gate.isValid()) { if (gate.isValid()) {
wpt = createOnGround(ac, "ENDtaxi", gate.parking()->geod(), airportElev, wpt = createOnGround(ac, "END-taxi", gate.parking()->geod(), airportElev,
ac->getPerformance()->vTaxi()); ac->getPerformance()->vTaxi());
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
} }
@ -468,14 +468,16 @@ bool FGAIFlightPlan::createLandingTaxi(FGAIAircraft * ac, FGAirport * apt,
// int route; // int route;
for (int i = 0; i < size - 2; i++) { for (int i = 0; i < size - 2; i++) {
taxiRoute.next(node, &route); taxiRoute.next(node, &route);
char buffer[10]; char buffer[16];
snprintf(buffer, 10, "%d", node->getIndex()); snprintf(buffer, 16, "landingtaxi-%d", node->getIndex());
FGAIWaypoint *wpt = FGAIWaypoint *wpt =
createOnGround(ac, buffer, node->geod(), apt->getElevation(), createOnGround(ac, buffer, node->geod(), apt->getElevation(),
ac->getPerformance()->vTaxi()); ac->getPerformance()->vTaxi());
wpt->setRouteIndex(route); wpt->setRouteIndex(route);
pushBackWaypoint(wpt); if( !waypoints.back() || SGGeodesy::distanceM( waypoints.back()->getPos(), wpt->getPos()) > 0 ) {
pushBackWaypoint(wpt);
}
} }
SG_LOG(SG_AI, SG_BULK, "Created taxi from " << runwayNode->getIndex() << " to " << gate.parking()->ident() << " at " << apt->getId()); SG_LOG(SG_AI, SG_BULK, "Created taxi from " << runwayNode->getIndex() << " to " << gate.parking()->ident() << " at " << apt->getId());
@ -1113,11 +1115,11 @@ bool FGAIFlightPlan::createParking(FGAIAircraft * ac, FGAirport * apt,
SGGeodesy::direct(parking->geod(), heading, 0.1 * parking->getRadius(), SGGeodesy::direct(parking->geod(), heading, 0.1 * parking->getRadius(),
pos, az); pos, az);
wpt = createOnGround(ac, "taxiStart2", pos, aptElev, vTaxiReduced); wpt = createOnGround(ac, "taxiStart2", pos, aptElev, vTaxiReduced/2);
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
wpt = createOnGround(ac, "END-Parking", parking->geod(), aptElev, wpt = createOnGround(ac, "END-Parking", parking->geod(), aptElev,
vTaxiReduced); vTaxiReduced/3);
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
return true; return true;
} }

View file

@ -43,7 +43,8 @@ using std::string;
// TODO: Use James Turner's createOnGround functions. // TODO: Use James Turner's createOnGround functions.
bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac, bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
bool firstFlight, FGAirport *dep, bool firstFlight,
FGAirport *dep,
double radius, double radius,
const string& fltType, const string& fltType,
const string& aircraftType, const string& aircraftType,
@ -59,32 +60,34 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
if (!(dep->getDynamics()->getGroundController()->exists())) { if (!(dep->getDynamics()->getGroundController()->exists())) {
//cerr << "Push Back fallback" << endl; //cerr << "Push Back fallback" << endl;
SG_LOG(SG_AI, SG_DEV_WARN, "No groundcontroller createPushBackFallBack at " << dep->getId());
createPushBackFallBack(ac, firstFlight, dep, createPushBackFallBack(ac, firstFlight, dep,
radius, fltType, aircraftType, airline); radius, fltType, aircraftType, airline);
return true; return true;
} }
// establish the parking position / gate if required if (firstFlight || !dep->getDynamics()->hasParking(gate.parking())) {
if (firstFlight) { // establish the parking position / gate
// if the airport has no parking positions defined, don't log // if the airport has no parking positions defined, don't log
// the warning below. // the warning below.
if (!dep->getDynamics()->hasParkings()) { if (!dep->getDynamics()->hasParkings()) {
return false; return false;
} }
gate = dep->getDynamics()->getAvailableParking(radius, fltType, gate = dep->getDynamics()->getAvailableParking(radius, fltType,
aircraftType, airline); aircraftType, airline);
if (!gate.isValid()) { if (!gate.isValid()) {
SG_LOG(SG_AI, SG_DEV_WARN, "Could not find parking for a " << SG_LOG(SG_AI, SG_DEV_WARN, "Could not find parking for a " <<
aircraftType << aircraftType <<
" of flight type " << fltType << " of flight type " << fltType <<
" of airline " << airline << " of airline " << airline <<
" at airport " << dep->getId()); " at airport " << dep->getId());
return false; return false;
} }
} }
if (!gate.isValid()) { if (!gate.isValid()) {
SG_LOG(SG_AI, SG_DEV_WARN, "Gate " << gate.parking()->ident() << " not valid createPushBackFallBack at " << dep->getId());
createPushBackFallBack(ac, firstFlight, dep, createPushBackFallBack(ac, firstFlight, dep,
radius, fltType, aircraftType, airline); radius, fltType, aircraftType, airline);
return true; return true;
@ -95,23 +98,28 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
FGParking *parking = gate.parking(); FGParking *parking = gate.parking();
if (parking && parking->getPushBackPoint() != nullptr) { if (parking && parking->getPushBackPoint() != nullptr) {
FGTaxiRoute route = groundNet->findShortestRoute(parking, parking->getPushBackPoint(), false); FGTaxiRoute route = groundNet->findShortestRoute(parking, parking->getPushBackPoint(), false);
SG_LOG(SG_AI, SG_BULK, "Creating Pushback : \t" << parking->getPushBackPoint()->getIndex()); SG_LOG(SG_AI, SG_BULK, "Creating Pushback from " << parking->ident() << " to " << parking->getPushBackPoint()->getIndex());
int size = route.size(); int size = route.size();
if (size < 2) { if (size < 2) {
SG_LOG(SG_AI, SG_DEV_WARN, "Push back route from gate " << parking->ident() << " has only " << size << " nodes."); SG_LOG(SG_AI, SG_DEV_WARN, "Push back route from gate " << parking->ident() << " has only " << size << " nodes.\n" << "Using " << parking->getPushBackPoint());
SG_LOG(SG_AI, SG_DEV_WARN, "Using " << parking->getPushBackPoint());
} }
route.first(); route.first();
FGTaxiNodeRef node; FGTaxiNodeRef node;
int rte; int rte;
if (waypoints.size()>0) {
// This will be a parking from a previous leg which still contains the forward speed
waypoints.back()->setSpeed(vTaxiBackward);
}
while (route.next(node, &rte)) while (route.next(node, &rte))
{ {
char buffer[20]; char buffer[20];
snprintf (buffer, sizeof(buffer), "pushback-%d4", (short)node->getIndex()); sprintf (buffer, "pushback-%03d", (short)node->getIndex());
FGAIWaypoint *wpt = createOnGround(ac, string(buffer), node->geod(), dep->getElevation(), -vTaxiBackward); FGAIWaypoint *wpt = createOnGround(ac, string(buffer), node->geod(), dep->getElevation(), vTaxiBackward);
/* /*
if (previous) { if (previous) {
@ -143,11 +151,11 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
SG_LOG(SG_AI, SG_DEV_WARN, "Gate " << parking->ident() << " at " << dep->getId() SG_LOG(SG_AI, SG_DEV_WARN, "Gate " << parking->ident() << " at " << dep->getId()
<< " doesn't seem to have pushforward routes associated with it."); << " doesn't seem to have pushforward routes associated with it.");
FGAIWaypoint *wpt = createOnGround(ac, string("park"), dep->geod(), dep->getElevation(), vTaxiReduced); FGAIWaypoint *wpt = createOnGround(ac, string("park"), parking->geod(), dep->getElevation(), vTaxiReduced);
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
SGGeod coord; SGGeod coord;
SGGeodesy::direct(dep->geod(), parking->getHeading(), 2.0, coord, az2); SGGeodesy::direct(parking->geod(), parking->getHeading(), 2.0, coord, az2);
wpt = createOnGround(ac, string("taxiStart"), coord, dep->getElevation(), vTaxiReduced); wpt = createOnGround(ac, string("taxiStart"), coord, dep->getElevation(), vTaxiReduced);
pushBackWaypoint(wpt); pushBackWaypoint(wpt);
return true; return true;
@ -158,16 +166,20 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
double parkingHeading = parking->getHeading(); double parkingHeading = parking->getHeading();
SG_LOG(SG_AI, SG_BULK, "Creating Pushforward : \t" << pushForwardSegment->getEnd()->getIndex() << " Length : \t" << distance); SG_LOG(SG_AI, SG_BULK, "Creating Pushforward from ID " << pushForwardSegment->getEnd()->getIndex() << " Length : \t" << distance);
// Add the parking if on first leg and not repeat
int numSegments = distance/2.0; if (waypoints.size() == 0) {
pushBackWaypoint( createOnGround(ac, parking->getName(), parking->geod(), dep->getElevation(), vTaxiReduced));
}
// Make sure we have at least three WPs
int numSegments = distance>15?(distance/5.0):3;
for (int i = 1; i < numSegments; i++) { for (int i = 1; i < numSegments; i++) {
SGGeod pushForwardPt; SGGeod pushForwardPt;
SGGeodesy::direct(parking->geod(), parkingHeading, SGGeodesy::direct(parking->geod(), parkingHeading,
(((double)i / numSegments) * distance), pushForwardPt, az2); (((double)i / numSegments) * distance), pushForwardPt, az2);
char buffer[20]; char buffer[20];
snprintf(buffer, sizeof(buffer), "pushforward-%d4", (short)i); sprintf(buffer, "pushforward-%03d", (short)i);
FGAIWaypoint *wpt = createOnGround(ac, string(buffer), pushForwardPt, dep->getElevation(), vTaxiReduced); FGAIWaypoint *wpt = createOnGround(ac, string(buffer), pushForwardPt, dep->getElevation(), vTaxiReduced);
wpt->setRouteIndex(pushForwardSegment->getIndex()); wpt->setRouteIndex(pushForwardSegment->getIndex());

View file

@ -287,6 +287,14 @@ FGParking* FGAirportDynamics::innerGetAvailableParking(double radius, const stri
return candidates.front(); return candidates.front();
} }
bool FGAirportDynamics::hasParking(FGParking* parking) const
{
return std::find(parent()->groundNetwork()->allParkings().begin(),
parent()->groundNetwork()->allParkings().end(),
parking)
!= parent()->groundNetwork()->allParkings().end();
}
bool FGAirportDynamics::hasParkings() const bool FGAirportDynamics::hasParkings() const
{ {
return !parent()->groundNetwork()->allParkings().empty(); return !parent()->groundNetwork()->allParkings().empty();

View file

@ -116,6 +116,8 @@ public:
std::string& runway, std::string& runway,
double heading ); double heading );
bool hasParking(FGParking* parking) const;
bool hasParkings() const; bool hasParkings() const;
/** /**

View file

@ -301,7 +301,7 @@ FGTaxiNodeRef FGGroundNetwork::findNearestNodeOnRunway(const SGGeod & aGeod, FGR
double exitHeading = SGGeodesy::courseDeg((*it)->geod(), double exitHeading = SGGeodesy::courseDeg((*it)->geod(),
(exitSegments.back())->geod()); (exitSegments.back())->geod());
diff = fabs(aRunway->headingDeg() - exitHeading); diff = fabs(aRunway->headingDeg() - exitHeading);
if (diff > 10) { if (diff > 80) {
// Only exits going in our direction // Only exits going in our direction
continue; continue;
} }

View file

@ -1,8 +1,8 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<groundnet> <groundnet>
<version>1</version> <version>1</version>
<fgaversion>Sun, 09 May 2021 19:33:40 GMT by FlightgearAirports 0.0.31</fgaversion> <fgaversion>Wed, 11 Aug 2021 18:28:41 GMT by FlightgearAirports 0.0.33</fgaversion>
<name>unknown</name> <name>PortreeKid</name>
<frequencies> <frequencies>
<APPROACH>13510</APPROACH> <APPROACH>13510</APPROACH>
<DEPARTURE>11840</DEPARTURE> <DEPARTURE>11840</DEPARTURE>
@ -17,8 +17,8 @@
<TOWER>12470</TOWER> <TOWER>12470</TOWER>
</frequencies> </frequencies>
<parkingList> <parkingList>
<Parking index="2" type="gate" lat="S33 55.6818" lon="E151 10.7652" heading="60.0" radius="40" name="Startup Location" number="undefined" pushBackRoute="241"/> <Parking index="2" type="gate" lat="S33 55.6818" lon="E151 10.7652" heading="60.0" radius="40" name="Startup Location" number="undefined" pushBackRoute="237"/>
<Parking index="3" type="gate" lat="S33 55.647" lon="E151 10.7772" heading="147.0" radius="40" name="Startup Location" number="undefined" pushBackRoute="245"/> <Parking index="3" type="gate" lat="S33 55.647" lon="E151 10.7772" heading="147.0" radius="40" name="Startup Location" number="undefined" pushBackRoute="241"/>
<Parking index="4" type="ga" lat="S33 56.0412" lon="E151 11.2842" heading="189.0" radius="8" name="107" number="undefined"/> <Parking index="4" type="ga" lat="S33 56.0412" lon="E151 11.2842" heading="189.0" radius="8" name="107" number="undefined"/>
<Parking index="5" type="ga" lat="S33 56.043" lon="E151 11.2968" heading="189.0" radius="8" name="106" number="undefined"/> <Parking index="5" type="ga" lat="S33 56.043" lon="E151 11.2968" heading="189.0" radius="8" name="106" number="undefined"/>
<Parking index="6" type="ga" lat="S33 56.0448" lon="E151 11.3112" heading="189.0" radius="8" name="105" number="undefined"/> <Parking index="6" type="ga" lat="S33 56.0448" lon="E151 11.3112" heading="189.0" radius="8" name="105" number="undefined"/>
@ -30,83 +30,83 @@
<Parking index="17" type="gate" lat="S33 56.601" lon="E151 10.821" heading="164.0" radius="18" name="REMOTE-" number="102B"/> <Parking index="17" type="gate" lat="S33 56.601" lon="E151 10.821" heading="164.0" radius="18" name="REMOTE-" number="102B"/>
<Parking index="18" type="gate" lat="S33 56.6058" lon="E151 10.7952" heading="164.0" radius="18" name="REMOTE-" number="102A"/> <Parking index="18" type="gate" lat="S33 56.6058" lon="E151 10.7952" heading="164.0" radius="18" name="REMOTE-" number="102A"/>
<Parking index="20" type="gate" lat="S33 56.238" lon="E151 10.1688" heading="254.0" radius="33" name="T1-" airlineCodes="QFA" number="31"/> <Parking index="20" type="gate" lat="S33 56.238" lon="E151 10.1688" heading="254.0" radius="33" name="T1-" airlineCodes="QFA" number="31"/>
<Parking index="35" type="gate" lat="S33 56.7498" lon="E151 10.0512" heading="164.0" radius="33" name="REMOTE-" number="77" pushBackRoute="1234"/> <Parking index="35" type="gate" lat="S33 56.7498" lon="E151 10.0512" heading="164.0" radius="33" name="REMOTE-" number="77" pushBackRoute="1216"/>
<Parking index="37" type="gate" lat="S33 56.7402" lon="E151 10.0968" heading="164.0" radius="33" name="REMOTE-" number="76" pushBackRoute="1253"/> <Parking index="37" type="gate" lat="S33 56.7402" lon="E151 10.0968" heading="164.0" radius="33" name="REMOTE-" number="76" pushBackRoute="1235"/>
<Parking index="40" type="gate" lat="S33 56.235" lon="E151 10.746" heading="59.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="45A" pushBackRoute="1005"/> <Parking index="40" type="gate" lat="S33 56.235" lon="E151 10.746" heading="59.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="45A" pushBackRoute="1000"/>
<Parking index="41" type="gate" lat="S33 56.2248" lon="E151 10.7862" heading="326.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="44A" pushBackRoute="1442"/> <Parking index="41" type="gate" lat="S33 56.2248" lon="E151 10.7862" heading="326.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="44A" pushBackRoute="1421"/>
<Parking index="42" type="gate" lat="S33 56.1558" lon="E151 10.6218" heading="79.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="59" pushBackRoute="876"/> <Parking index="42" type="gate" lat="S33 56.1558" lon="E151 10.6218" heading="79.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="59" pushBackRoute="871"/>
<Parking index="47" type="gate" lat="S33 56.1102" lon="E151 10.8732" heading="190.0" radius="14" name="F-" airlineCodes="RXA" number="02"/> <Parking index="47" type="gate" lat="S33 56.1102" lon="E151 10.8732" heading="190.0" radius="14" name="F-" airlineCodes="RXA" number="02"/>
<Parking index="48" type="gate" lat="S33 56.1588" lon="E151 10.65" heading="303.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="58" pushBackRoute="1003"/> <Parking index="48" type="gate" lat="S33 56.1588" lon="E151 10.65" heading="303.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="58" pushBackRoute="998"/>
<Parking index="49" type="gate" lat="S33 56.2062" lon="E151 10.794" heading="280.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="42" pushBackRoute="1437"/> <Parking index="49" type="gate" lat="S33 56.2062" lon="E151 10.794" heading="280.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="42" pushBackRoute="1416"/>
<Parking index="50" type="gate" lat="S33 56.358" lon="E151 10.0182" heading="262.0" radius="26" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="55" pushBackRoute="501"/> <Parking index="50" type="gate" lat="S33 56.358" lon="E151 10.0182" heading="262.0" radius="26" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="55" pushBackRoute="497"/>
<Parking index="51" type="gate" lat="S33 56.2578" lon="E151 10.092" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="30" pushBackRoute="559"/> <Parking index="51" type="gate" lat="S33 56.2578" lon="E151 10.092" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="30" pushBackRoute="555"/>
<Parking index="52" type="cargo" lat="S33 55.953" lon="E151 10.0842" heading="296.7" radius="34" name="FREGHT-" number="06" pushBackRoute="1060"/> <Parking index="52" type="cargo" lat="S33 55.953" lon="E151 10.0842" heading="296.7" radius="34" name="FREGHT-" number="06" pushBackRoute="1054"/>
<Parking index="53" type="gate" lat="S33 56.4342" lon="E151 9.831" heading="47.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="61" pushBackRoute="611"/> <Parking index="53" type="gate" lat="S33 56.4342" lon="E151 9.831" heading="47.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="61" pushBackRoute="606"/>
<Parking index="54" type="gate" lat="S33 56.3148" lon="E151 9.906" heading="83.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="50" pushBackRoute="752"/> <Parking index="54" type="gate" lat="S33 56.3148" lon="E151 9.906" heading="83.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="50" pushBackRoute="747"/>
<Parking index="55" type="gate" lat="S33 56.0838" lon="E151 10.755" heading="99.7" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="31A" pushBackRoute="1482"/> <Parking index="55" type="gate" lat="S33 56.0838" lon="E151 10.755" heading="99.7" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="31A" pushBackRoute="1461"/>
<Parking index="56" type="gate" lat="S33 56.0868" lon="E151 10.8162" heading="279.4" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="32" pushBackRoute="394"/> <Parking index="56" type="gate" lat="S33 56.0868" lon="E151 10.8162" heading="279.4" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="32" pushBackRoute="390"/>
<Parking index="57" type="gate" lat="S33 56.106" lon="E151 10.8072" heading="286.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="34" pushBackRoute="1080"/> <Parking index="57" type="gate" lat="S33 56.106" lon="E151 10.8072" heading="286.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="34" pushBackRoute="1074"/>
<Parking index="58" type="gate" lat="S33 56.133" lon="E151 10.8012" heading="279.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="36" pushBackRoute="388"/> <Parking index="58" type="gate" lat="S33 56.133" lon="E151 10.8012" heading="279.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="36" pushBackRoute="384"/>
<Parking index="59" type="gate" lat="S33 56.1588" lon="E151 10.7928" heading="280.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="38" pushBackRoute="382"/> <Parking index="59" type="gate" lat="S33 56.1588" lon="E151 10.7928" heading="280.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="38" pushBackRoute="378"/>
<Parking index="60" type="gate" lat="S33 56.175" lon="E151 10.74" heading="99.2" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="39" pushBackRoute="1003"/> <Parking index="60" type="gate" lat="S33 56.175" lon="E151 10.74" heading="99.2" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="39" pushBackRoute="998"/>
<Parking index="61" type="gate" lat="S33 56.145" lon="E151 10.7442" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="35" pushBackRoute="1002"/> <Parking index="61" type="gate" lat="S33 56.145" lon="E151 10.7442" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="35" pushBackRoute="997"/>
<Parking index="62" type="gate" lat="S33 56.1138" lon="E151 10.7538" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="33" pushBackRoute="1001"/> <Parking index="62" type="gate" lat="S33 56.1138" lon="E151 10.7538" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="33" pushBackRoute="996"/>
<Parking index="63" type="gate" lat="S33 56.091" lon="E151 10.665" heading="280.3" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="52" pushBackRoute="1482"/> <Parking index="63" type="gate" lat="S33 56.091" lon="E151 10.665" heading="280.3" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="52" pushBackRoute="1461"/>
<Parking index="64" type="gate" lat="S33 56.1138" lon="E151 10.656" heading="279.7" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="54" pushBackRoute="1496"/> <Parking index="64" type="gate" lat="S33 56.1138" lon="E151 10.656" heading="279.7" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="54" pushBackRoute="1475"/>
<Parking index="65" type="gate" lat="S33 56.1372" lon="E151 10.6512" heading="280.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="56" pushBackRoute="1002"/> <Parking index="65" type="gate" lat="S33 56.1372" lon="E151 10.6512" heading="280.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="56" pushBackRoute="997"/>
<Parking index="66" type="gate" lat="S33 56.1348" lon="E151 10.614" heading="99.9" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="57" pushBackRoute="877"/> <Parking index="66" type="gate" lat="S33 56.1348" lon="E151 10.614" heading="99.9" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="57" pushBackRoute="872"/>
<Parking index="67" type="gate" lat="S33 56.1078" lon="E151 10.6182" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="55" pushBackRoute="878"/> <Parking index="67" type="gate" lat="S33 56.1078" lon="E151 10.6182" heading="100.0" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="55" pushBackRoute="873"/>
<Parking index="68" type="gate" lat="S33 56.0772" lon="E151 10.623" heading="99.4" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="53" pushBackRoute="881"/> <Parking index="68" type="gate" lat="S33 56.0772" lon="E151 10.623" heading="99.4" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="53" pushBackRoute="876"/>
<Parking index="69" type="gate" lat="S33 56.046" lon="E151 10.629" heading="100.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="49" pushBackRoute="997"/> <Parking index="69" type="gate" lat="S33 56.046" lon="E151 10.629" heading="100.2" radius="18" name="T2-" airlineCodes="VOZ,OZW" number="49" pushBackRoute="992"/>
<Parking index="71" type="gate" lat="S33 55.9098" lon="E151 10.815" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="02" pushBackRoute="987"/> <Parking index="71" type="gate" lat="S33 55.9098" lon="E151 10.815" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="02" pushBackRoute="982"/>
<Parking index="72" type="gate" lat="S33 55.914" lon="E151 10.8438" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="01" pushBackRoute="988"/> <Parking index="72" type="gate" lat="S33 55.914" lon="E151 10.8438" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="01" pushBackRoute="983"/>
<Parking index="73" type="gate" lat="S33 55.9332" lon="E151 10.6062" heading="70.3" radius="18" name="T3-" airlineCodes="QFA" number="14" pushBackRoute="888"/> <Parking index="73" type="gate" lat="S33 55.9332" lon="E151 10.6062" heading="70.3" radius="18" name="T3-" airlineCodes="QFA" number="14" pushBackRoute="883"/>
<Parking index="74" type="gate" lat="S33 55.9182" lon="E151 10.5858" heading="85.2" radius="18" name="T3-" airlineCodes="QFA" number="12" pushBackRoute="889"/> <Parking index="74" type="gate" lat="S33 55.9182" lon="E151 10.5858" heading="85.2" radius="18" name="T3-" airlineCodes="QFA" number="12" pushBackRoute="884"/>
<Parking index="75" type="gate" lat="S33 55.8942" lon="E151 10.5792" heading="115.1" radius="33" name="T3-" airlineCodes="QFA" number="11" pushBackRoute="993"/> <Parking index="75" type="gate" lat="S33 55.8942" lon="E151 10.5792" heading="115.1" radius="33" name="T3-" airlineCodes="QFA" number="11" pushBackRoute="988"/>
<Parking index="76" type="gate" lat="S33 55.851" lon="E151 10.5738" heading="168.0" radius="33" name="T3-" airlineCodes="QFA" number="10" pushBackRoute="890"/> <Parking index="76" type="gate" lat="S33 55.851" lon="E151 10.5738" heading="168.0" radius="33" name="T3-" airlineCodes="QFA" number="10" pushBackRoute="885"/>
<Parking index="77" type="gate" lat="S33 55.86" lon="E151 10.6038" heading="188.2" radius="18" name="T3-" airlineCodes="QFA" number="09" pushBackRoute="891"/> <Parking index="77" type="gate" lat="S33 55.86" lon="E151 10.6038" heading="188.2" radius="18" name="T3-" airlineCodes="QFA" number="09" pushBackRoute="886"/>
<Parking index="78" type="gate" lat="S33 55.8732" lon="E151 10.6278" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="08" pushBackRoute="892"/> <Parking index="78" type="gate" lat="S33 55.8732" lon="E151 10.6278" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="08" pushBackRoute="887"/>
<Parking index="79" type="gate" lat="S33 55.878" lon="E151 10.6542" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="07" pushBackRoute="905"/> <Parking index="79" type="gate" lat="S33 55.878" lon="E151 10.6542" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="07" pushBackRoute="900"/>
<Parking index="80" type="gate" lat="S33 55.89" lon="E151 10.6812" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="06" pushBackRoute="906"/> <Parking index="80" type="gate" lat="S33 55.89" lon="E151 10.6812" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="06" pushBackRoute="901"/>
<Parking index="81" type="gate" lat="S33 55.8942" lon="E151 10.7142" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="05" pushBackRoute="907"/> <Parking index="81" type="gate" lat="S33 55.8942" lon="E151 10.7142" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="05" pushBackRoute="902"/>
<Parking index="82" type="gate" lat="S33 55.8882" lon="E151 10.7502" heading="190.0" radius="33" name="T3-" airlineCodes="QFA" number="04" pushBackRoute="990"/> <Parking index="82" type="gate" lat="S33 55.8882" lon="E151 10.7502" heading="190.0" radius="33" name="T3-" airlineCodes="QFA" number="04" pushBackRoute="985"/>
<Parking index="83" type="gate" lat="S33 55.9038" lon="E151 10.782" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="03" pushBackRoute="989"/> <Parking index="83" type="gate" lat="S33 55.9038" lon="E151 10.782" heading="190.0" radius="18" name="T3-" airlineCodes="QFA" number="03" pushBackRoute="984"/>
<Parking index="84" type="gate" lat="S33 56.3562" lon="E151 9.8748" heading="149.5" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="54" pushBackRoute="752"/> <Parking index="84" type="gate" lat="S33 56.3562" lon="E151 9.8748" heading="149.5" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="54" pushBackRoute="747"/>
<Parking index="85" type="gate" lat="S33 56.3982" lon="E151 9.8238" heading="83.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="63" pushBackRoute="621"/> <Parking index="85" type="gate" lat="S33 56.3982" lon="E151 9.8238" heading="83.2" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="63" pushBackRoute="616"/>
<Parking index="86" type="gate" lat="S33 56.4288" lon="E151 9.8772" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="60" pushBackRoute="608"/> <Parking index="86" type="gate" lat="S33 56.4288" lon="E151 9.8772" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="60" pushBackRoute="603"/>
<Parking index="87" type="gate" lat="S33 56.418" lon="E151 9.9228" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="59" pushBackRoute="584"/> <Parking index="87" type="gate" lat="S33 56.418" lon="E151 9.9228" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="59" pushBackRoute="579"/>
<Parking index="88" type="gate" lat="S33 56.409" lon="E151 9.969" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="58" pushBackRoute="581"/> <Parking index="88" type="gate" lat="S33 56.409" lon="E151 9.969" heading="344.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="58" pushBackRoute="576"/>
<Parking index="89" type="gate" lat="S33 56.388" lon="E151 10.011" heading="304.0" radius="40" name="T1-" airlineCodes="UAE" number="57" pushBackRoute="1106"/> <Parking index="89" type="gate" lat="S33 56.388" lon="E151 10.011" heading="304.0" radius="40" name="T1-" airlineCodes="UAE" number="57" pushBackRoute="1100"/>
<Parking index="90" type="gate" lat="S33 56.3322" lon="E151 9.9918" heading="254.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA,QFA" number="53" pushBackRoute="564"/> <Parking index="90" type="gate" lat="S33 56.3322" lon="E151 9.9918" heading="254.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA,QFA" number="53" pushBackRoute="560"/>
<Parking index="91" type="gate" lat="S33 56.295" lon="E151 9.9732" heading="254.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA,QFA" number="51" pushBackRoute="562"/> <Parking index="91" type="gate" lat="S33 56.295" lon="E151 9.9732" heading="254.0" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA,QFA" number="51" pushBackRoute="558"/>
<Parking index="92" type="gate" lat="S33 56.2962" lon="E151 10.1052" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="32" pushBackRoute="502"/> <Parking index="92" type="gate" lat="S33 56.2962" lon="E151 10.1052" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="32" pushBackRoute="498"/>
<Parking index="93" type="gate" lat="S33 56.334" lon="E151 10.1148" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="34" pushBackRoute="1127"/> <Parking index="93" type="gate" lat="S33 56.334" lon="E151 10.1148" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="34" pushBackRoute="1121"/>
<Parking index="94" type="gate" lat="S33 56.3718" lon="E151 10.131" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="36" pushBackRoute="499"/> <Parking index="94" type="gate" lat="S33 56.3718" lon="E151 10.131" heading="74.0" radius="33" name="T1-" airlineCodes="QFA" number="36" pushBackRoute="495"/>
<Parking index="95" type="gate" lat="S33 56.3538" lon="E151 10.1928" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="37"/> <Parking index="95" type="gate" lat="S33 56.3538" lon="E151 10.1928" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="37"/>
<Parking index="96" type="gate" lat="S33 56.316" lon="E151 10.179" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="35"/> <Parking index="96" type="gate" lat="S33 56.316" lon="E151 10.179" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="35"/>
<Parking index="97" type="gate" lat="S33 56.277" lon="E151 10.173" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="33" pushBackRoute="633"/> <Parking index="97" type="gate" lat="S33 56.277" lon="E151 10.173" heading="255.0" radius="33" name="T1-" airlineCodes="QFA" number="33" pushBackRoute="628"/>
<Parking index="98" type="gate" lat="S33 56.1678" lon="E151 10.2072" heading="167.8" radius="33" name="T1-" airlineCodes="UAE,ETD,QFA" number="25" pushBackRoute="1062"/> <Parking index="98" type="gate" lat="S33 56.1678" lon="E151 10.2072" heading="167.8" radius="33" name="T1-" airlineCodes="UAE,ETD,QFA" number="25" pushBackRoute="1056"/>
<Parking index="99" type="gate" lat="S33 56.175" lon="E151 10.152" heading="178.0" radius="40" name="T1-" airlineCodes="UAE,ETD,QFA" number="24" pushBackRoute="1063"/> <Parking index="99" type="gate" lat="S33 56.175" lon="E151 10.152" heading="178.0" radius="40" name="T1-" airlineCodes="UAE,ETD,QFA" number="24" pushBackRoute="1057"/>
<Parking index="100" type="gate" lat="S33 56.139" lon="E151 10.089" heading="238.6" radius="40" name="T1-" airlineCodes="UAE,ETD" number="10" pushBackRoute="1063"/> <Parking index="100" type="gate" lat="S33 56.139" lon="E151 10.089" heading="238.6" radius="40" name="T1-" airlineCodes="UAE,ETD" number="10" pushBackRoute="1057"/>
<Parking index="101" type="cargo" lat="S33 55.8642" lon="E151 10.0758" heading="257.9" radius="33" name="FREGHT-" number="04" pushBackRoute="1058"/> <Parking index="101" type="cargo" lat="S33 55.8642" lon="E151 10.0758" heading="257.9" radius="33" name="FREGHT-" number="04" pushBackRoute="1052"/>
<Parking index="102" type="gate" lat="S33 56.088" lon="E151 10.0722" heading="257.6" radius="40" name="T1-" airlineCodes="UAE,ETD" number="09" pushBackRoute="1064"/> <Parking index="102" type="gate" lat="S33 56.088" lon="E151 10.0722" heading="257.6" radius="40" name="T1-" airlineCodes="UAE,ETD" number="09" pushBackRoute="1058"/>
<Parking index="103" type="cargo" lat="S33 55.7892" lon="E151 10.0518" heading="258.5" radius="33" name="FREGHT-" number="02" pushBackRoute="1199"/> <Parking index="103" type="cargo" lat="S33 55.7892" lon="E151 10.0518" heading="258.5" radius="33" name="FREGHT-" number="02" pushBackRoute="1181"/>
<Parking index="104" type="cargo" lat="S33 55.74" lon="E151 10.1022" heading="347.0" radius="40" name="FREGHT-" number="01" pushBackRoute="1199"/> <Parking index="104" type="cargo" lat="S33 55.74" lon="E151 10.1022" heading="347.0" radius="40" name="FREGHT-" number="01" pushBackRoute="1181"/>
<Parking index="105" type="cargo" lat="S33 55.827" lon="E151 10.062" heading="257.2" radius="33" name="FREGHT-" number="03" pushBackRoute="129"/> <Parking index="105" type="cargo" lat="S33 55.827" lon="E151 10.062" heading="257.2" radius="33" name="FREGHT-" number="03" pushBackRoute="125"/>
<Parking index="106" type="gate" lat="S33 56.3712" lon="E151 9.8412" heading="124.1" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="56" pushBackRoute="628"/> <Parking index="106" type="gate" lat="S33 56.3712" lon="E151 9.8412" heading="124.1" radius="33" name="T1-" airlineCodes="UAL,THA,SIA,PAL,JAL,ACA,CSN,DAL,CCA,ANA,AAL,LAN,MAS,BAW,ANZ,AAR,ACI,QTR,HAL,FJI,CAL,HVN,KAL,AIC,CPA,GIA" number="56" pushBackRoute="623"/>
<Parking index="107" type="gate" lat="S33 56.04" lon="E151 10.065" heading="257.9" radius="40" name="T1-" airlineCodes="UAE,ETD" number="08"/> <Parking index="107" type="gate" lat="S33 56.04" lon="E151 10.065" heading="257.9" radius="40" name="T1-" airlineCodes="UAE,ETD" number="08"/>
<Parking index="108" type="cargo" lat="S33 55.9032" lon="E151 10.0818" heading="257.6" radius="33" name="FREGHT-" number="05" pushBackRoute="1059"/> <Parking index="108" type="cargo" lat="S33 55.9032" lon="E151 10.0818" heading="257.6" radius="33" name="FREGHT-" number="05" pushBackRoute="1053"/>
<Parking index="109" type="gate" lat="S33 55.9578" lon="E151 10.6062" heading="85.0" radius="17.3" name="T3-" airlineCodes="QFA" number="16" pushBackRoute="888"/> <Parking index="109" type="gate" lat="S33 55.9578" lon="E151 10.6062" heading="85.0" radius="17.3" name="T3-" airlineCodes="QFA" number="16" pushBackRoute="883"/>
<Parking index="110" type="gate" lat="S33 56.196" lon="E151 10.731" heading="90.5" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="41" pushBackRoute="1004"/> <Parking index="110" type="gate" lat="S33 56.196" lon="E151 10.731" heading="90.5" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="41" pushBackRoute="999"/>
<Parking index="111" type="gate" lat="S33 56.2212" lon="E151 10.7202" heading="79.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="43" pushBackRoute="1006"/> <Parking index="111" type="gate" lat="S33 56.2212" lon="E151 10.7202" heading="79.0" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="43" pushBackRoute="1001"/>
<Parking index="112" type="gate" lat="S33 56.181" lon="E151 10.788" heading="277.9" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="40" pushBackRoute="1440"/> <Parking index="112" type="gate" lat="S33 56.181" lon="E151 10.788" heading="277.9" radius="18" name="T2-" airlineCodes="VOZ, OZW" number="40" pushBackRoute="1419"/>
<Parking index="118" type="gate" lat="S33 56.0622" lon="E151 10.191" heading="12.6" radius="33" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="11" pushBackRoute="1212"/> <Parking index="118" type="gate" lat="S33 56.0622" lon="E151 10.191" heading="12.6" radius="33" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="11" pushBackRoute="1194"/>
<Parking index="119" type="gate" lat="S33 56.0262" lon="E151 10.1778" heading="129.6" radius="33" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="12" pushBackRoute="1061"/> <Parking index="119" type="gate" lat="S33 56.0262" lon="E151 10.1778" heading="129.6" radius="33" name="T1-" airlineCodes="XAX,TGW,AVN,ANG,FJI " number="12" pushBackRoute="1055"/>
<Parking index="120" type="gate" lat="S33 55.701" lon="E151 10.4928" heading="78.0" radius="33" name="REMOTE-" number="85" pushBackRoute="1527"/> <Parking index="120" type="gate" lat="S33 55.701" lon="E151 10.4928" heading="78.0" radius="33" name="REMOTE-" number="85" pushBackRoute="1506"/>
<Parking index="121" type="gate" lat="S33 55.6632" lon="E151 10.4772" heading="78.0" radius="33" name="REMOTE-" number="84" pushBackRoute="280"/> <Parking index="121" type="gate" lat="S33 55.6632" lon="E151 10.4772" heading="78.0" radius="33" name="REMOTE-" number="84" pushBackRoute="276"/>
<Parking index="122" type="gate" lat="S33 55.623" lon="E151 10.47" heading="78.0" radius="33" name="REMOTE-" number="83" pushBackRoute="279"/> <Parking index="122" type="gate" lat="S33 55.623" lon="E151 10.47" heading="78.0" radius="33" name="REMOTE-" number="83" pushBackRoute="275"/>
<Parking index="123" type="gate" lat="S33 56.0898" lon="E151 10.878" heading="190.0" radius="14" name="F-" airlineCodes="RXA" number="01"/> <Parking index="123" type="gate" lat="S33 56.0898" lon="E151 10.878" heading="190.0" radius="14" name="F-" airlineCodes="RXA" number="01"/>
<Parking index="124" type="gate" lat="S33 55.6128" lon="E151 10.8108" heading="100.0" radius="33" name="Startup Location" number="undefined" pushBackRoute="244"/> <Parking index="124" type="gate" lat="S33 55.6128" lon="E151 10.8108" heading="100.0" radius="33" name="Startup Location" number="undefined" pushBackRoute="240"/>
</parkingList> </parkingList>
<TaxiNodes> <TaxiNodes>
<node index="10" lat="S33 56.67" lon="E151 10.344" isOnRunway="0"/> <node index="10" lat="S33 56.67" lon="E151 10.344" isOnRunway="0"/>
@ -174,7 +174,7 @@
<node index="154" lat="S33 56.7108" lon="E151 10.5522" isOnRunway="1" holdPointType="none"/> <node index="154" lat="S33 56.7108" lon="E151 10.5522" isOnRunway="1" holdPointType="none"/>
<node index="155" lat="S33 56.7168" lon="E151 10.5642" isOnRunway="0" holdPointType="none"/> <node index="155" lat="S33 56.7168" lon="E151 10.5642" isOnRunway="0" holdPointType="none"/>
<node index="156" lat="S33 56.7198" lon="E151 10.578" isOnRunway="0" holdPointType="none"/> <node index="156" lat="S33 56.7198" lon="E151 10.578" isOnRunway="0" holdPointType="none"/>
<node index="157" lat="S33 56.7198" lon="E151 10.596" isOnRunway="0" holdPointType="none"/> <node index="157" lat="S33 56.720151" lon="E151 10.596707" isOnRunway="0"/>
<node index="158" lat="S33 56.682" lon="E151 10.668" isOnRunway="0" holdPointType="none"/> <node index="158" lat="S33 56.682" lon="E151 10.668" isOnRunway="0" holdPointType="none"/>
<node index="159" lat="S33 56.6898" lon="E151 10.6692" isOnRunway="0" holdPointType="none"/> <node index="159" lat="S33 56.6898" lon="E151 10.6692" isOnRunway="0" holdPointType="none"/>
<node index="160" lat="S33 56.697" lon="E151 10.6668" isOnRunway="0" holdPointType="none"/> <node index="160" lat="S33 56.697" lon="E151 10.6668" isOnRunway="0" holdPointType="none"/>
@ -182,7 +182,7 @@
<node index="162" lat="S33 56.7078" lon="E151 10.656" isOnRunway="0" holdPointType="none"/> <node index="162" lat="S33 56.7078" lon="E151 10.656" isOnRunway="0" holdPointType="none"/>
<node index="163" lat="S33 56.703" lon="E151 10.6968" isOnRunway="0" holdPointType="none"/> <node index="163" lat="S33 56.703" lon="E151 10.6968" isOnRunway="0" holdPointType="none"/>
<node index="164" lat="S33 56.7042" lon="E151 10.6878" isOnRunway="0" holdPointType="none"/> <node index="164" lat="S33 56.7042" lon="E151 10.6878" isOnRunway="0" holdPointType="none"/>
<node index="165" lat="S33 56.7108" lon="E151 10.6482" isOnRunway="0" holdPointType="none"/> <node index="165" lat="S33 56.711339" lon="E151 10.647883" isOnRunway="0"/>
<node index="166" lat="S33 56.6982" lon="E151 10.6908" isOnRunway="0" holdPointType="none"/> <node index="166" lat="S33 56.6982" lon="E151 10.6908" isOnRunway="0" holdPointType="none"/>
<node index="167" lat="S33 56.6952" lon="E151 10.6818" isOnRunway="0" holdPointType="none"/> <node index="167" lat="S33 56.6952" lon="E151 10.6818" isOnRunway="0" holdPointType="none"/>
<node index="168" lat="S33 56.6892" lon="E151 10.6752" isOnRunway="0" holdPointType="none"/> <node index="168" lat="S33 56.6892" lon="E151 10.6752" isOnRunway="0" holdPointType="none"/>
@ -1386,7 +1386,7 @@
<node index="1366" lat="S33 56.601" lon="E151 10.665" isOnRunway="0" holdPointType="none"/> <node index="1366" lat="S33 56.601" lon="E151 10.665" isOnRunway="0" holdPointType="none"/>
<node index="1367" lat="S33 56.6058" lon="E151 10.6572" isOnRunway="0" holdPointType="none"/> <node index="1367" lat="S33 56.6058" lon="E151 10.6572" isOnRunway="0" holdPointType="none"/>
<node index="1368" lat="S33 56.6118" lon="E151 10.65" isOnRunway="0" holdPointType="none"/> <node index="1368" lat="S33 56.6118" lon="E151 10.65" isOnRunway="0" holdPointType="none"/>
<node index="1369" lat="S33 56.619" lon="E151 10.6482" isOnRunway="0" holdPointType="none"/> <node index="1369" lat="S33 56.6244" lon="E151 10.65" isOnRunway="0"/>
<node index="1370" lat="S33 56.1048" lon="E151 11.3088" isOnRunway="0" holdPointType="none"/> <node index="1370" lat="S33 56.1048" lon="E151 11.3088" isOnRunway="0" holdPointType="none"/>
<node index="1371" lat="S33 56.076" lon="E151 11.3202" isOnRunway="0" holdPointType="none"/> <node index="1371" lat="S33 56.076" lon="E151 11.3202" isOnRunway="0" holdPointType="none"/>
<node index="1372" lat="S33 56.0712" lon="E151 11.3208" isOnRunway="0" holdPointType="none"/> <node index="1372" lat="S33 56.0712" lon="E151 11.3208" isOnRunway="0" holdPointType="none"/>
@ -1528,6 +1528,41 @@
<node index="1508" lat="S33 55.662" lon="E151 10.4382" isOnRunway="0" holdPointType="none"/> <node index="1508" lat="S33 55.662" lon="E151 10.4382" isOnRunway="0" holdPointType="none"/>
<node index="1509" lat="S33 55.665" lon="E151 10.4622" isOnRunway="0" holdPointType="none"/> <node index="1509" lat="S33 55.665" lon="E151 10.4622" isOnRunway="0" holdPointType="none"/>
<node index="1510" lat="S33 55.605" lon="E151 10.7508" isOnRunway="0" holdPointType="none"/> <node index="1510" lat="S33 55.605" lon="E151 10.7508" isOnRunway="0" holdPointType="none"/>
<node index="1511" lat="S33 56.6508" lon="E151 10.5276" isOnRunway="1"/>
<node index="1512" lat="S33 56.6298" lon="E151 10.5432" isOnRunway="0"/>
<node index="1513" lat="S33 56.6208" lon="E151 10.5846" isOnRunway="0"/>
<node index="1514" lat="S33 56.6136" lon="E151 10.6128" isOnRunway="0"/>
<node index="1515" lat="S33 56.607471" lon="E151 10.62664" isOnRunway="0"/>
<node index="1516" lat="S33 56.597592" lon="E151 10.634365" isOnRunway="0"/>
<node index="1517" lat="S33 56.5476" lon="E151 10.6242" isOnRunway="0"/>
<node index="1518" lat="S33 56.5824" lon="E151 10.6362" isOnRunway="0"/>
<node index="1519" lat="S33 56.6178" lon="E151 10.6368" isOnRunway="0"/>
<node index="1520" lat="S33 56.6142" lon="E151 10.6254" isOnRunway="0"/>
<node index="1521" lat="S33 56.6178" lon="E151 10.5204" isOnRunway="1"/>
<node index="1522" lat="S33 56.625" lon="E151 10.5294" isOnRunway="1"/>
<node index="1523" lat="S33 56.6376" lon="E151 10.5312" isOnRunway="0"/>
<node index="1524" lat="S33 56.62458" lon="E151 10.56648" isOnRunway="0"/>
<node index="1525" lat="S33 56.550596" lon="E151 10.500147" isOnRunway="1"/>
<node index="1526" lat="S33 56.560743" lon="E151 10.505619" isOnRunway="1"/>
<node index="1527" lat="S33 56.601063" lon="E151 10.533621" isOnRunway="0"/>
<node index="1528" lat="S33 56.648057" lon="E151 10.568061" isOnRunway="0"/>
<node index="1529" lat="S33 56.675026" lon="E151 10.591557" isOnRunway="0"/>
<node index="1530" lat="S33 56.687308" lon="E151 10.604432" isOnRunway="0"/>
<node index="1531" lat="S33 56.697188" lon="E151 10.614409" isOnRunway="0"/>
<node index="1532" lat="S33 56.706266" lon="E151 10.624709" isOnRunway="0"/>
<node index="1533" lat="S33 56.603733" lon="E151 10.644021" isOnRunway="0"/>
<node index="1534" lat="S33 56.628832" lon="E151 10.641124" isOnRunway="0"/>
<node index="1535" lat="S33 56.646722" lon="E151 10.635653" isOnRunway="0"/>
<node index="1536" lat="S33 56.729229" lon="E151 10.60411" isOnRunway="0"/>
<node index="1537" lat="S33 56.777824" lon="E151 10.59027" isOnRunway="0"/>
<node index="1538" lat="S33 56.806127" lon="E151 10.587373" isOnRunway="0"/>
<node index="1539" lat="S33 56.841372" lon="E151 10.582867" isOnRunway="1"/>
<node index="1540" lat="S33 56.864067" lon="E151 10.582545" isOnRunway="1"/>
<node index="1541" lat="S33 56.87982" lon="E151 10.586407" isOnRunway="1"/>
<node index="1542" lat="S33 56.761537" lon="E151 10.557117" isOnRunway="1"/>
<node index="1543" lat="S33 56.746317" lon="E151 10.560336" isOnRunway="1"/>
<node index="1544" lat="S33 56.734836" lon="E151 10.568061" isOnRunway="0"/>
<node index="1545" lat="S33 56.726025" lon="E151 10.583189" isOnRunway="0"/>
</TaxiNodes> </TaxiNodes>
<TaxiWaySegments> <TaxiWaySegments>
<arc begin="2" end="253" isPushBackRoute="1" name="0"/> <arc begin="2" end="253" isPushBackRoute="1" name="0"/>
@ -4597,7 +4632,7 @@
<arc begin="1368" end="1367" isPushBackRoute="0" name="0"/> <arc begin="1368" end="1367" isPushBackRoute="0" name="0"/>
<arc begin="1368" end="1369" isPushBackRoute="0" name="0"/> <arc begin="1368" end="1369" isPushBackRoute="0" name="0"/>
<arc begin="1369" end="1368" isPushBackRoute="0" name="0"/> <arc begin="1369" end="1368" isPushBackRoute="0" name="0"/>
<arc begin="1369" end="446" isPushBackRoute="0" name="Route"/> <arc begin="1369" end="1533" isPushBackRoute="0" name="Route"/>
<arc begin="1371" end="1372" isPushBackRoute="0" name="0"/> <arc begin="1371" end="1372" isPushBackRoute="0" name="0"/>
<arc begin="1372" end="1371" isPushBackRoute="0" name="0"/> <arc begin="1372" end="1371" isPushBackRoute="0" name="0"/>
<arc begin="1371" end="1388" isPushBackRoute="0" name="0"/> <arc begin="1371" end="1388" isPushBackRoute="0" name="0"/>
@ -4813,5 +4848,74 @@
<arc begin="1505" end="1504" isPushBackRoute="1" name="0"/> <arc begin="1505" end="1504" isPushBackRoute="1" name="0"/>
<arc begin="1507" end="1508" isPushBackRoute="0" name="0"/> <arc begin="1507" end="1508" isPushBackRoute="0" name="0"/>
<arc begin="1508" end="1507" isPushBackRoute="0" name="0"/> <arc begin="1508" end="1507" isPushBackRoute="0" name="0"/>
<arc begin="1511" end="1523" isPushBackRoute="0"/>
<arc begin="1523" end="1511" isPushBackRoute="0"/>
<arc begin="1523" end="1512" isPushBackRoute="0"/>
<arc begin="1512" end="1523" isPushBackRoute="0"/>
<arc begin="1512" end="1524" isPushBackRoute="0"/>
<arc begin="1524" end="1512" isPushBackRoute="0"/>
<arc begin="1513" end="1514" isPushBackRoute="0"/>
<arc begin="1514" end="1513" isPushBackRoute="0"/>
<arc begin="1514" end="1515" isPushBackRoute="0"/>
<arc begin="1515" end="1514" isPushBackRoute="0"/>
<arc begin="1517" end="446" isPushBackRoute="0" name="Route"/>
<arc begin="1518" end="1517" isPushBackRoute="0" name="Route"/>
<arc begin="1369" end="1519" isPushBackRoute="0"/>
<arc begin="1519" end="1369" isPushBackRoute="0"/>
<arc begin="1519" end="1520" isPushBackRoute="0"/>
<arc begin="1520" end="1519" isPushBackRoute="0"/>
<arc begin="1520" end="1514" isPushBackRoute="0"/>
<arc begin="1514" end="1520" isPushBackRoute="0"/>
<arc begin="1516" end="1518" isPushBackRoute="0"/>
<arc begin="1518" end="1516" isPushBackRoute="0"/>
<arc begin="1521" end="1522" isPushBackRoute="0"/>
<arc begin="1522" end="1521" isPushBackRoute="0"/>
<arc begin="1522" end="1512" isPushBackRoute="0"/>
<arc begin="1512" end="1522" isPushBackRoute="0"/>
<arc begin="1516" end="1515" isPushBackRoute="0"/>
<arc begin="1515" end="1516" isPushBackRoute="0"/>
<arc begin="1524" end="1513" isPushBackRoute="0"/>
<arc begin="1513" end="1524" isPushBackRoute="0"/>
<arc begin="1525" end="1526" isPushBackRoute="0"/>
<arc begin="1526" end="1525" isPushBackRoute="0"/>
<arc begin="1526" end="1527" isPushBackRoute="0"/>
<arc begin="1527" end="1526" isPushBackRoute="0"/>
<arc begin="1527" end="1528" isPushBackRoute="0"/>
<arc begin="1528" end="1527" isPushBackRoute="0"/>
<arc begin="1528" end="1529" isPushBackRoute="0"/>
<arc begin="1529" end="1528" isPushBackRoute="0"/>
<arc begin="1529" end="1530" isPushBackRoute="0"/>
<arc begin="1530" end="1529" isPushBackRoute="0"/>
<arc begin="1530" end="1531" isPushBackRoute="0"/>
<arc begin="1531" end="1530" isPushBackRoute="0"/>
<arc begin="1531" end="1532" isPushBackRoute="0"/>
<arc begin="1532" end="1531" isPushBackRoute="0"/>
<arc begin="1532" end="165" isPushBackRoute="0"/>
<arc begin="165" end="1532" isPushBackRoute="0"/>
<arc begin="1533" end="1518" isPushBackRoute="0" name="Route"/>
<arc begin="1533" end="1534" isPushBackRoute="0"/>
<arc begin="1534" end="1533" isPushBackRoute="0"/>
<arc begin="1534" end="1535" isPushBackRoute="0"/>
<arc begin="1535" end="1534" isPushBackRoute="0"/>
<arc begin="1535" end="1536" isPushBackRoute="0"/>
<arc begin="1536" end="1535" isPushBackRoute="0"/>
<arc begin="1536" end="1537" isPushBackRoute="0"/>
<arc begin="1537" end="1536" isPushBackRoute="0"/>
<arc begin="1537" end="1538" isPushBackRoute="0"/>
<arc begin="1538" end="1537" isPushBackRoute="0"/>
<arc begin="1538" end="1539" isPushBackRoute="0"/>
<arc begin="1539" end="1538" isPushBackRoute="0"/>
<arc begin="1539" end="1540" isPushBackRoute="0"/>
<arc begin="1540" end="1539" isPushBackRoute="0"/>
<arc begin="1540" end="1541" isPushBackRoute="0"/>
<arc begin="1541" end="1540" isPushBackRoute="0"/>
<arc begin="1542" end="1543" isPushBackRoute="0"/>
<arc begin="1543" end="1542" isPushBackRoute="0"/>
<arc begin="1543" end="1544" isPushBackRoute="0"/>
<arc begin="1544" end="1543" isPushBackRoute="0"/>
<arc begin="1544" end="1545" isPushBackRoute="0"/>
<arc begin="1545" end="1544" isPushBackRoute="0"/>
<arc begin="1545" end="157" isPushBackRoute="0"/>
<arc begin="157" end="1545" isPushBackRoute="0"/>
</TaxiWaySegments> </TaxiWaySegments>
</groundnet> </groundnet>

View file

@ -94,7 +94,7 @@ void GroundnetTests::testShortestRoute()
FGTaxiNodeRef end = network->findNearestNodeOnRunway(runway->threshold()); FGTaxiNodeRef end = network->findNearestNodeOnRunway(runway->threshold());
FGTaxiRoute route = network->findShortestRoute(startParking, end); FGTaxiRoute route = network->findShortestRoute(startParking, end);
CPPUNIT_ASSERT_EQUAL(true, network->exists()); CPPUNIT_ASSERT_EQUAL(true, network->exists());
CPPUNIT_ASSERT_EQUAL(29, route.size()); CPPUNIT_ASSERT_EQUAL(25, route.size());
} }
/** /**

View file

@ -148,7 +148,7 @@ void TrafficTests::testPushback()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -164,7 +164,7 @@ void TrafficTests::testPushback()
aiAircraft->FGAIBase::setFlightPlan(std::move(fp)); aiAircraft->FGAIBase::setFlightPlan(std::move(fp));
globals->get_subsystem<FGAIManager>()->attach(aiAircraft); globals->get_subsystem<FGAIManager>()->attach(aiAircraft);
aiAircraft = flyAI(aiAircraft, "flight_EGPH_EGPF_" + std::to_string(departureTime)); aiAircraft = flyAI(aiAircraft, "flight_testPushback_EGPH_EGPF_" + std::to_string(departureTime));
} }
void TrafficTests::testPushbackCargo() void TrafficTests::testPushbackCargo()
@ -205,7 +205,8 @@ void TrafficTests::testPushbackCargo()
const double crs = SGGeodesy::courseDeg(egph->geod(), egpf->geod()); // direct course const double crs = SGGeodesy::courseDeg(egph->geod(), egpf->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -264,7 +265,8 @@ void TrafficTests::testChangeRunway()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -321,7 +323,8 @@ void TrafficTests::testPushforward()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -377,7 +380,8 @@ void TrafficTests::testPushforwardSpeedy()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -434,7 +438,8 @@ void TrafficTests::testPushforwardParkYBBN()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -514,7 +519,8 @@ void TrafficTests::testPushforwardParkYBBNRepeatGa()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,
@ -589,7 +595,8 @@ void TrafficTests::testPushforwardParkYBBNRepeatGate()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time(); time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90; departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft, std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime, flightPlanName, crs, departureTime,