AI Flightplan Leg 4 departure curve
This commit is contained in:
parent
ac8c5386a9
commit
a2b10c1ee3
3 changed files with 46 additions and 9 deletions
|
@ -999,6 +999,21 @@ bool FGAIAircraft::leadPointReached(FGAIWaypoint* curr, FGAIWaypoint* next, int
|
|||
}
|
||||
}
|
||||
|
||||
// We are travelling straight and have passed the waypoint. This would result in a loop.
|
||||
if (next && abs(nextTurnAngle) < 5) {
|
||||
double bearingTowardsCurrent = fp->getBearing(this->getGeodPos(), curr);
|
||||
double headingDiffCurrent = SGMiscd::normalizePeriodic(-180, 180, hdg-bearingTowardsCurrent);
|
||||
double bearingTowardsNext = fp->getBearing(this->getGeodPos(), next);
|
||||
double headingDiffNext = SGMiscd::normalizePeriodic(-180, 180, hdg-bearingTowardsNext);
|
||||
if (abs(headingDiffCurrent) > 80 && speed > 0) {
|
||||
if (fp->getLeg() <= AILeg::CLIMB) {
|
||||
SG_LOG(SG_AI, SG_WARN, getCallSign() << "| possible missed WP at " << trafficRef->getDepartureAirport()->getId() << " " << curr->getName());
|
||||
} else {
|
||||
SG_LOG(SG_AI, SG_WARN, getCallSign() << "| possible missed WP at " << trafficRef->getArrivalAirport()->getId() << " " << curr->getName());
|
||||
}
|
||||
SG_LOG(SG_AI, SG_BULK, getCallSign() << "| headingDiffCurrent " << headingDiffCurrent << " headingDiffNext " << headingDiffNext);
|
||||
}
|
||||
}
|
||||
if ((dist_to_go_m < lead_distance_m) ||
|
||||
((dist_to_go_m > prev_dist_to_go) && (bearing > (minBearing * 1.1))) ) {
|
||||
SG_LOG(SG_AI, SG_BULK, getCallSign() << "|Leadpoint reached Bearing : " << bearing << "\tNext Bearing : " << nextBearing << " Next Turn Angle : " << fabs(nextTurnAngle));
|
||||
|
@ -1159,7 +1174,6 @@ void FGAIAircraft::controlSpeed(FGAIWaypoint* curr, FGAIWaypoint* next) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update target values (heading, alt, speed) depending on flight plan or control properties
|
||||
*/
|
||||
|
|
|
@ -485,7 +485,7 @@ void FGAIFlightPlan::setLeadDistance(double speed,
|
|||
setLeadDistance(lead_distance_m * SG_METER_TO_FEET);
|
||||
SG_LOG(SG_AI, SG_BULK, "Setting Leaddistance " << (lead_distance_ft*SG_FEET_TO_METER) << " Turnradius " << turn_radius_m << " Speed " << speed_mps << " Half turn Angle " << (leadInAngle)/2);
|
||||
if (lead_distance_ft > 1000) {
|
||||
SG_LOG(SG_AI, SG_BULK, "Excessive leaddistance possible direction change " << lead_distance_ft << " leadInAngle " << leadInAngle << " inbound " << inbound << " outbound " << outbound);
|
||||
SG_LOG(SG_AI, SG_BULK, "Excessive leaddistance possible direction change " << lead_distance_ft << " leadInAngle " << leadInAngle << " inbound " << inbound << " outbound " << outbound << " at " << current->getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -505,7 +505,7 @@ void FGAIFlightPlan::setLeadDistance(double speed,
|
|||
void FGAIFlightPlan::setLeadDistance(double distance_ft){
|
||||
lead_distance_ft = distance_ft;
|
||||
if (lead_distance_ft>10000) {
|
||||
SG_LOG(SG_AI, SG_DEBUG, "Excessive Leaddistance " << distance_ft);
|
||||
SG_LOG(SG_AI, SG_BULK, "Excessive Leaddistance " << distance_ft);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -736,14 +736,37 @@ bool FGAIFlightPlan::createClimb(FGAIAircraft * ac, bool firstFlight,
|
|||
|
||||
// compute course towards destination
|
||||
double course = SGGeodesy::courseDeg(cur, arrival->geod());
|
||||
double distance = SGGeodesy::distanceM(cur, arrival->geod());
|
||||
|
||||
SGGeod climb1 = SGGeodesy::direct(cur, course, 10 * SG_NM_TO_METER);
|
||||
FGAIWaypoint *wpt = createInAir(ac, "10000ft climb", climb1, 10000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
const double headingDiffRunway = SGMiscd::normalizePeriodic(-180, 180, course - runway->headingDeg());
|
||||
|
||||
if( fabs(headingDiffRunway) <10 ) {
|
||||
SGGeod climb1 = SGGeodesy::direct(cur, course, 10 * SG_NM_TO_METER);
|
||||
FGAIWaypoint *wpt = createInAir(ac, "10000ft climb", climb1, 10000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
|
||||
SGGeod climb2 = SGGeodesy::direct(cur, course, 20 * SG_NM_TO_METER);
|
||||
wpt = createInAir(ac, "18000ft climb", climb2, 18000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
} else {
|
||||
double initialTurnRadius = getTurnRadius(vClimb, true);
|
||||
double lateralOffset = initialTurnRadius;
|
||||
if (headingDiffRunway > 0.0) {
|
||||
lateralOffset *= -1.0;
|
||||
}
|
||||
SGGeod climb1 = SGGeodesy::direct(cur, runway->headingDeg(), 5 * SG_NM_TO_METER);
|
||||
FGAIWaypoint *wpt = createInAir(ac, "5000ft climb", climb1, 5000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
int rightAngle = headingDiffRunway>0?90:-90;
|
||||
int firstTurnIncrement = headingDiffRunway>0?2:-2;
|
||||
|
||||
SGGeod firstTurnCenter = SGGeodesy::direct(climb1, ac->getTrueHeadingDeg() + rightAngle, initialTurnRadius);
|
||||
createArc(ac, firstTurnCenter, ac->_getHeading()-rightAngle, course-rightAngle, firstTurnIncrement, initialTurnRadius, 5000, 100, vClimb, "climb-out%03d");
|
||||
SGGeod climb2 = SGGeodesy::direct(cur, course, 20 * SG_NM_TO_METER);
|
||||
wpt = createInAir(ac, "18000ft climb", waypoints.back()->getPos(), 18000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
}
|
||||
|
||||
SGGeod climb2 = SGGeodesy::direct(cur, course, 20 * SG_NM_TO_METER);
|
||||
wpt = createInAir(ac, "18000ft climb", climb2, 18000, vClimb);
|
||||
pushBackWaypoint(wpt);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
Loading…
Add table
Reference in a new issue