1
0
Fork 0

Bugfixes and some finetuning:

* Pregenerating taxiroutes could interfere with runway assignments by ATC, when conditions changed, resulting in a taxi to one runway and a takeoff from another
* A simpler solution for the "Error in Traffic record bug". This still needs some more testing, but I haven't seen any error message anymore, since changing to the current code.
* Initialize AI traffic at speed zero, this should prevent some weirdness observed under boundary conditions.
* Don't activate groundnetwork proximity detection for pushback traffic until the "ready for startup message is transmitted. this should allow sufficient time for them to reserve a route, but a little more testing still needs to be done.
This commit is contained in:
Durk Talsma 2012-01-02 22:23:24 +01:00
parent e0b6ee9d5d
commit aab04f44bd
6 changed files with 15 additions and 115 deletions

View file

@ -243,99 +243,9 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
isValid = create(ac, dep,arr, leg, alt, speed, lat, lon,
firstLeg, radius, fltType, acType, airline, dist);
wpt_iterator = waypoints.begin();
//cerr << "after create: " << (*wpt_iterator)->name << endl;
//leg++;
// Now that we have dynamically created a flight plan,
// we need to add some code that pops any waypoints already past.
//return;
}
/*
waypoint* init_waypoint = new waypoint;
init_waypoint->name = string("initial position");
init_waypoint->latitude = entity->latitude;
init_waypoint->longitude = entity->longitude;
init_waypoint->altitude = entity->altitude;
init_waypoint->speed = entity->speed;
init_waypoint->crossat = - 10000;
init_waypoint->gear_down = false;
init_waypoint->flaps_down = false;
init_waypoint->finished = false;
wpt_vector_iterator i = waypoints.begin();
while (i != waypoints.end())
{
//cerr << "Checking status of each waypoint: " << (*i)->name << endl;
SGWayPoint first(init_waypoint->longitude,
init_waypoint->latitude,
init_waypoint->altitude);
SGWayPoint curr ((*i)->longitude,
(*i)->latitude,
(*i)->altitude);
double crse, crsDiff;
double dist;
curr.CourseAndDistance(first, &crse, &dist);
dist *= SG_METER_TO_NM;
// We're only interested in the absolute value of crsDiff
// wich should fall in the 0-180 deg range.
crsDiff = fabs(crse-course);
if (crsDiff > 180)
crsDiff = 360-crsDiff;
// These are the three conditions that we consider including
// in our flight plan:
// 1) current waypoint is less then 100 miles away OR
// 2) curren waypoint is ahead of us, at any distance
if ((dist > 20.0) && (crsDiff > 90.0) && ((*i)->name != string ("EOF")))
{
//useWpt = false;
// Once we start including waypoints, we have to continue, even though
// one of the following way point would suffice.
// so once is the useWpt flag is set to true, we cannot reset it to false.
//cerr << "Discarding waypoint: " << (*i)->name
// << ": Course difference = " << crsDiff
// << "Course = " << course
// << "crse = " << crse << endl;
}
else
useCurrentWayPoint = true;
if (useCurrentWayPoint)
{
if ((dist > 100.0) && (useInitialWayPoint))
{
//pushBackWaypoint(init_waypoint);;
waypoints.insert(i, init_waypoint);
//cerr << "Using waypoint : " << init_waypoint->name << endl;
}
//if (useInitialWayPoint)
// {
// (*i)->speed = dist; // A hack
// }
//pushBackWaypoint( wpt );
//cerr << "Using waypoint : " << (*i)->name
// << ": course diff : " << crsDiff
// << "Course = " << course
// << "crse = " << crse << endl
// << "distance : " << dist << endl;
useInitialWayPoint = false;
i++;
}
else
{
//delete wpt;
delete *(i);
i = waypoints.erase(i);
}
}
*/
//for (i = waypoints.begin(); i != waypoints.end(); i++)
// cerr << "Using waypoint : " << (*i)->name << endl;
//wpt_iterator = waypoints.begin();
//cout << waypoints.size() << " waypoints read." << endl;
}

View file

@ -63,11 +63,11 @@ bool FGAIFlightPlan::create(FGAIAircraft * ac, FGAirport * dep,
case 1:
retVal = createPushBack(ac, firstFlight, dep, latitude, longitude,
radius, fltType, aircraftType, airline);
// Pregenerate the
if (retVal) {
waypoints.back()->setName( waypoints.back()->getName() + string("legend"));
retVal = createTakeoffTaxi(ac, false, dep, radius, fltType, aircraftType, airline);
}
// Pregenerate the taxi leg.
//if (retVal) {
// waypoints.back()->setName( waypoints.back()->getName() + string("legend"));
// retVal = createTakeoffTaxi(ac, false, dep, radius, fltType, aircraftType, airline);
//}
break;
case 2:
retVal = createTakeoffTaxi(ac, firstFlight, dep, radius, fltType,

View file

@ -118,8 +118,8 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac,
pushBackRoute = parking->getPushBackRoute();
int size = pushBackRoute->size();
if (size < 2) {
SG_LOG(SG_AI, SG_WARN, "Push back route from gate " << gateId << " has only " << size << " nodes.");
SG_LOG(SG_AI, SG_WARN, "Using " << pushBackNode);
SG_LOG(SG_AI, SG_ALERT, "Push back route from gate " << gateId << " has only " << size << " nodes.");
SG_LOG(SG_AI, SG_ALERT, "Using " << pushBackNode);
}
pushBackRoute->first();
while (pushBackRoute->next(&node, &rte))

View file

@ -187,23 +187,18 @@ void FGTrafficRecord::setPositionAndIntentions(int pos,
if (intentions.size()) {
intVecIterator i = intentions.begin();
if ((*i) != pos) {
SG_LOG(SG_ATC, SG_INFO,
"Skipping repeated intention in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN);
} else {
intentions.erase(i);
SG_LOG(SG_ATC, SG_ALERT,
"Error in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN);
}
intentions.erase(i);
} else {
//FGAIFlightPlan::waypoint* const wpt= route->getCurrentWaypoint();
int size = route->getNrOfWayPoints();
//cerr << "Setting pos" << pos << " ";
//cerr << "setting intentions ";
for (int i = 0; i < size; i++) {
for (int i = 2; i < size; i++) {
int val = route->getRouteIndex(i);
//cerr << val<< " ";
if ((val) && (val != pos)) { // NOTE THAAT THERES A PROBLEM WITH REPEATED INTENSIONS HERE.
intentions.push_back(val);
//cerr << "[set] ";
}
}
}
}

View file

@ -1522,7 +1522,7 @@ void FGGroundNetwork::update(double dt)
i->setPriority(priority++);
// in meters per second;
double vTaxi = (i->getAircraft()->getPerformance()->vTaxi() * SG_NM_TO_METER) / 3600;
if (i->isActive(60)) {
if (i->isActive(0)) {
// Check for all active aircraft whether it's current pos segment is
// an opposite of one of the departing aircraft's intentions

View file

@ -334,7 +334,7 @@ bool FGAISchedule::createAIAircraft(FGScheduledFlight* flight, double speedKnots
aircraft->setLatitude(position.getLatitudeDeg());
aircraft->setLongitude(position.getLongitudeDeg());
aircraft->setAltitude(flight->getCruiseAlt()*100); // convert from FL to feet
aircraft->setSpeed(speedKnots);
aircraft->setSpeed(0);
aircraft->setBank(0);
courseToDest = SGGeodesy::courseDeg(position, arr->geod());
@ -389,15 +389,10 @@ void FGAISchedule::scheduleFlights(time_t now)
if (!flight) {
break;
}
//if (startingPort.empty()) {
// startingPort = flight->getDepartureAirport()->getId();
//}
currentDestination = flight->getArrivalAirport()->getId();
//cerr << "Current destination " << currentDestination << endl;
if (!initialized) {
string departurePort = flight->getDepartureAirport()->getId();
//cerr << "Scheduled " << registration << " " << score << " for Flight "
// << flight-> getCallSign() << " from " << departurePort << " to " << currentDestination << endl;
if (userPort == departurePort) {
lastRun = 1;
hits++;