1
0
Fork 0

Some more work on AI/ATC interaction.

* Added an AIAircraft that is shadowing the user aircraft's behavior, in terms of AI / ATC interactions
* Set up a shadow AI FlightPlan that is used for tracking the user's aircraft.
This commit is contained in:
Durk Talsma 2011-04-10 12:46:00 +02:00
parent e04d2f8ba9
commit 819e6a04fa
3 changed files with 85 additions and 9 deletions

View file

@ -1,4 +1,4 @@
// FGAIFlightPlan - class for loading and storing AI flight plans // // FGAIFlightPlan - class for loading and storing AI flight plans
// Written by David Culp, started May 2004 // Written by David Culp, started May 2004
// - davidculp2@comcast.net // - davidculp2@comcast.net
// //
@ -89,10 +89,14 @@ public:
void create(FGAIAircraft *, FGAirport *dep, FGAirport *arr, int leg, double alt, double speed, double lat, double lon, void create(FGAIAircraft *, FGAirport *dep, FGAirport *arr, int leg, double alt, double speed, double lat, double lon,
bool firstLeg, double radius, const std::string& fltType, const std::string& aircraftType, const std::string& airline, double distance); bool firstLeg, double radius, const std::string& fltType, const std::string& aircraftType, const std::string& airline, double distance);
void createPushBack(FGAIAircraft *, bool, FGAirport*, double, double, double, const std::string&, const std::string&, const std::string&);
void createTakeOff(FGAIAircraft *, bool, FGAirport *, double, const std::string&);
void setLeg(int val) { leg = val;} void setLeg(int val) { leg = val;}
void setTime(time_t st) { start_time = st; } void setTime(time_t st) { start_time = st; }
int getGate() const { return gateId; } int getGate() const { return gateId; }
void setGate(int id) { gateId = id; };
double getLeadInAngle() const { return leadInAngle; } double getLeadInAngle() const { return leadInAngle; }
const std::string& getRunway() const; const std::string& getRunway() const;
@ -139,9 +143,7 @@ private:
FGTaxiRoute *taxiRoute; FGTaxiRoute *taxiRoute;
std::string name; std::string name;
void createPushBack(FGAIAircraft *, bool, FGAirport*, double, double, double, const std::string&, const std::string&, const std::string&);
void createPushBackFallBack(FGAIAircraft *, bool, FGAirport*, double, double, double, const std::string&, const std::string&, const std::string&); void createPushBackFallBack(FGAIAircraft *, bool, FGAirport*, double, double, double, const std::string&, const std::string&, const std::string&);
void createTakeOff(FGAIAircraft *, bool, FGAirport *, double, const std::string&);
void createClimb(FGAIAircraft *, bool, FGAirport *, double, double, const std::string&); void createClimb(FGAIAircraft *, bool, FGAirport *, double, double, const std::string&);
void createCruise(FGAIAircraft *, bool, FGAirport*, FGAirport*, double, double, double, double, const std::string&); void createCruise(FGAIAircraft *, bool, FGAirport*, FGAirport*, double, double, double, double, const std::string&);
void createDescent(FGAIAircraft *, FGAirport *, double latitude, double longitude, double speed, double alt,const std::string&, double distance); void createDescent(FGAIAircraft *, FGAirport *, double latitude, double longitude, double speed, double alt,const std::string&, double distance);

View file

@ -46,6 +46,8 @@ void FGATCManager::init() {
currentATCDialog = new FGATCDialogNew; currentATCDialog = new FGATCDialogNew;
currentATCDialog->init(); currentATCDialog->init();
int leg = 0;
// find a reasonable controller for our user's aircraft.. // find a reasonable controller for our user's aircraft..
// Let's start by working out the following three scenarios: // Let's start by working out the following three scenarios:
// Starting on ground at a parking position // Starting on ground at a parking position
@ -56,35 +58,104 @@ void FGATCManager::init() {
string airport = fgGetString("/sim/presets/airport-id"); string airport = fgGetString("/sim/presets/airport-id");
string parking = fgGetString("/sim/presets/parkpos"); string parking = fgGetString("/sim/presets/parkpos");
// Create an (invisible) AIAircraft represenation of the current
// Users, aircraft, that mimicks the user aircraft's behavior.
string callsign= fgGetString("/sim/multiplay/callsign");
double longitude = fgGetDouble("/position/longitude-deg");
double latitude = fgGetDouble("/position/latitude-deg");
double altitude = fgGetDouble("/position/altitude-ft");
double heading = fgGetDouble("/orientation/heading-deg");
double speed = fgGetDouble("/velocities/groundspeed-kt");
double aircraftRadius = 40; // note that this is currently hardcoded to a one-size-fits all JumboJet value. Should change later;
// Next,
ai_ac.setCallSign ( callsign );
ai_ac.setLongitude( longitude );
ai_ac.setLatitude ( latitude );
ai_ac.setAltitude ( altitude );
ai_ac.setPerformance("jet_transport");
FGAIFlightPlan *fp = new FGAIFlightPlan;
string flightPlanName = airport + "-" + airport + ".xml";
double cruiseAlt = 100; // Doesn't really matter right now.
double courseToDest = 180; // Just use something neutral; this value might affect the runway that is used though...
time_t deptime = 0; // just make sure how flightplan processing is affected by this...
FGAirport *apt = FGAirport::findByIdent(airport); FGAirport *apt = FGAirport::findByIdent(airport);
FGAirportDynamics* dcs = apt->getDynamics();
int park_index = dcs->getNrOfParkings() - 1;
cerr << "found information: " << runway << " " << airport << ": parking = " << parking << endl; cerr << "found information: " << runway << " " << airport << ": parking = " << parking << endl;
if (onGround) { if (onGround) {
if (parking.empty()) { while (park_index >= 0 && dcs->getParkingName(park_index) != parking) park_index--;
if (park_index < 0) {
SG_LOG( SG_GENERAL, SG_ALERT,
"Failed to find parking position " << parking <<
" at airport " << airport );
}
if (parking.empty() || (park_index < 0)) {
controller = apt->getDynamics()->getTowerController(); controller = apt->getDynamics()->getTowerController();
int stationFreq = apt->getDynamics()->getTowerFrequency(2); int stationFreq = apt->getDynamics()->getTowerFrequency(2);
cerr << "Setting radio frequency to in airfrequency: " << stationFreq << endl; cerr << "Setting radio frequency to in airfrequency: " << stationFreq << endl;
fgSetDouble("/instrumentation/comm[0]/frequencies/selected-mhz", ((double) stationFreq / 100.0)); fgSetDouble("/instrumentation/comm[0]/frequencies/selected-mhz", ((double) stationFreq / 100.0));
leg = 4;
string fltType = "ga";
fp->createTakeOff(&ai_ac, false, apt, 0, fltType);
} else { } else {
controller = apt->getDynamics()->getGroundNetwork(); controller = apt->getDynamics()->getGroundNetwork();
int stationFreq = apt->getDynamics()->getGroundFrequency(2); int stationFreq = apt->getDynamics()->getGroundFrequency(2);
cerr << "Setting radio frequency to : " << stationFreq << endl; cerr << "Setting radio frequency to : " << stationFreq << endl;
fgSetDouble("/instrumentation/comm[0]/frequencies/selected-mhz", ((double) stationFreq / 100.0)); fgSetDouble("/instrumentation/comm[0]/frequencies/selected-mhz", ((double) stationFreq / 100.0));
leg = 2;
//double, lat, lon, head; // Unused variables;
//int getId = apt->getDynamics()->getParking(gateId, &lat, &lon, &head);
FGParking* parking = dcs->getParking(park_index);
aircraftRadius = parking->getRadius();
string fltType = parking->getType(); // gate / ramp, ga, etc etc.
string aircraftType; // Unused.
string airline; // Currently used for gate selection, but a fallback mechanism will apply when not specified.
fp->setGate(park_index);
fp->createPushBack(&ai_ac,
false,
apt,
latitude,
longitude,
aircraftRadius,
fltType,
aircraftType,
airline);
} }
} else { } else {
controller = 0; controller = 0;
} }
//controller =
// Create an initial flightplan and assign it to the ai_ac. We won't use this flightplan, but it is necessary to
// keep the ATC code happy.
fp->restart();
ai_ac.SetFlightPlan(fp);
if (controller) {
controller->announcePosition(ai_ac.getID(), fp, fp->getCurrentWaypoint()->routeIndex,
ai_ac._getLatitude(), ai_ac._getLongitude(), heading, speed, altitude,
aircraftRadius, leg, &ai_ac);
//dialog.init(); //dialog.init();
} }
}
void FGATCManager::addController(FGATCController *controller) { void FGATCManager::addController(FGATCController *controller) {
activeStations.push_back(controller); activeStations.push_back(controller);
} }
void FGATCManager::update ( double time ) { void FGATCManager::update ( double time ) {
//cerr << "ATC update code is running at time: " << time << endl; //cerr << "ATC update code is running at time: " << time << endl;
currentATCDialog->update(time); currentATCDialog->update(time);
} }

View file

@ -36,6 +36,8 @@
#include <ATC/trafficcontrol.hxx> #include <ATC/trafficcontrol.hxx>
#include <ATC/atcdialog.hxx> #include <ATC/atcdialog.hxx>
#include <AIModel/AIAircraft.hxx>
//class FGATCController; //class FGATCController;
@ -46,6 +48,7 @@ class FGATCManager : public SGSubsystem
{ {
private: private:
AtcVec activeStations; AtcVec activeStations;
FGAIAircraft ai_ac;
FGATCController *controller; // The ATC controller that is responsible for the user's aircraft. FGATCController *controller; // The ATC controller that is responsible for the user's aircraft.
//FGATCDialogNew dialog; // note that this variable should really replace the ugly global "currentATCDialog(); //FGATCDialogNew dialog; // note that this variable should really replace the ugly global "currentATCDialog();