Пример #1
0
	void intervalOfConflict(Daidalus& daa) {
		bool comma = false;
		std::string s="";
		switch (format) {
		case STANDARD:
			for (int ac=1; ac <= daa.lastTrafficIndex(); ++ac) {
				ConflictData conf = daa.detection(ac);
				if (conf.conflict()) {
					(*out) << "Predicted Loss of Well-Clear With " << daa.getAircraftState(ac).getId() <<
							" in " << Units::str("s",conf.getTimeIn()) << " - "+Units::str("s",conf.getTimeOut()) << std::endl;
				}
			}
			break;
		case PVS:
			s += "(: ";
			for (int ac=1; ac <= daa.lastTrafficIndex(); ++ac) {
				if (comma) {
					s += ", ";
				} else {
					comma = true;
				}
				ConflictData conf = daa.detection(ac);
				s += "("+FmPrecision(conf.getTimeIn(),precision)+","+FmPrecision(conf.getTimeOut(),precision)+")";
			}
			s += " :)";
			(*out) << "%%% Time Interval of Violation:\n" << s << std::endl;
			break;
		default:
			break;
		}
	}
Пример #2
0
	void alerting(Daidalus& daa) {
		std::string s="";
		bool comma = false;
		switch (format) {
		case STANDARD:
			for (int ac=1; ac <= daa.lastTrafficIndex(); ++ac) {
				int alert_ac = daa.alerting(ac);
				if (alert_ac > 0) {
					(*out) << s << "Alert " << alert_ac << " with " << daa.getAircraftState(ac).getId() << std::endl;
				}
			}
			(*out) << std::endl;
			break;
		case PVS:
			s += "(: ";
			for (int ac=1; ac <= daa.lastTrafficIndex(); ++ac) {
				if (comma) {
					s += ", ";
				} else {
					comma = true;
				}
				s += daa.alerting(ac);
			}
			s += " :)";
			(*out) << "%%% Alerting:\n" << s << std::endl;
			break;
		default:
			break;
		}
	}
Пример #3
0
	void processTime(Daidalus& daa, const std::string& filename) {
		daa.setCurrentTime(daa.getCurrentTime()+prj_t);
		KinematicMultiBands kb;
		daa.kinematicMultiBands(kb);
		header(daa,kb,filename);
		bands(kb);
		intervalOfConflict(daa);
		alerting(daa);
	}
Пример #4
0
void printDetection(Daidalus& daa) {
	// Aircraft at index 0 is ownship
	for (int ac_idx=1; ac_idx <= daa.lastTrafficIndex(); ++ac_idx) {
		double t2los = daa.timeToViolation(ac_idx);
		if (t2los >= 0) {
			std::cout << "Predicted Time to Loss of Well Clear with " << daa.getAircraftState(ac_idx).getId() << ": " <<
					Fm2(t2los) << " [s]" << std::endl;
		}
	}
}
Пример #5
0
void printAlerts(Daidalus& daa) {
	// Aircraft at index 0 is ownship
	for (int ac_idx=1; ac_idx <= daa.lastTrafficIndex(); ++ac_idx) {
		int alert = daa.alerting(ac_idx);
		if (alert > 0) {
			std::cout << "Alert Level " << alert << " with " <<
					daa.getAircraftState(ac_idx).getId() << std::endl;
		}
	}
}
Пример #6
0
void printContours(Daidalus& daa) {
	std::vector< std::vector<Position> > blobs = std::vector< std::vector<Position> >();
	// Aircraft at index 0 is ownship
	for (int ac_idx=1; ac_idx <= daa.lastTrafficIndex(); ++ac_idx) {
		// Compute all contours
		daa.horizontalContours(blobs,ac_idx);
		for (unsigned int i=0; i < blobs.size(); ++i) {
			std::cout << "Counter-clockwise Conflict Contour " << i << " with Aircraft " << daa.getAircraftState(ac_idx).getId() << ": " << std::endl;
			for (unsigned int i=0; i < blobs[0].size(); ++i) {
				std::cout << blobs[0][i].toString() << " ";
			}
			std::cout << std::endl;
		}
	}
}
Пример #7
0
	void header(Daidalus& daa, KinematicMultiBands& bands, const std::string& filename) {
		switch (format) {
		case STANDARD:
			break;
		case PVS:
			std::cout << "%%% File:\n" << filename << std::endl;
			std::cout << "%%% Time:\n" << Units::str("s",daa.getCurrentTime()) << std::endl;
			std::cout << "%%% Aircraft List:\n" << daa.aircraftListToPVS(precision) << std::endl;
			std::cout << "%%% Most Urgent Aircraft:\n" << daa.mostUrgentAircraft().getId() << std::endl;
			std::cout << "%%% Horizontal Epsilon:\n" << bands.core_.epsilonH() << std::endl;
			std::cout << "%%% Vertical Epsilon:\n" << bands.core_.epsilonV() << std::endl;
			break;
		default:
			break;
		}
	}
Пример #8
0
int main(int argc, const char* argv[]) {
	DaidalusBatch walker;
	int a;
	std::string config = "";
	std::string output = "";
	std::string options = "";
	ParameterData params;
	int precision = 6;
	for (a=1;a < argc && argv[a][0]=='-'; ++a) {
		std::string arga = argv[a];
		options += arga + " ";
		if (walker.processOptions(argv,a)) {
			++a;
			options += walker.getOptionsString();
		} if (arga == "--help" || arga == "-help" || arga == "-h") {
			DaidalusBatch::printHelpMsg();
		} else if (startsWith(arga,"--conf") || startsWith(arga,"-conf") || arga == "-c") {
			config = argv[++a];
			arga = argv[a];
			options += arga + " ";
		} else if (startsWith(arga,"--out") || startsWith(arga,"-out") || arga == "-o") {
			output = argv[++a];
			arga = argv[a];
		} else if (arga == "--verbose" || arga == "-verbose" || arga == "-v") {
			walker.verbose = true;
		} else if (arga == "--raw" || arga == "-raw" || arga == "-r") {
			walker.raw = true;
		} else if (arga == "--pvs" || arga == "-pvs") {
			walker.format = PVS;
		} else if (startsWith(arga,"--proj") || startsWith(arga,"-proj")) {
			++a;
			walker.prj_t = Util::parse_double(argv[a]);
			options += arga+" ";
		} else if (startsWith(arga,"-") && arga.find('=') != std::string::npos) {
			std::string keyval = arga.substr(arga.find_last_of('-')+1);
			params.set(keyval);
		} else if (argv[a][0] == '-') {
			std::cout << "Invalid option: " << arga << std::endl;
			exit(0);
		}
	}
	std::vector<std::string> txtFiles = std::vector<std::string>();
	for (;a < argc; ++a) {
		std::string arga(argv[a]);
		txtFiles.push_back(arga);
	}
	if (txtFiles.empty()) {
		walker.printHelpMsg();
	}
	std::ofstream fout;
	if (output != "") {
		fout.open(output.c_str());
		walker.out = &fout;
	}
	Daidalus daa;

	if (config != "") {
		daa.parameters.loadFromFile(config);
	}
	if (params.size() > 0) {
		daa.parameters.setParameters(params);
	}

	switch (walker.format) {
	case STANDARD:
		if (walker.verbose) {
			(*walker.out) << "# " << Daidalus::release() << std::endl;
			(*walker.out) << "# Options: " << options << std::endl;
			(*walker.out) << "#\n" << daa.toString() << "#\n" << std::endl;
		}
		break;
	case PVS:
		(*walker.out) << "%%% " << Daidalus::release() << std::endl;
		(*walker.out) << "%%% Options: " << options << std::endl;
		(*walker.out) << "%%% Parameters:\n"+daa.parameters.toPVS(precision) << std::endl;
		break;
	default:
		break;
	}
	for (unsigned int i=0; i < txtFiles.size(); ++i) {
		std::string filename(txtFiles[i]);
		switch (walker.format) {
		case STANDARD:
			(*walker.out) << "# File: "<< filename << std::endl;
			break;
		case PVS:
			(*walker.out) << "%%% File: " << filename << std::endl;
			break;
		default:
			break;
		}
		walker.processFile(filename,daa);
	}
	if (output != "") {
		fout.close();
	}

}//main
Пример #9
0
void printBands(Daidalus& daa, KinematicMultiBands& bands) {
	bool nowind = daa.getWindField().isZero();
	TrafficState own = daa.getOwnshipState();
	std::string trkstr = nowind ? "Track" : "Heading";
	std::string gsstr = nowind ? "Ground Speed" : "Airspeed";
	std::cout << std::endl;

	for (int alert_level = 1; alert_level <= daa.parameters.alertor.mostSevereAlertLevel(); ++alert_level) {
		std::cout << "Conflict Aircraft for Alert Level " << Fmi(alert_level) << ": " <<
				TrafficState::listToString(bands.conflictAircraft(alert_level)) << std::endl;
	}

	std::cout << std::endl;

	// Track/Heading
	double trk_deg = own.track("deg");
	std::cout << "Ownship " << trkstr << ": "+Fm2(trk_deg) << " [deg]" << std::endl;
	std::cout << "Region of Current " << trkstr+": " <<
			BandsRegion::to_string(bands.regionOfTrack(trk_deg,"deg")) << std::endl;
	std::cout << trkstr << " Bands [deg,deg]" << std::endl;
	for (int i=0; i < bands.trackLength(); ++i) {
		Interval ii = bands.track(i,"deg");
		std::cout << "  " << BandsRegion::to_string(bands.trackRegion(i)) << ":\t" << ii.toString(2) << std::endl;
	}
	for (int alert_level = 1; alert_level <= daa.parameters.alertor.mostSevereAlertLevel(); ++alert_level) {
		std::cout << "Peripheral " << trkstr << " Aircraft for Alert Level " << Fmi(alert_level) << ": " <<
				TrafficState::listToString(bands.peripheralTrackAircraft(alert_level)) << std::endl;
	}
	std::cout << trkstr << " Resolution (right): " << num2str(bands.trackResolution(true,"deg"),"deg") << std::endl;
	std::cout << trkstr << " Resolution (left): " << num2str(bands.trackResolution(false,"deg"),"deg") << std::endl;
	std::cout << "Preferred "+trkstr+" Direction: ";
	if (bands.preferredTrackDirection()) {
		std::cout << "right" << std::endl;
	} else {
		std::cout << "left" << std::endl;
	}
	std::cout << "Time to " << trkstr << " Recovery: " << num2str(bands.timeToTrackRecovery(),"s") << std::endl;

	// Ground Speed/Air Speed
	double gs_knot = own.groundSpeed("knot");
	std::cout << "Ownship " << gsstr << ": "+Fm2(gs_knot) << " [knot]" << std::endl;
	std::cout << "Region of Current " << gsstr+": " <<
			BandsRegion::to_string(bands.regionOfGroundSpeed(gs_knot,"knot")) << std::endl;
	std::cout << gsstr << " Bands [knot,knot]:" << std::endl;
	for (int i=0; i < bands.groundSpeedLength(); ++i) {
		Interval ii = bands.groundSpeed(i,"knot");
		std::cout << "  " << BandsRegion::to_string(bands.groundSpeedRegion(i)) << ":\t" << ii.toString(2) << std::endl;
	}
	for (int alert_level = 1; alert_level <= daa.parameters.alertor.mostSevereAlertLevel(); ++alert_level) {
		std::cout << "Peripheral " << gsstr << " Aircraft for Alert Level " << Fmi(alert_level) << ": " <<
				TrafficState::listToString(bands.peripheralGroundSpeedAircraft(alert_level)) << std::endl;
	}
	std::cout << gsstr << " Resolution (up): " << num2str(bands.groundSpeedResolution(true,"knot"),"knot") << std::endl;
	std::cout << gsstr << " Resolution (down): " << num2str(bands.groundSpeedResolution(false,"knot"),"knot") << std::endl;
	std::cout << "Preferred "+gsstr+" Direction: ";
	if (bands.preferredGroundSpeedDirection()) {
		std::cout << "up" << std::endl;
	} else {
		std::cout << "down" << std::endl;
	}
	std::cout << "Time to " << gsstr << " Recovery: " << num2str(bands.timeToGroundSpeedRecovery(),"s") << std::endl;

	// Vertical Speed
	double vs_fpm = own.verticalSpeed("fpm");
	std::cout << "Ownship Vertical Speed: "+Fm2(vs_fpm) << " [fpm]" << std::endl;
	std::cout << "Region of Current Vertical Speed: " <<
			BandsRegion::to_string(bands.regionOfVerticalSpeed(vs_fpm,"fpm")) << std::endl;
	std::cout << "Vertical Speed Bands [fpm,fpm]:" << std::endl;
	for (int i=0; i < bands.verticalSpeedLength();  ++i) {
		Interval ii = bands.verticalSpeed(i,"fpm");
		std::cout << "  " << BandsRegion::to_string(bands.verticalSpeedRegion(i)) << ":\t" << ii.toString(2) << std::endl;
	}
	for (int alert_level = 1; alert_level <= daa.parameters.alertor.mostSevereAlertLevel(); ++alert_level) {
		std::cout << "Peripheral Vertical Speed Aircraft for Alert Level " << Fmi(alert_level) << ": " <<
				TrafficState::listToString(bands.peripheralVerticalSpeedAircraft(alert_level)) << std::endl;
	}
	std::cout << "Vertical Speed Resolution (up): " << num2str(bands.verticalSpeedResolution(true,"fpm"),"fpm") << std::endl;
	std::cout << "Vertical Speed Resolution (down): " << num2str(bands.verticalSpeedResolution(false,"fpm"),"fpm") << std::endl;
	std::cout << "Preferred Vertical Speed Direction: ";
	if (bands.preferredVerticalSpeedDirection()) {
		std::cout << "up" << std::endl;
	} else {
		std::cout << "down" << std::endl;
	}
	std::cout << "Time to Vertical Speed Recovery: " << num2str(bands.timeToVerticalSpeedRecovery(),"s") << std::endl;

	// Altitude
	double alt_ft = own.altitude("ft");
	std::cout << "Ownship Altitude: "+Fm2(alt_ft) << " [ft]" << std::endl;
	std::cout << "Region of Current Altitude: " <<
			BandsRegion::to_string(bands.regionOfAltitude(alt_ft,"ft")) << std::endl;
	std::cout << "Altitude Bands [ft,ft]:" << std::endl;
	for (int i=0; i < bands.altitudeLength(); ++i) {
		Interval ii = bands.altitude(i,"ft");
		std::cout << "  " << BandsRegion::to_string(bands.altitudeRegion(i)) << ":\t" << ii.toString(2) << std::endl;
	}
	for (int alert_level = 1; alert_level <= daa.parameters.alertor.mostSevereAlertLevel(); ++alert_level) {
		std::cout << "Peripheral Altitude Aircraft for Alert Level " << Fmi(alert_level) << ": " <<
				TrafficState::listToString(bands.peripheralAltitudeAircraft(alert_level)) << std::endl;
	}
	std::cout << "Altitude Resolution (up): " << num2str(bands.altitudeResolution(true,"ft"),"ft") << std::endl;
	std::cout << "Altitude Resolution (down): " << num2str(bands.altitudeResolution(false,"ft"),"ft") << std::endl;
	std::cout << "Preferred Altitude Direction: ";
	if (bands.preferredAltitudeDirection()) {
		std::cout << "up" << std::endl;
	} else {
		std::cout << "down" << std::endl;
	}
	std::cout << "Time to Altitude Recovery: " << num2str(bands.timeToAltitudeRecovery(),"s") << std::endl;
	std::cout << std::endl;

	// Last times to maneuver
	for (int ac_idx=1; ac_idx <= daa.lastTrafficIndex(); ++ac_idx) {
		TrafficState ac = daa.getAircraftState(ac_idx);
		std::cout << "Last Times to Maneuver with Respect to " << ac.getId() << ":" << std::endl;
		std::cout << "  "+trkstr+" Maneuver: "+num2str(bands.lastTimeToTrackManeuver(ac),"s") << std::endl;
		std::cout << "  "+gsstr+" Maneuver: "+num2str(bands.lastTimeToGroundSpeedManeuver(ac),"s") << std::endl;
		std::cout <<"  Vertical Speed Maneuver: "+num2str(bands.lastTimeToVerticalSpeedManeuver(ac),"s") << std::endl;
		std::cout <<"  Altitude Maneuver: "+num2str(bands.lastTimeToAltitudeManeuver(ac),"s") << std::endl;
	}
	std::cout << std::endl;

}
Пример #10
0
int main(int argc, char* argv[]) {
	std::cout << "##" << std::endl;
	std::cout << "## " << Daidalus::release() << std::endl;
	std::cout << "##\n" << std::endl;

	// Create an object of type Daidalus for a well-clear volume based on TAUMOD
	Daidalus daa;

	// Save default parameters
	std::string default_parameters = "default_parameters.txt";
	daa.parameters.saveToFile(default_parameters);
	std::cout << "Default parameters written to file " << default_parameters << "\n" << std::endl;

	// By default, DAIDALUS is configured to unbuffered WC, instantaneous bands.
	// Uncomment one of the following lines to get buffered WC, kinematic bands. 
	// daa.set_Buffered_WC_SC_228_MOPS(false); // Turn rate 1.5 [deg/s]
	// daa.set_Buffered_WC_SC_228_MOPS(true); // Turn rate 3.0 [deg/s]

	// If needed, load parameters from a configuration file. In that case,
	// uncomment the following line.
	// daa.parameters.loadFromFile("my_parameters.txt");

	double t = 0.0;
	// for all times t (in this example, only one time step is illustrated)
	  // Add ownship state at time t
	  Position so = Position::makeLatLonAlt(33.95,"deg", -96.7,"deg", 8700.0,"ft");
	  Velocity vo = Velocity::makeTrkGsVs(206.0,"deg", 151.0,"knot", 0.0,"fpm");
  	  daa.setOwnshipState("ownship",so,vo,t);

	  // Add all traffic states at time t
	  // ... some traffic ...
	  Position si = Position::makeLatLonAlt(33.86191658,"deg", -96.73272601,"deg", 9000.0,"ft");
	  Velocity vi = Velocity::makeTrkGsVs(0.0,"deg", 210.0,"knot", 0,"fpm");
	  daa.addTrafficState("ith-intruder",si,vi);
	  // ... more traffic ...

	  // Set wind information
	  Velocity wind = Velocity::makeTrkGsVs(45,"deg", 10,"knot", 0,"fpm");
	  daa.setWindField(wind);

	  // Print information about the Daidalus Object
	  std::cout << "Number of Aircraft: " << daa.numberOfAircraft() << std::endl;
	  std::cout << "Last Aircraft Index: " << daa.lastTrafficIndex() << std::endl;
	  std::cout <<  std::endl;

	  // Detect conflicts with every traffic aircraft
	  printDetection(daa);

	  // Call alerting logic for each traffic aircraft.
	  printAlerts(daa);

	  // Define multi bands object
	  KinematicMultiBands bands;

	  // Compute kinematic bands
	  daa.kinematicMultiBands(bands);
	  printBands(daa,bands);

	  // Print points of well-clear violation contours, i.e., blobs
	  printContours(daa);
       // continue with next time step  

}