예제 #1
0
    def test_deterministic_scheduler_with_one_conflict(self):

        Config.params["scheduler"]["name"] = "deterministic_scheduler"
        a1 = Aircraft("A1", None, self.g1, State.stop)
        a3 = Aircraft("A3", None, self.g2, State.stop)

        # Create mock objects, then schedule it
        simulation = self.SimulationMock(
            a1, a3, self.g1, self.g2, self.s1, self.runway_start)
        scheduler = get_scheduler()
        schedule, priority = scheduler.schedule(simulation)

        self.assertEqual(len(schedule.itineraries), 2)

        # a3 has an early departure time, so it goes first
        self.assertTrue(self.a1 in schedule.itineraries)
        self.assertTrue(self.a3 in schedule.itineraries)

        # Gets itineraries
        iti1 = schedule.itineraries[self.a1]
        iti2 = schedule.itineraries[self.a3]

        self.assertEqual(iti1.targets[1].nodes[0], self.g1)
        self.assertEqual(iti1.targets[1].nodes[1], self.s1)
        self.assertEqual(iti1.targets[2].nodes[0], self.s1)
        self.assertEqual(iti1.targets[2].nodes[1], self.runway_start)

        self.assertEqual(iti2.targets[2].nodes[0], self.g2)
        self.assertEqual(iti2.targets[2].nodes[1], self.s1)
        self.assertEqual(iti2.targets[3].nodes[0], self.s1)
        self.assertEqual(iti2.targets[3].nodes[1], self.runway_start)
예제 #2
0
    def test_conflicts(self):

        simulation = self.SimulationMock()
        airport = Airport.create("simple")

        a1 = Aircraft("A1", None, self.n1, State.stop)
        a2 = Aircraft("A2", None, self.n1, State.stop)
        a3 = Aircraft("A3", None, self.n2, State.stop)

        airport.aircrafts.append(a1)
        airport.aircrafts.append(a2)
        airport.aircrafts.append(a3)

        # Get only one conflict
        self.assertEqual(len(airport.conflicts), 1)

        # Test if the conflict looks like what we expected
        conflict = airport.conflicts[0]
        self.assertTrue(conflict.locations[0] == self.n1)
        self.assertEqual(len(conflict.aircrafts), 2)
        self.assertTrue(a1 in conflict.aircrafts)
        self.assertTrue(a2 in conflict.aircrafts)

        # Add one far aircraft to the same spot
        a4 = Aircraft("A4", None, self.n1, State.stop)
        airport.aircrafts.append(a4)

        # Test if the third aircraft shown in conflict correctly
        self.assertEqual(len(airport.conflicts), 3)
예제 #3
0
    def get_all_aircraft(self) -> [Aircraft]:
        """
        Returns list of all aircraft scanner has seen regardless of whether it 
        has received all Aircraft information (such as tail number or Flight #)
        :return: List of Airfract seen by the receiver
        """ 
        _raw_aircraft_data = self._query(self._scanner_aircraft_path)

        # List of attributes from aircraft JSON. Is there a better way? 
        _response_keys = [
            'hex',
            'flight',
            'squawk',
            'lat',
            'lon',
            'alt_geom', #altitude
            'geom_rate',
            'track',
            'gs',
            'seen' ,
        ]

        known_aircarft = []
        _parameters = {}
        # To-Do: n^2, need something better instead of brute force,
        # (Replace with generator? )
        for i in _raw_aircraft_data['aircraft']:
            for k in _response_keys:
                try:
                    _parameters.update({k : i[k]})
                except KeyError: # Data was not picked up by reciever
                    pass  
            known_aircarft.append(Aircraft(**_parameters))
            _parameters = {}
        return known_aircarft
예제 #4
0
    def test_tick(self):

        itinerary = deepcopy(self.itinerary_template)

        aircraft = Aircraft("F1", "M1", self.n1, State.stop)
        aircraft.set_location(self.n1)
        self.assertEqual(aircraft.state, State.stop)

        # Stop state
        aircraft.tick()
        self.assertEqual(aircraft.itinerary, None)

        # Moving state
        aircraft.set_itinerary(itinerary)
        self.assertTrue(aircraft.itinerary)
        self.assertEqual(aircraft.state, State.moving)
        self.assertEqual(aircraft.itinerary.current_target, self.n1)

        aircraft.tick()
        self.assertEqual(aircraft.itinerary.current_target, self.n2)

        aircraft.tick()
        self.assertEqual(aircraft.itinerary.current_target, self.n3)

        aircraft.tick()
        self.assertTrue(aircraft.itinerary.is_completed)
예제 #5
0
 def __init__(self, callsign, model, to_airport, from_gate, runway,
              departure_time, appear_time):
     super().__init__(Aircraft(callsign, model, None, State.stop))
     self.to_airport = to_airport
     self.from_gate = from_gate
     self.departure_time = departure_time
     self.appear_time = appear_time
예제 #6
0
 def __init__(self, callsign, model, from_airport, to_gate, runway,
              arrival_time, appear_time):
     super().__init__(Aircraft(callsign, model, None, State.flying))
     self.from_airport = from_airport
     self.to_gate = to_gate
     self.arrival_time = arrival_time
     self.appear_time = appear_time
예제 #7
0
 def connect_to(self, comm_port):
     aircraft = Aircraft(comm_port)
     # wait for the heartbeat msg to find the system ID
     print("Waiting for APM heartbeat from aircraft %s" % comm_port)
     aircraft.wait_heartbeat()
     print("I saw a heartbeat, now I am going to acknowledge I have seen the aircraft")
     aircraft.send_ack()
     print("Waiting for APM home location from aircraft %s" % comm_port)
     aircraft.wait_set_home_location()
     self.aircrafts[comm_port] = aircraft
예제 #8
0
    def _update_aircraft(cls, msg: Message) -> None:
        for craft in cls.aircraft:
            if craft == msg.icao:
                craft.update(msg.data)
                break
        else:
            cls.aircraft.insert(0, Aircraft(msg.icao, msg.data))

        if len(cls.aircraft) > 100:
            cls.aircraft = cls.aircraft[25:]
예제 #9
0
def eachAircraft():

    groundstation = Groundstation()

    aircraft_seen = {}

    conn = sqlite3.connect('flightevents.db')

    nmea = open('data.nmea', 'r')

    for line in nmea:
        try:
            commas = line.count(',')
            sentence = pynmea2.parse(line, check=True)
        except pynmea2.ChecksumError:
            # ignore sentences that produce a checksum error
            continue
        except pynmea2.ParseError:
            # ignore sentences that can't be parsed
            continue

        # ignore Flarm PFLAU sentences
        if Observation.is_pflau_sentence(sentence):
            continue

        # The groundstation must have received the UTC time from the GPS
        # before we permit any processing of Flarm PFLAA observations.
        if (groundstation.valid_time()
                and Observation.is_pflaa_sentence(sentence)):
            observation = Observation()
            if observation.set(conn, groundstation, sentence):
                aircraft_id = observation.get_aircraft_id()
                if aircraft_id not in aircraft_seen:
                    aircraft_seen[aircraft_id] = Aircraft(aircraft_id)
                aircraft_seen[aircraft_id].append_observations(observation)

        elif sentence.sentence_type == 'RMC':
            # this sentence contains the current date
            groundstation.set_date(sentence.datestamp)
            groundstation.set(sentence)
        elif (sentence.sentence_type == 'GGA' and groundstation.valid_date()
              and commas == 14):

            # this sentence has the groundstation timestamp, lat, lon, elevation
            groundstation.set(sentence)

    conn.commit()
    conn.close()

    print("%s" % list(aircraft_seen.keys()))

    groundstation.report()

    return
예제 #10
0
    def load_data(filename):
        aircraft_dict = {}
        with open(os.path.join("", "clean_files", filename),
                  "rt",
                  encoding="utf8") as f:

            reader = csv.reader(f)

            for row in reader:
                aircraft_code = row[0]
                # remove cr
                aircraft_dict[aircraft_code] =\
                    Aircraft(row[0], row[1], row[2], row[3], row[4])
        return aircraft_dict
예제 #11
0
    def __init__(self, conf):
        self.conf = conf
        self.aircraft = Aircraft()
        self.flight_phase = FlightPhase(self.aircraft)
        self.flight = Flight()
        self.time = 0
        self.sample_rate = 1  # Hz

        self.recording = False

        self.flush_interval_sec = 10
        self.flush_time = 0

        self.flight_data = []
예제 #12
0
def game_Runner():

    pygame.init()  # Initialize

    game_settings = Setting()
    screen = pygame.display.set_mode(
        (game_settings.screen_width, game_settings.screen_height))
    pygame.display.set_caption("Aircraft Game")

    # create an aircraft
    aircraft = Aircraft(game_settings, screen)
    missiles = Group()

    # loop of processing
    while True:

        function.check_events(game_settings, screen, aircraft, missiles)
        aircraft.update()
        missiles.update()

        function.update_screen(game_settings, screen, aircraft, missiles)
예제 #13
0
    def test_tick_with_delay(self):

        itinerary = deepcopy(self.itinerary_template)

        aircraft = Aircraft("F1", "M1", self.n1, State.stop)
        aircraft.set_location(self.n1)
        self.assertEqual(aircraft.state, State.stop)

        # Stop state
        aircraft.tick()
        self.assertEqual(aircraft.itinerary, None)

        # Moving state
        aircraft.set_itinerary(itinerary)
        self.assertTrue(aircraft.itinerary)
        self.assertEqual(aircraft.state, State.moving)
        self.assertEqual(aircraft.itinerary.current_target, self.n1)

        # targets: n1 - n2 - n3
        aircraft.add_uncertainty_delay()
        # targets: n1 - n1 - n2 - n3

        aircraft.tick()
        # targets: n1 - n2 - n3
        self.assertEqual(aircraft.itinerary.current_target, self.n1)

        aircraft.add_uncertainty_delay()
        # targets: n1 - n1 - n2 - n3
        self.assertEqual(aircraft.itinerary.current_target, self.n1)

        aircraft.tick()
        # targets: n1 - n2 - n3
        self.assertEqual(aircraft.itinerary.current_target, self.n1)

        aircraft.tick()
        # targets: n2 - n3
        self.assertEqual(aircraft.itinerary.current_target, self.n2)
예제 #14
0
 def __init__(self, path, fromdate=None):
     self.flex_start = 0
     self.flex_end = 0
     date_regexp = re.compile(r'\d{1,2}/\d{1,2}/\d{4}\s\d{1,2}:\d{1,2}')
     self.aclist = []
     import pandas as pd
     df = pd.read_csv(path, sep=',', header=0)
     df["ACTUAL_ARRIVAL_DT"] = pandas.to_datetime(df["ACTUAL_ARRIVAL_DT"],
                                                  dayfirst=True)
     df["ACTUAL_DEPARTURE_DT"] = pandas.to_datetime(
         df["ACTUAL_DEPARTURE_DT"], dayfirst=True)
     arr = df.sort_values(by="ACTUAL_DEPARTURE_DT")
     for row in arr.values:
         if 'XXX' in row[7:8]:
             continue
         if row[3] == row[4]:
             continue
         if fromdate is not None:
             if row[3].value // 10**9 < datetime.datetime.strptime(
                     fromdate, "%d/%m/%Y").timestamp():
                 continue
         self.aclist.append(
             Aircraft(row[8],
                      row[7],
                      row[3].value // 10**9,
                      row[4].value // 10**9,
                      debug=False,
                      flight_type_code=row[9]))
         if self.flex_start == 0:
             self.flex_start = row[3].value // 10**9
             self.flex_end = row[4].value // 10**9
         else:
             if row[3].value // 10**9 < self.flex_start:
                 self.flex_start = row[3].value // 10**9
             if row[4].value // 10**9 > self.flex_end:
                 self.flex_end = row[4].value // 10**9
예제 #15
0
def create_sensor(num, delta, air):
    """Creating Random Sensors with position -12,000 <= x, y <= 12000"""
    sensors = []
    for i in range(num):
        x = randrange(-12000, 12000)
        y = randrange(-12000, 12000)
        pos = np.array([x, y]).reshape((2, 1))
        sensors.append(Sensor(50, 20, 0.2, delta, pos, air))
    return sensors


if __name__ == "__main__":
    T = 420  # number of framess
    # set up objects
    air = Aircraft(300, 9, 0)

    # set up figure and subplots
    font = {'size': 9}
    matplotlib.rc('font', **font)
    fig = figure(num=0, figsize=(16, 9))
    fig.suptitle("ground truth generator", fontsize=12)
    gs1 = gridspec.GridSpec(3, 3)
    gs1.update(left=0.05, right=0.48, wspace=0.05)
    ax1 = plt.subplot(gs1[:3, :])

    gs2 = gridspec.GridSpec(3, 3)
    gs2.update(left=0.55, right=0.98, hspace=0.5)
    ax2 = plt.subplot(gs2[1, :2])
    ax3 = plt.subplot(gs2[2, :])
    ax4 = plt.subplot(gs2[0, :2])
예제 #16
0
 def __init__(self):
     """Start up aircraft."""
     self.aircraft = Aircraft()
예제 #17
0
 def initialize_aircraft(self):
     for ac_data in c.data['aircraft']:
         aircraft_obj = Aircraft(ac_data)
         self.aircraft_list.append(aircraft_obj)
         aircraft_obj.handler = FgmsHandler(aircraft_obj)
import numpy as np

from aircraft import Aircraft
from atmosphere import Atmosphere, Wind
from constants import Constants
import sim_setup

from Planes.B737 import B737
from Planes.C172 import C172
from Planes.T38 import T38

# Initialization of objects used in overall sim architecture
SIM = sim_setup.Sim_Parameters()
CONSTANTS = Constants()
Atmosphere = Atmosphere()
plane1 = Aircraft()

####################################################################################################
# BEGIN INPUT FIELDS
####################################################################################################

# Modify simulation parameters
SIM.START_TIME = 0.0
SIM.END_TIME = 2000.0
SIM.DELTA_T = 2

# Modify aircraft inital conditions

# Choose airplane type - B737, C172, T38
plane1.design = B737()
예제 #19
0
    def test_init(self):

        aircraft = Aircraft("F1", "M1", self.n1, State.unknown)
        aircraft.set_location(self.n1)
        self.assertEqual(aircraft.location, self.n1)
예제 #20
0
    def __init__(self, logger):
        """
        Initialize and create a new HUD.
        """

        self.__last_perf_render__ = None
        self.__logger__ = logger
        self.__view_element_timers = {}
        self.__fps__ = RollingStats('FPS')
        self.__texture_cache_size__ = RollingStats('TextureCacheSize')
        self.__texture_cache_misses__ = RollingStats('TextureCacheMisses')
        self.__texture_cache_purges__ = RollingStats('TextureCachePurges')

        self.render_perf = TaskTimer('Render')
        self.frame_setup = TaskTimer('Setup')
        self.frame_cleanup = TaskTimer('Cleanup')

        self.__frame_timers__ = {
            'Setup': self.frame_setup,
            'Render': self.render_perf,
            'Cleanup': self.frame_cleanup
        }

        self.cache_perf = TaskTimer('Cache')

        self.__fps__.push(0)

        adsb_traffic_address = "ws://{0}/traffic".format(
            CONFIGURATION.stratux_address())
        self.__connection_manager__ = traffic.ConnectionManager(
            adsb_traffic_address)

        self.__backpage_framebuffer__, screen_size = display.display_init(
        )  # args.debug)
        self.__width__, self.__height__ = screen_size

        pygame.mouse.set_visible(False)

        pygame.font.init()
        self.__should_render_perf__ = False

        font_size_std = int(self.__height__ / 10.0)
        font_size_detail = int(self.__height__ / 12.0)
        font_size_loading = int(self.__height__ / 4.0)

        self.__font__ = pygame.font.Font(
            get_absolute_file_path("./assets/fonts/LiberationMono-Bold.ttf"),
            font_size_std)
        self.__detail_font__ = pygame.font.Font(
            get_absolute_file_path("./assets/fonts/LiberationMono-Bold.ttf"),
            font_size_detail)
        self.__loading_font__ = pygame.font.Font(
            get_absolute_file_path(
                "./assets/fonts/LiberationMono-Regular.ttf"),
            font_size_loading)
        self.__show_boot_screen__()

        self.__aircraft__ = Aircraft(self.__logger__)

        self.__pixels_per_degree_y__ = int(
            (self.__height__ / CONFIGURATION.get_degrees_of_pitch()) *
            CONFIGURATION.get_pitch_degrees_display_scaler())

        self.__ahrs_not_available_element__ = self.__build_ahrs_hud_element(
            ahrs_not_available.AhrsNotAvailable)

        self.__hud_views__ = self.__build_hud_views()

        self.__view_index__ = 0

        logger = None

        if self.__logger__ is not None:
            logger = self.__logger__.logger

        self.web_server = restful_host.HudServer()
        RecurringTask("rest_host",
                      0.1,
                      self.web_server.run,
                      start_immediate=False)
        RecurringTask("purge_old_traffic",
                      10.0,
                      self.__purge_old_reports__,
                      start_immediate=False)
        RecurringTask("update_traffic",
                      0.1,
                      self.__update_traffic_reports__,
                      start_immediate=True)
        RecurringTask("update_aithre",
                      5.0,
                      self.__update_aithre__,
                      start_immediate=True)
예제 #21
0
    def __init__(self, logger):
        """
        Initialize and create a new HUD.
        """

        self.__logger__ = logger

        self.render_perf = TaskTimer("Render")
        self.orient_perf = TaskTimer("Orient")

        adsb_traffic_address = "ws://{0}/traffic".format(
            CONFIGURATION.stratux_address())
        self.__connection_manager__ = traffic.ConnectionManager(
            adsb_traffic_address)

        self.__backpage_framebuffer__, screen_size = display.display_init(
        )  # args.debug)
        self.__width__, self.__height__ = screen_size
        pygame.mouse.set_visible(False)

        pygame.font.init()
        self.__should_render_perf__ = False

        font_name = "consolas,monaco,courier,arial,helvetica"

        font_size_std = int(self.__height__ / 10.0)
        font_size_detail = int(self.__height__ / 12.0)
        font_size_loading = int(self.__height__ / 4.0)

        self.__font__ = pygame.font.Font(
            get_absolute_file_path("./assets/fonts/LiberationMono-Bold.ttf"),
            font_size_std)
        self.__detail_font__ = pygame.font.Font(
            get_absolute_file_path("./assets/fonts/LiberationMono-Bold.ttf"),
            font_size_detail)
        self.__loading_font__ = pygame.font.SysFont(font_name,
                                                    font_size_loading, True,
                                                    False)
        self.__show_boot_screen__()

        self.__aircraft__ = Aircraft()

        self.__pixels_per_degree_y__ = (
            self.__height__ / HeadsUpDisplay.DEGREES_OF_PITCH
        ) * HeadsUpDisplay.PITCH_DEGREES_DISPLAY_SCALER

        self.__ahrs_not_available_element__ = self.__build_ahrs_hud_element(
            ahrs_not_available.AhrsNotAvailable)

        bottom_compass_element = self.__build_ahrs_hud_element(
            compass_and_heading_bottom_element.CompassAndHeadingBottomElement,
            True)
        adsb_target_bug_element = adsb_target_bugs.AdsbTargetBugs(
            HeadsUpDisplay.DEGREES_OF_PITCH, self.__pixels_per_degree_y__,
            self.__font__, (self.__width__, self.__height__))
        adsb_onscreen_reticle_element = adsb_on_screen_reticles.AdsbOnScreenReticles(
            HeadsUpDisplay.DEGREES_OF_PITCH, self.__pixels_per_degree_y__,
            self.__font__, (self.__width__, self.__height__))
        altitude_element = self.__build_ahrs_hud_element(
            altitude.Altitude, True)
        time_element = self.__build_ahrs_hud_element(time.Time, True)
        system_info_element = self.__build_ahrs_hud_element(
            system_info.SystemInfo, False)
        groundspeed_element = self.__build_ahrs_hud_element(
            groundspeed.Groundspeed, True)

        traffic_only_view = [
            bottom_compass_element, adsb_target_bug_element,
            adsb_onscreen_reticle_element
        ]

        system_info_view = [system_info_element]

        traffic_listing_view = [
            adsb_traffic_listing.AdsbTrafficListing(
                HeadsUpDisplay.DEGREES_OF_PITCH, self.__pixels_per_degree_y__,
                self.__detail_font__, (self.__width__, self.__height__))
        ]

        # norden_view = [
        #     bottom_compass_element,
        #     heading_target_bugs.HeadingTargetBugs(HeadsUpDisplay.DEGREES_OF_PITCH, self.__pixels_per_degree_y__, self.__detail_font__,
        #                                           (self.__width__, self.__height__)),
        #     # Draw the ground speed and altitude last so they
        #     # will appear "on top".
        #     self.__build_ahrs_hud_element(target_count.TargetCount, True),
        #     groundspeed_element,
        #     altitude_element
        # ]

        ahrs_view = [
            self.__build_ahrs_hud_element(level_reference.LevelReference,
                                          True),
            self.__build_ahrs_hud_element(artificial_horizon.ArtificialHorizon,
                                          True), bottom_compass_element,
            altitude_element,
            self.__build_ahrs_hud_element(skid_and_gs.SkidAndGs, True),
            self.__build_ahrs_hud_element(roll_indicator.RollIndicator,
                                          True), groundspeed_element
        ]

        time_view = [time_element]

        self.__hud_views__ = [
            ("Traffic", traffic_only_view),
            ("AHRS", ahrs_view),
            ("ADSB List", traffic_listing_view),
            # ("Norden", norden_view),
            ("Time", time_view),
            ("System Info", system_info_view),
            ("", [])
        ]

        self.__view_index__ = 0

        logger = None

        if self.__logger__ is not None:
            logger = self.__logger__.logger
예제 #22
0
        m += 1

    return heading_differences


######################Scenario###############################################
target_1 = Target("target_1", 1, 100, 370,
                  100)  #(name, location, speed, heading, power)
target_2 = Target("target_2", 5, 100, 900, 100)
target_3 = Target("target_3", 9, 100, 90, 100)
target_4 = Target("target_4", 4, 100, 270, 100)

print("number of targets is: ", Target.number_of_targets)
print("number of targets is: ", Target.number_of_targets, file=f)

aircraft_1 = Aircraft("aircraft_1", 365, 100, 10000,
                      0)  #(name, heading, speed, altitude, ownship_location)

target_list = Target.target_list
#target_list = [target_1, target_2, target_3, target_4]

#print(target_list, file = f)

target_names = [o.name for o in target_list]
target_locations = [o.location for o in target_list]
target_powers = [o.power for o in target_list]
target_speeds = [o.speed for o in target_list]
target_headings = [o.heading for o in target_list]

beam_width = 5.0
half_power_beam_width = beam_width / 2
예제 #23
0
gps = GPS()

compass = Compass()
threads["compass"] = threading.Thread(target=compass.track_ahrs,
                                      args=(),
                                      daemon=True)
threads["compass"].start()

display = Display(gps, compass)

# Blocks until the GPS is ready
display.start()

os.nice(15)

ac = Aircraft(gps)
threads["aircraft"] = threading.Thread(target=ac.track_aircraft,
                                       args=(),
                                       daemon=True)
threads["aircraft"].start()

gdl90 = GDL90(gps, ac, compass)
threads["gdl90"] = threading.Thread(target=gdl90.transmit_gdl90,
                                    args=(),
                                    daemon=True)
threads["gdl90"].start()

startup_tasks()
delay = 20

while True:
예제 #24
0
 def create_aircraft(self):
     self.aircraft = Aircraft()
예제 #25
0
# vehicles, policy = policies('Scenarios/policy.txt')
allowed_ports = ['WP52','WP555','WP322']
second_tower = ['WP802','WP989','WP778']
third_tower = ['WP94','WP661','WP9']
launch_points = ['WP98','WP880','WP14']
verts.findTower_ind(allowed_ports[2]).towerSchedules('Scenarios/test_medium19.csv',allowed_ports)
verts.findTower_ind(second_tower[2]).towerSchedules('Scenarios/test_medium40_csv.csv',second_tower)
verts.findTower_ind(third_tower[2]).towerSchedules('Scenarios/test_medium40_csv.csv',third_tower)

vehicles, time_policy = schedules('Scenarios/scn_UAM_testW.trp')
vehicle_array = []
vehicle_queue = []
i = 0
if time_policy:
	pass
else:
	for v_i in vehicles:
		track = verts.convertTrack(policy[v_i])
		vehicle_array[v_i] = Aircraft(loc=tuple(verts.array[policy[v_i][0][0]].loc_gps)+(100,), POV_center=SF_GPS,col=(0,1,0),ax=ax,track=track,track_col=my_palette(i),verts=verts)
		i+=1
#
# for i in range(500):
#     update(i)



ani = FuncAnimation(fig, update, frames=500, interval=0.02, blit=True,repeat=False)
# ani = FuncAnimation(fig, update, frames=1000,repeat=False)
ani.save('Pass_through_allocation_Any.mp4',writer = writer)
plt.show(block=True)
# plt.show(block=True)
예제 #26
0
파일: main.py 프로젝트: tkforbes/py-sandbox
def eachAircraft(infile):

    groundstation = Groundstation()

    aircraft_seen = {}

    conn = sqlite3.connect('flightevents.db')

    nmea = open(infile, 'r')

    for line in nmea:
        try:
            commas = line.count(',')
            sentence = pynmea2.parse(line, check=True)
        except pynmea2.ChecksumError:
            # ignore sentences that produce a checksum error
            continue
        except pynmea2.ParseError:
            # ignore sentences that can't be parsed
            continue

        # ignore Flarm PFLAU sentences
        if Observation.is_pflau_sentence(sentence):
            continue

        # The groundstation must have received the UTC time from the GPS
        # before we permit any processing of Flarm PFLAA observations.
        if (groundstation.valid_time()
                and Observation.is_pflaa_sentence(sentence)):
            observation = Observation()
            if observation.set(conn, groundstation, sentence):
                aircraft_id = observation.get_aircraft_id()
                if aircraft_id not in aircraft_seen:
                    aircraft_seen[aircraft_id] = Aircraft(aircraft_id)
                aircraft_seen[aircraft_id].append_observations(observation)

        elif sentence.sentence_type == 'RMC':
            # this sentence contains the current date
            groundstation.set_date(sentence.datestamp)
            groundstation.set(sentence)
        elif (sentence.sentence_type == 'GGA' and groundstation.valid_date()
              and commas == 14):

            # this sentence has the groundstation timestamp, lat, lon, elevation
            groundstation.set(sentence)

    conn.close()

    print("%s" % list(aircraft_seen.keys()))

    groundstation.report()

    # reg = "C-GFOP"
    # print("")
    # print(reg)
    # aircraft_seen[reg].printObservations()

    print("")
    print("FLIGHTS PER AIRCRAFT")
    print("====================")
    for aircraft in list(aircraft_seen.keys()):
        print("")
        print(aircraft)
        aircraft_seen[aircraft].detect_events()
        aircraft_seen[aircraft].report_events()

    flight_sheet = []
    for aircraft in list(aircraft_seen.keys()):
        reg = aircraft_seen[aircraft].get_aircraft_id()
        the_events = aircraft_seen[aircraft].events
        for event in the_events:
            if isinstance(event, TakeoffEvent):
                launch_event = LaunchEvent(reg, event.getTimestamp(),
                                           event.getLat(), event.getLon(),
                                           event.getAltitudeAGL(),
                                           event.getTrack(), event.speed)
                flight_sheet.append(launch_event)

    flight_sheet.sort()

    print("")
    print("Flight Sheet")
    print("============")

    item_num = 1

    # we work with pairs, so starting at the second takeoff and looking at
    # the first...
    for ndx in range(1, len(flight_sheet)):
        previous = flight_sheet[ndx - 1].getTimestamp()
        current = flight_sheet[ndx].getTimestamp()
        if ndx < len(flight_sheet) - 1:
            nxt = flight_sheet[ndx + 1].getTimestamp()
        else:
            nxt = Event.event_not_detected

        # are the current and previous takeoff within 30 seconds?
        if (previous - datetime.timedelta(seconds=30) < current <
                previous + datetime.timedelta(seconds=30)):
            # this is a takeoff pair
            print("%02d" % item_num, "Launch ", current,
                  "R%02d" % flight_sheet[ndx].getRwy(),
                  flight_sheet[ndx].getReg(), flight_sheet[ndx - 1].getReg())
            item_num += 1
        # the pair is not a match. what about the upcoming pair?
        elif nxt - datetime.timedelta(
                seconds=30) < current < nxt + datetime.timedelta(seconds=30):
            # do nothing. the next iteration of the loop will process the pair
            pass
        else:
            # this is a lone takeoff event
            print("%02d" % item_num, "Takeoff", current,
                  "R%02d" % flight_sheet[ndx].getRwy(),
                  flight_sheet[ndx].getReg())
            item_num += 1

    return
        tk.Button(buttonFrame, text='Confirm',
                  command=self.updatePlane).pack(side=tk.LEFT,
                                                 fill=tk.X,
                                                 expand=tk.YES)
        tk.Button(buttonFrame, text='Cancel',
                  command=self.window.destroy).pack(side=tk.LEFT,
                                                    fill=tk.X,
                                                    expand=tk.YES)
        buttonFrame.pack(side=tk.BOTTOM, fill=tk.X, expand=tk.NO)

    def __getImage(self):
        try:
            maxsize = (240, 240)
            im = Image.open(
                self.selectedPlane.image
            )  # opens the Aircraft.image to be passed PIL.ImageTk.PhotoImage, need this for jpg
            im.thumbnail(maxsize,
                         Image.ANTIALIAS)  # SCALE the image, not crop it
            tkim = imgtk.PhotoImage(image=im)
            pic = tk.Label(self.window, image=tkim)
            pic.image = tkim  # VERY IMPORTANT!! wont display picture otherwise
            return pic
        except FileNotFoundError:
            return None


if __name__ == '__main__':
    from aircraft import Aircraft, SelectedAircraft
    aircraft = SelectedAircraft.from_base(
        Aircraft('A319', 'jet', 'metric', 'Airbus', 3750))
    AircraftConfigurationWindow(aircraft)
예제 #28
0
def update(i):
	global prev_time, j, vehicle_queue, verts
	dt = 0.2
	print(i)
	# loiter_dict = dict([[verts.findTower_ind(allowed_ports[2]), set()], [verts.findTower_ind(second_tower[2]), set()]])
	land_s = False
	# print(open_slots)
	if time_policy:
		t_i = i*dt
		if time_policy.get(t_i):
			# Usable cache of 8 aircraft
			for v_i in time_policy[t_i]:
				if len(verts.findTower_ind(time_policy[t_i][v_i][-1]).vehicle_array) < 8:
					# in_track = time_policy[t_i][v_i] if time_policy[t_i][v_i][0] in launch_points else [np.random.choice(launch_points),time_policy[t_i][v_i][-1]]
					in_track = [np.random.choice(launch_points),time_policy[t_i][v_i][-1]]
					track = verts.convertTrack(in_track)
					vehicle_array.append(Aircraft(loc=tuple(verts.array[in_track[0]].loc_gps)+(100,),POV_center=SF_GPS,col=(0,1,0),ax=ax,track=track,track_col=my_palette(j),land_tower=verts.findTower(in_track[-1]),land_wp=in_track[-1],verts=verts))
					if len(vehicle_array[-1].scheduler_ind)> 0:vehicle_array[-1].loiter()
					for s_k in vehicle_array[-1].scheduler_ind:
						verts.towers[s_k].add_vehicle(vehicle_array[-1])
					j += 1
				else:
					in_track = [np.random.choice(launch_points), time_policy[t_i][v_i][-1]]
					track = verts.convertTrack(in_track)
					vehicle_queue.append((v_i,tuple(verts.array[in_track[0]].loc_gps)+(100,),track,verts.findTower(in_track[-1]),in_track[-1],in_track[-1]))
		else:
			for v_i,v_q in enumerate(vehicle_queue):
				if len(verts.findTower_ind(v_q[5]).vehicle_array) < 8:
					v_q = vehicle_queue.pop(v_i)
					vehicle_array.append(Aircraft(loc=v_q[1],POV_center=SF_GPS,col=(0,1,0),ax=ax,track=v_q[2],track_col=my_palette(j),land_tower=v_q[3],land_wp=v_q[4],verts=verts))
					if len(vehicle_array[-1].scheduler_ind) > 0: vehicle_array[-1].loiter()
					for s_k in vehicle_array[-1].scheduler_ind:
						verts.towers[s_k].add_vehicle(vehicle_array[-1])
					j += 1

	artist_array = []
	landed_drones = []
	for t_a in verts.towers:
		if t_a.allocating_flag:
			# if t_i.avail_slots > 0:
			t_a.queue_full = True
			t_a.activeRequest()
			# print("Avail Slots: {}".format(t_a.avail_slots))

			# t_i.clearRequest()


	land_signals = dict([[v_i,None] for v_i in vehicle_array])

	## Allocate pass-throughs/landings
	for t_ind,t_a in enumerate(verts.towers):
		for ind,v_ind in enumerate(t_a.vehicle_array):
			v_i = t_a.vehicle_array[v_ind]
			if t_a.active_request:
				if v_ind+1 in t_a.active_request['Allocate']:
					v_i.pass_flag[t_ind] = True
					# land_s = verts.array[v_i.land_wp].loc_xy # verts.array[t_i.landWaypoint(ind)].loc_xy ## TODO fix with pass-throughs
					# print(land_s)
					# land_signals[v_i] = land_s

	for v_i in vehicle_array:
		artist_array += v_i.simulate(dt, land_signal=land_signals[v_i])
		if v_i.kill:
			landed_drones.append(v_i)

	# Remove landing drones
	for v_i in landed_drones:
		for t_a in v_i.scheduler_ind:
			if v_i in verts.towers[t_a].vehicle_array.values():
				verts.towers[t_a].remove_vehicle(v_i)
				verts.towers[t_a].requestLanded()
		vehicle_array.remove(v_i)

	## Add vehicles to towers if not in
	for v_i in vehicle_array:
		for t_a in v_i.scheduler_ind:
			if v_i not in verts.towers[t_a].vehicle_array.values():
				verts.towers[t_a].add_vehicle(v_i)

	for t_ind,t_a in enumerate(verts.towers):
		pass_vehicles = []
		for v_i in t_a.vehicle_array:
			if verts.insideTower(t_a.vehicle_array[v_i].loc[0:2])[t_ind] == 0:
				pass_vehicles.append(t_a.vehicle_array[v_i])
		for v_i in pass_vehicles:
			t_a.remove_vehicle(v_i)
			t_a.requestLanded()


	for t_a in verts.towers:
		out_art = t_a.towerUpdate()
		if out_art: artist_array.append(out_art)
	# f = open('loiter_log.txt',"a")
	# f.write(str(i) + "|\t")
	# for l_i in loiter_dict:
		# f.write(str(loiter_dict[l_i])+", "+str(l_i.avail_slots)+", "+str(l_i.no_active)+"|\t")
	# f.write("\n")
	prev_time = i

	return artist_array
예제 #29
0
class TestScheduler(unittest.TestCase):

    Config.params["simulator"]["test_mode"] = True
    Config.params["simulation"]["time_unit"] = 30

    #     (G1)
    #      |
    #      | <3647.9 ft, 12.2 mins>
    #      |
    #     (S1)-----<2456.7 ft, 8:11 mins>-----(RANWAY.start)
    #      |
    #      | <3647.9 ft, 12.2 mins>
    #      |
    #     (G2)

    g1 = Node("G1", {"lat": 47.812000, "lng": -122.079057})
    g2 = Node("G2", {"lat": 47.832000, "lng": -122.079057})
    s1 = Spot("S1", {"lat": 47.822000, "lng": -122.079057})
    runway_start = RunwayNode({"lat": 47.822000, "lng": -122.069057})

    a1 = Aircraft("A1", None, g1, State.stop)
    a2 = Aircraft("A2", None, g2, State.stop)
    a3 = Aircraft("A3", None, g2, State.stop)

    a4 = Aircraft("A4", None, s1, State.stop)
    a5 = Aircraft("A5", None, s1, State.stop)

    class AirportMock():

        def __init__(self, simulation, aircraft1, aircraft2):
            self.aircrafts = [aircraft1, aircraft2]
            self.aircraft1 = aircraft1
            self.aircraft2 = aircraft2

        def apply_schedule(self, schedule):
            for aircraft, itinerary in schedule.itineraries.items():
                if aircraft == self.aircraft1:
                    self.aircraft1.set_itinerary(itinerary)
                else:
                    self.aircraft2.set_itinerary(itinerary)

        def set_quiet(self, logger):
            self.aircraft1.logger = logger
            self.aircraft2.logger = logger

        def tick(self):
            self.aircraft1.tick()
            self.aircraft2.tick()

        @property
        def conflicts(self):
            if self.aircraft1.location == self.aircraft2.location:
                return [Conflict(None, [self.aircraft1, self.aircraft2])]
            return []

        @property
        def next_conflicts(self):
            if self.aircraft1.itinerary is None or\
               self.aircraft2.itinerary is None:
                return []
            if self.aircraft1.itinerary.next_target is None or\
               self.aircraft2.itinerary.next_target is None:
                return []
            if self.aircraft1.itinerary.next_target == \
               self.aircraft2.itinerary.next_target:
                return [Conflict(None, [self.aircraft1, self.aircraft2])]
            return []

    class RunwayMock():

        def __init__(self, runway_start):
            self.runway_start = runway_start

        @property
        def start(self):
            return self.runway_start

    class ScenarioMock():

        def __init__(self, g1, g2, s1, runway_start):
            self.runway = TestScheduler.RunwayMock(runway_start)
            self.g1, self.g2, self.s1 = g1, g2, s1

        def get_flight(self, aircraft):
            if aircraft.callsign == "A1":
                return DepartureFlight(
                    "A1", None, None, self.g1, self.s1, self.runway,
                    time(2, 36), time(2, 36)
                )
            elif aircraft.callsign == "A2":
                return DepartureFlight(
                    "A2", None, None, self.g2, self.s1, self.runway,
                    time(2, 36, 30), time(2, 36, 30)
                )
            elif aircraft.callsign == "A3":
                return DepartureFlight(
                    "A3", None, None, self.g2, self.s1, self.runway,
                    time(2, 36, 1), time(2, 36, 1)
                )
            elif aircraft.callsign == "A4":
                return DepartureFlight(
                    "A4", None, None, self.g2, self.s1, self.runway,
                    time(2, 36, 1), time(2, 36, 1)
                )
            elif aircraft.callsign == "A5":
                return DepartureFlight(
                    "A5", None, None, self.g2, self.s1, self.runway,
                    time(2, 36, 2), time(2, 36, 2)
                )

    class RouteMock():

        def __init__(self, nodes):
            self.nodes = nodes

    class RoutingExpertMock():

        def __init__(self, g1, g2, s1, runway_start):
            self.g1, self.g2, self.s1 = g1, g2, s1
            self.runway_start = runway_start

        def get_shortest_route(self, src, dst):

            if src == self.g1 and dst == self.runway_start:
                return TestScheduler.RouteMock([self.g1, self.s1,
                                                self.runway_start])

            if src == self.g2 and dst == self.runway_start:
                return TestScheduler.RouteMock([self.g2, self.s1,
                                                self.runway_start])

            if src == self.s1 and dst == self.runway_start:
                return TestScheduler.RouteMock([self.s1, self.runway_start])

            else:
                raise Exception("Unsupported routing query")

    class SimulationMock():

        def __init__(self, a1, a2, g1, g2, s1, runway_start):
            self.airport = TestScheduler.AirportMock(self, a1, a2)
            self.scenario = TestScheduler.ScenarioMock(
                g1, g2, s1, runway_start)
            self.routing_expert = TestScheduler.RoutingExpertMock(
                g1, g2, s1, runway_start)
            self.clock = Clock()
            self.clock.now = time(2, 30)

        def set_quiet(self, logger):
            self.airport.set_quiet(logger)

        def remove_aircrafts(self):
            pass

        def pre_tick(self):
            pass

        def tick(self):
            self.clock.tick()
            self.airport.tick()

        def post_tick(self):
            pass

        @property
        def now(self):
            return self.clock.now

        @property
        def copy(self):
            s = deepcopy(self)
            s.set_quiet(logging.getLogger("QUIET_MODE"))
            return s

    def test_deterministic_scheduler_with_one_conflict(self):

        Config.params["scheduler"]["name"] = "deterministic_scheduler"

        # Create mock objects, then schedule it
        simulation = self.SimulationMock(
            self.a1, self.a3, self.g1, self.g2, self.s1, self.runway_start)
        scheduler = get_scheduler()
        schedule = scheduler.schedule(simulation)

        self.assertEqual(len(schedule.itineraries), 2)

        # a3 has an early departure time, so it goes first
        self.assertTrue(self.a1 in schedule.itineraries)
        self.assertTrue(self.a3 in schedule.itineraries)

        # Gets itineraries
        iti1 = schedule.itineraries[self.a1]
        iti2 = schedule.itineraries[self.a3]

        self.assertEqual(iti1.targets[0], self.g1)
        self.assertEqual(iti1.targets[1], self.s1)
        self.assertEqual(iti1.targets[2], self.runway_start)

        self.assertEqual(iti2.targets[0], self.g2)
        self.assertEqual(iti2.targets[1], self.g2)
        self.assertEqual(iti2.targets[2], self.s1)
        self.assertEqual(iti2.targets[3], self.runway_start)

    def test_deterministic_scheduler_with_one_unsolvable_conflict(self):

        # Sets two aircraft standing at the same node
        self.a4.location = self.s1
        self.a5.location = self.s1

        # Create mock objects, then schedule it
        simulation = self.SimulationMock(
            self.a4, self.a5, self.g1, self.g2, self.s1, self.runway_start)
        scheduler = get_scheduler()
        schedule = scheduler.schedule(simulation)

        self.assertEqual(len(schedule.itineraries), 2)

        # a3 has an early departure time, so it goes first
        self.assertTrue(self.a4 in schedule.itineraries)
        self.assertTrue(self.a5 in schedule.itineraries)

        # Gets itineraries
        iti1 = schedule.itineraries[self.a4]
        iti2 = schedule.itineraries[self.a5]

        self.assertEqual(schedule.n_unsolvable_conflicts, 0)

        self.assertEqual(iti1.targets[0], self.s1)
        self.assertEqual(iti1.targets[1], self.runway_start)

        self.assertEqual(iti2.targets[0], self.s1)
        self.assertEqual(iti2.targets[1], self.s1)
        self.assertEqual(iti2.targets[2], self.runway_start)
예제 #30
0
geometry.add(BodyGeometry(
    name='fuselage',
    fuselage_aspect_ratio=10.,
))
geometry.add(PartGeometry(
    name='balance',
    parasite_drag_coeff=0.006,
))
# 
analyses = Analyses()
aerodynamics = Aerodynamics()
analyses.add(aerodynamics)
# 
aircraft = Aircraft(
    geometry=geometry,
    analyses=analyses,
    aircraft_type='transport',
)


prob = Problem()
comp = IndepVarComp()
comp.add_output('speed', val=250., lower=200., upper = 300.) # units='m/s' , val=250.
comp.add_output('altitude',  val=7., lower=4., upper = 14.)# units = 'km' , val=7
comp.add_output('ref_mac', val=7., lower=4., upper = 14.) # , val=7.
comp.add_output('alpha', val=3. * np.pi / 180., lower=0.* np.pi / 180., upper = 5.* np.pi / 180.)# , val=3. * np.pi / 180.
comp.add_output('ref_area', val=427.8,lower=200., upper = 800.) # , val=427.8
comp.add_output('empty_weight_fraction',val=0.5,lower=0.45, upper =0.55)

comp.add_design_var('speed', lower=200., upper = 300.) # units='m/s' , val=250.
comp.add_design_var('altitude',lower=4., upper = 14.)# units = 'km' , val=7