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) {
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;
// SG_LOG(SG_AI, SG_BULK, "Turn tgt_heading to " << tgt_heading);
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);
} 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.
@ -768,11 +772,12 @@ void FGAIAircraft::handleFirstWaypoint() {
//TODO fp should handle this
fp->IncrementWaypoint(eraseWaypoints);
if (!(fp->getNextWaypoint()) && trafficRef)
if (!(fp->getNextWaypoint()) && trafficRef) {
if (!loadNextLeg()) {
setDie(true);
return;
}
}
prev = fp->getPreviousWaypoint(); //first waypoint
SG_LOG(SG_AI, SG_BULK, "Previous WP \t" << prev->getName());
@ -785,7 +790,11 @@ void FGAIAircraft::handleFirstWaypoint() {
setLatitude(prev->getLatitude());
setLongitude(prev->getLongitude());
setSpeed(prev->getSpeed());
if(fp->getLeg()==1) {
setSpeed(0);
} else {
setSpeed(prev->getSpeed());
}
setAltitude(prev->getAltitude());
if (prev->getSpeed() > 0.0)
@ -798,8 +807,11 @@ void FGAIAircraft::handleFirstWaypoint() {
// If next doesn't exist, as in incrementally created flightplans for
// AI/Trafficmanager created plans,
// 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);
} else {
fp->setLeadDistance(1);
}
if (curr->getCrossat() > -1000.0) //use a calculated descent/climb rate
@ -828,7 +840,6 @@ void FGAIAircraft::handleFirstWaypoint() {
prevSpeed = 0;
}
/**
* Check Execution time (currently once every 100 ms)
* 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);
// Leaddistance should be ft
double lead_dist = fp->getLeadDistance();
// experimental: Use fabs, because speed can be negative (I hope) during push_back.
if ((dist_to_go_m < fabs(10.0* speed)) && (speed < 0) && (tgt_speed < 0) && fp->getCurrentWaypoint()->contains("PushBackPoint")) {
tgt_speed = -(dist_to_go_m / 10.0);
if (tgt_speed > -0.5) {
tgt_speed = -0.5;
const double arrivalDist = fabs(10.0*fp->getCurrentWaypoint()->getSpeed());
// arrive at pushback end
if ((dist_to_go_m < arrivalDist) && (speed < 0) && (tgt_speed < 0) && fp->getCurrentWaypoint()->contains("PushBackPoint")) {
// tgt_speed = -(dist_to_go_m / 10.0);
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) {
SG_LOG(SG_AI, SG_BULK, "Set speed of WP from " << fp->getPreviousWaypoint()->getSpeed() << " to " << 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)) {
//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) ||
((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;
speedFraction = 1.0;
prev_dist_to_go = HUGE_VAL;
return true;
} 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
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;
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
// so, the schedule should update and wait for the next departure time.
if (prev->contains("END")) {
SG_LOG(SG_AI, SG_BULK, "Reached " << prev->getName() );
//FIXME Heading Error should be reset
time_t nextDeparture = trafficRef->getDepartureTime();
// 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
*/
void FGAIAircraft::controlHeading(FGAIWaypoint* curr) {
double calc_bearing = fp->getBearing(pos, curr);
if (speed < 0) {
calc_bearing +=180;
SG_NORMALIZE_RANGE(calc_bearing, 0.0, 360.0);
}
const double calc_bearing = speed < 0?SGMiscd::normalizePeriodic(0, 360, fp->getBearing(pos, curr) + 180.0):fp->getBearing(pos, curr);
if (fgIsFinite(calc_bearing)) {
double hdg_error = calc_bearing - tgt_heading;
@ -1020,7 +1053,12 @@ void FGAIAircraft::controlSpeed(FGAIWaypoint* curr, FGAIWaypoint* next) {
if (fabs(speed_diff) > 10) {
prevSpeed = speed;
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 on ground, calculate heading change directly
if (onGround()) {
double headingDiff = fabs(hdg-tgt_heading);
if (headingDiff > 180) {
headingDiff = fabs(headingDiff - 360);
}
const double headingDiff = SGMiscd::normalizePeriodic(-180, 180, hdg-tgt_heading);
// When pushback behind us we still want to move but ...
groundTargetSpeed = tgt_speed * cos(headingDiff * SG_DEGREES_TO_RADIANS);
if (sign(groundTargetSpeed) != sign(tgt_speed)) {
if (fabs(speed) < 2 ) {
if (sign(groundTargetSpeed) != sign(tgt_speed) && fabs(tgt_speed) > 0) {
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.
// 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°
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.
if (speed != 0) {
if (headingDiff > 30.0) {
if (fabs(headingDiff) > 30.0) {
// 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,
// But only do this when the heading error is decreasing.
// FIXME
if ((headingDiff < headingError)) {
if (headingChangeRate > 30)
headingChangeRate = 30;
@ -1134,18 +1180,29 @@ void FGAIAircraft::updateHeading(double dt) {
}
} else {
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);
else
}
else {
headingChangeRate += dt * sign(roll);
}
*/
}
}
}
hdg += headingChangeRate * dt * sqrt(fabs(speed) / 15);
SG_NORMALIZE_RANGE(headingDiff, 0.0, 360.0);
headingError = headingDiff;
// SG_LOG(SG_AI, SG_BULK, "Headingerror " << headingError );
if (fabs(headingError) < 1.0) {
hdg = tgt_heading;
}
@ -1262,8 +1319,6 @@ void FGAIAircraft::handleATCRequests(double dt)
if (!this->getTrafficRef()) {
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
if (controller) {
@ -1491,9 +1546,9 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "Lat\t";
o << "Lon\t";
o << "Callsign\t";
o << "heading change rate\t";
o << "headingErr\t";
o << "headingDiff\t";
o << "headingChangeRate\t";
o << "headingError\t";
o << "hdg\t";
o << "tgt_heading\t";
o << "tgt_speed\t";
@ -1504,9 +1559,7 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "groundTargetSpeed\t";
o << "getVerticalSpeedFPM\t";
o << "getTrueHeadingDeg\t";
o << "Bearing\t";
o << "headingChangeRate\t";
o << "headingError\t";
o << "bearingToWP\t";
o << "Name\t";
o << "WP Lat\t";
@ -1519,25 +1572,23 @@ void FGAIAircraft::dumpCSVHeader(std::ofstream& o) {
o << "Leg\t";
o << "Num WP\t";
o << "Leaddistance\t";
o << "no_roll";
o << "no_roll\t";
o << "roll\t";
o << "stuckCounter";
o << endl;
}
void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) {
double headingDiff = fabs(hdg-tgt_heading);
if (headingDiff > 180) {
headingDiff = fabs(headingDiff - 360);
}
const double headingDiff = SGMiscd::normalizePeriodic(-180, 180, hdg-tgt_heading);
o << lineIndex << "\t";
o << setprecision(12);
o << this->getGeodPos().getLatitudeDeg() << "\t";
o << this->getGeodPos().getLongitudeDeg() << "\t";
o << this->getCallSign() << "\t";
o << headingChangeRate << "\t";
o << headingError << "\t";
o << headingDiff << "\t";
o << headingChangeRate << "\t";
o << headingError << "\t";
o << hdg << "\t";
o << tgt_heading << "\t";
o << tgt_speed << "\t";
@ -1550,8 +1601,6 @@ void FGAIAircraft::dumpCSV(std::ofstream& o, int lineIndex) {
o << round(this->getVerticalSpeedFPM()) << "\t";
o << this->getTrueHeadingDeg() << "\t";
FGAIFlightPlan* fp = this->GetFlightPlan();
o << headingChangeRate << "\t";
o << headingError << "\t";
FGAIWaypoint* currentWP = this->GetFlightPlan()->getCurrentWaypoint();
if (currentWP) {
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);
o << dist_to_go_m << "\t";
} else {
o << "\t\t\t\t\t\t\t\t";
o << "No WP\t\t\t\t\t\t\t\t";
}
if (fp->isValidPlan()) {
o << fp->getLeg() << "\t";
o << fp->getNrOfWayPoints() << "\t";
o << fp->getLeadDistance() << "\t";
} else {
o << "NotValid\t\t";
o << "FP NotValid\t\t";
}
o << this->onGround();
o << this->onGround() << "\t";
o << roll << "\t";
o << stuckCounter;
o << endl;
}
@ -1587,4 +1638,4 @@ std::string FGAIAircraft::getTimeString(int timeOffset)
tm* timeinfo = gmtime(&rawtime);
strftime(ret, 11, "%w/%H:%M:%S", timeinfo);
return ret;
}
}

View file

@ -128,6 +128,7 @@ private:
double headingError;
double minBearing;
double speedFraction;
/**Zero if FP is not active*/
double groundTargetSpeed;
double groundOffset;
@ -172,6 +173,9 @@ private:
std::string transponderCode;
int spinCounter;
/**Kills a flight when it's stuck */
const int AI_STUCK_LIMIT = 100;
int stuckCounter;
double prevSpeed;
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 * 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)) {
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)
{
const size_t pos = std::distance(waypoints.cbegin(), wpt_iterator);
if (!waypoints.empty()) {
const double dist = SGGeodesy::distanceM( waypoints.back()->getPos(), wpt->getPos());
if ( dist < 0.5 ) {
SG_LOG(SG_AI, SG_DEV_ALERT, "Double WP : \t" << wpt->getName() << " not added ");
size_t pos = wpt_iterator - waypoints.begin();
if (waypoints.size()>0) {
double dist = SGGeodesy::distanceM( waypoints.back()->getPos(), wpt->getPos());
if( dist == 0 ) {
SG_LOG(SG_AI, SG_DEBUG, "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);
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
// so we should restore wpt_iterator after push_back
// (or it could be an index in the vector)

View file

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

View file

@ -43,7 +43,8 @@ using std::string;
// TODO: Use James Turner's createOnGround functions.
bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
bool firstFlight, FGAirport *dep,
bool firstFlight,
FGAirport *dep,
double radius,
const string& fltType,
const string& aircraftType,
@ -59,32 +60,34 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
if (!(dep->getDynamics()->getGroundController()->exists())) {
//cerr << "Push Back fallback" << endl;
SG_LOG(SG_AI, SG_DEV_WARN, "No groundcontroller createPushBackFallBack at " << dep->getId());
createPushBackFallBack(ac, firstFlight, dep,
radius, fltType, aircraftType, airline);
return true;
}
// establish the parking position / gate if required
if (firstFlight) {
// if the airport has no parking positions defined, don't log
// the warning below.
if (!dep->getDynamics()->hasParkings()) {
return false;
}
if (firstFlight || !dep->getDynamics()->hasParking(gate.parking())) {
// establish the parking position / gate
// if the airport has no parking positions defined, don't log
// the warning below.
if (!dep->getDynamics()->hasParkings()) {
return false;
}
gate = dep->getDynamics()->getAvailableParking(radius, fltType,
aircraftType, airline);
aircraftType, airline);
if (!gate.isValid()) {
SG_LOG(SG_AI, SG_DEV_WARN, "Could not find parking for a " <<
aircraftType <<
" of flight type " << fltType <<
" of airline " << airline <<
" at airport " << dep->getId());
aircraftType <<
" of flight type " << fltType <<
" of airline " << airline <<
" at airport " << dep->getId());
return false;
}
}
if (!gate.isValid()) {
SG_LOG(SG_AI, SG_DEV_WARN, "Gate " << gate.parking()->ident() << " not valid createPushBackFallBack at " << dep->getId());
createPushBackFallBack(ac, firstFlight, dep,
radius, fltType, aircraftType, airline);
return true;
@ -95,23 +98,28 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
FGParking *parking = gate.parking();
if (parking && parking->getPushBackPoint() != nullptr) {
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();
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, "Using " << parking->getPushBackPoint());
SG_LOG(SG_AI, SG_DEV_WARN, "Push back route from gate " << parking->ident() << " has only " << size << " nodes.\n" << "Using " << parking->getPushBackPoint());
}
route.first();
FGTaxiNodeRef node;
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))
{
char buffer[20];
snprintf (buffer, sizeof(buffer), "pushback-%d4", (short)node->getIndex());
FGAIWaypoint *wpt = createOnGround(ac, string(buffer), node->geod(), dep->getElevation(), -vTaxiBackward);
sprintf (buffer, "pushback-%03d", (short)node->getIndex());
FGAIWaypoint *wpt = createOnGround(ac, string(buffer), node->geod(), dep->getElevation(), vTaxiBackward);
/*
if (previous) {
@ -143,11 +151,11 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
SG_LOG(SG_AI, SG_DEV_WARN, "Gate " << parking->ident() << " at " << dep->getId()
<< " 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);
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);
pushBackWaypoint(wpt);
return true;
@ -158,16 +166,20 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
double parkingHeading = parking->getHeading();
SG_LOG(SG_AI, SG_BULK, "Creating Pushforward : \t" << pushForwardSegment->getEnd()->getIndex() << " Length : \t" << distance);
int numSegments = distance/2.0;
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
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++) {
SGGeod pushForwardPt;
SGGeodesy::direct(parking->geod(), parkingHeading,
(((double)i / numSegments) * distance), pushForwardPt, az2);
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);
wpt->setRouteIndex(pushForwardSegment->getIndex());

View file

@ -287,6 +287,14 @@ FGParking* FGAirportDynamics::innerGetAvailableParking(double radius, const stri
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
{
return !parent()->groundNetwork()->allParkings().empty();

View file

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

View file

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

View file

@ -1,8 +1,8 @@
<?xml version="1.0"?>
<groundnet>
<version>1</version>
<fgaversion>Sun, 09 May 2021 19:33:40 GMT by FlightgearAirports 0.0.31</fgaversion>
<name>unknown</name>
<fgaversion>Wed, 11 Aug 2021 18:28:41 GMT by FlightgearAirports 0.0.33</fgaversion>
<name>PortreeKid</name>
<frequencies>
<APPROACH>13510</APPROACH>
<DEPARTURE>11840</DEPARTURE>
@ -17,8 +17,8 @@
<TOWER>12470</TOWER>
</frequencies>
<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="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="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="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="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"/>
@ -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="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="35" type="gate" lat="S33 56.7498" lon="E151 10.0512" heading="164.0" radius="33" name="REMOTE-" number="77" pushBackRoute="1234"/>
<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="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="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="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="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="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="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="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="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="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="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="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="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="52" type="cargo" lat="S33 55.953" lon="E151 10.0842" heading="296.7" radius="34" name="FREGHT-" number="06" pushBackRoute="1060"/>
<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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="555"/>
<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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="101" type="cargo" lat="S33 55.8642" lon="E151 10.0758" heading="257.9" radius="33" name="FREGHT-" number="04" pushBackRoute="1058"/>
<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="103" type="cargo" lat="S33 55.7892" lon="E151 10.0518" heading="258.5" radius="33" name="FREGHT-" number="02" 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="1199"/>
<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="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="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="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="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="1057"/>
<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="1058"/>
<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="1181"/>
<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="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="108" type="cargo" lat="S33 55.9032" lon="E151 10.0818" heading="257.6" radius="33" name="FREGHT-" number="05" pushBackRoute="1059"/>
<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="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="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="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="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="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="120" type="gate" lat="S33 55.701" lon="E151 10.4928" heading="78.0" radius="33" name="REMOTE-" number="85" pushBackRoute="1527"/>
<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="122" type="gate" lat="S33 55.623" lon="E151 10.47" heading="78.0" radius="33" name="REMOTE-" number="83" pushBackRoute="279"/>
<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="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="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="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="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="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="1055"/>
<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="276"/>
<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="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>
<TaxiNodes>
<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="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="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="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"/>
@ -182,7 +182,7 @@
<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="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="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"/>
@ -1386,7 +1386,7 @@
<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="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="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"/>
@ -1528,6 +1528,41 @@
<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="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>
<TaxiWaySegments>
<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="1369" 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="1372" end="1371" 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="1507" end="1508" 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>
</groundnet>

View file

@ -94,7 +94,7 @@ void GroundnetTests::testShortestRoute()
FGTaxiNodeRef end = network->findNearestNodeOnRunway(runway->threshold());
FGTaxiRoute route = network->findShortestRoute(startParking, end);
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
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -164,7 +164,7 @@ void TrafficTests::testPushback()
aiAircraft->FGAIBase::setFlightPlan(std::move(fp));
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()
@ -205,7 +205,8 @@ void TrafficTests::testPushbackCargo()
const double crs = SGGeodesy::courseDeg(egph->geod(), egpf->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -264,7 +265,8 @@ void TrafficTests::testChangeRunway()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -321,7 +323,8 @@ void TrafficTests::testPushforward()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -377,7 +380,8 @@ void TrafficTests::testPushforwardSpeedy()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -434,7 +438,8 @@ void TrafficTests::testPushforwardParkYBBN()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -514,7 +519,8 @@ void TrafficTests::testPushforwardParkYBBNRepeatGa()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,
@ -589,7 +595,8 @@ void TrafficTests::testPushforwardParkYBBNRepeatGate()
const double crs = SGGeodesy::courseDeg(departureAirport->geod(), arrivalAirport->geod()); // direct course
time_t departureTime = globals->get_time_params()->get_cur_time();
departureTime = departureTime - 90;
departureTime = departureTime + 90;
std::unique_ptr<FGAIFlightPlan> fp(new FGAIFlightPlan(aiAircraft,
flightPlanName, crs, departureTime,