diff --git a/docker-compose.yml b/docker-compose.yml index 3649269..54d295a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,7 @@ services: volumes: - ./common:/app/common - ./test:/app/test + - ./save:/app/save container_name: 3lips-event cesium-apache: diff --git a/event/algorithm/associator/AdsbAssociator.py b/event/algorithm/associator/AdsbAssociator.py index 1772a18..ff21c4f 100644 --- a/event/algorithm/associator/AdsbAssociator.py +++ b/event/algorithm/associator/AdsbAssociator.py @@ -25,12 +25,13 @@ class AdsbAssociator: @brief Constructor for the AdsbAssociator class. """ - def process(self, radar_list, radar_data): + def process(self, radar_list, radar_data, timestamp): """ @brief Associate detections from 2+ radars. @param radar_list (list): List of radars to associate. @param radar_data (dict): Radar data for list of radars. + @param timestamp (int): Timestamp to compute delays at (ms). @return dict: Associated detections by [hex][radar]. """ @@ -60,7 +61,8 @@ class AdsbAssociator: # associate radar and truth assoc_detections_radar.append(self.process_1_radar( - radar, radar_data[radar]["detection"], adsb_detections)) + radar, radar_data[radar]["detection"], + adsb_detections, timestamp)) # associate detections between radars output = {} @@ -74,7 +76,7 @@ class AdsbAssociator: return output - def process_1_radar(self, radar, radar_detections, adsb_detections): + def process_1_radar(self, radar, radar_detections, adsb_detections, timestamp): """ @brief Associate detections between 1 radar/truth pair. @@ -94,6 +96,11 @@ class AdsbAssociator: if 'delay' in adsb_detections[aircraft] and len(radar_detections['delay']) >= 1: + # extrapolate delay/Doppler to current time + # delta_t = (timestamp - adsb_detections[aircraft]['timestamp'])/1000 + # delay = 1000*adsb_detections[aircraft]['delay'] + \ + + # distance from aircraft to all detections closest_point, distance = self.closest_point( adsb_detections[aircraft]['delay'], @@ -107,7 +114,8 @@ class AdsbAssociator: assoc_detections[aircraft] = { 'radar': radar, 'delay': closest_point[0], - 'doppler': closest_point[1] + 'doppler': closest_point[1], + 'timestamp': adsb_detections[aircraft]['timestamp'] } return assoc_detections diff --git a/event/algorithm/truth/AdsbTruth.py b/event/algorithm/truth/AdsbTruth.py index 9cf5159..f3faca3 100644 --- a/event/algorithm/truth/AdsbTruth.py +++ b/event/algorithm/truth/AdsbTruth.py @@ -4,7 +4,6 @@ """ import requests -import math class AdsbTruth: diff --git a/event/event.py b/event/event.py index 146bd08..79e76c7 100644 --- a/event/event.py +++ b/event/event.py @@ -33,10 +33,12 @@ ellipseParametric = EllipseParametric() ellipsoidParametric = EllipsoidParametric() sphericalIntersection = SphericalIntersection() adsbTruth = AdsbTruth(5) +save = True +saveFile = '/app/save/' + str(int(time.time())) + '.ndjson' async def event(): - global api + global api, save timestamp = int(time.time()*1000) api_event = copy.copy(api) @@ -91,7 +93,6 @@ async def event(): adsb_urls = list(set(adsb_urls)) for url in adsb_urls: truth_adsb[url] = adsbTruth.process(url) - print(truth_adsb, flush=True) # main processing for item in api_event: @@ -122,7 +123,7 @@ async def event(): return # processing - associated_dets = associator.process(item["server"], radar_dict_item) + associated_dets = associator.process(item["server"], radar_dict_item, timestamp) associated_dets_3_radars = { key: value for key, value in associated_dets.items() @@ -181,6 +182,10 @@ async def event(): # update API api = api_event + # save to file + if save: + append_api_to_file(api) + # event loop async def main(): @@ -189,6 +194,11 @@ async def main(): await event() await asyncio.sleep(1) +def append_api_to_file(api_object, filename=saveFile): + with open(filename, 'a') as json_file: + json.dump(api_object, json_file) + json_file.write('\n') + def short_hash(input_string, length=10): hash_object = hashlib.sha256(input_string.encode()) diff --git a/script/README.md b/script/README.md new file mode 100644 index 0000000..7647b47 --- /dev/null +++ b/script/README.md @@ -0,0 +1,5 @@ +This folder is for post-processing scripts on API data. + +## Scripts + +- TODO \ No newline at end of file diff --git a/script/plot_accuracy.py b/script/plot_accuracy.py new file mode 100644 index 0000000..7d846aa --- /dev/null +++ b/script/plot_accuracy.py @@ -0,0 +1,33 @@ +import argparse +import json +from datetime import datetime + +def parse_posix_time(value): + try: + return int(value) + except ValueError: + raise argparse.ArgumentTypeError("Invalid POSIX time format") + +def parse_command_line_arguments(): + parser = argparse.ArgumentParser(description="Process command line arguments.") + + parser.add_argument("json_string", type=str, help="Input JSON string") + parser.add_argument("target_name", type=str, help="Target name") + parser.add_argument("--start_time", type=parse_posix_time, help="Optional start time in POSIX seconds") + parser.add_argument("--stop_time", type=parse_posix_time, help="Optional stop time in POSIX seconds") + + return parser.parse_args() + +def main(): + + args = parse_command_line_arguments() + json_data = json.loads(args.json_string) + start_time = args.start_time if args.start_time else None + stop_time = args.stop_time if args.stop_time else None + print("JSON String:", json_data) + print("Target Name:", args.target_name) + print("Start Time:", start_time) + print("Stop Time:", stop_time) + +if __name__ == "__main__": + main()