Skip to content

Commit

Permalink
add FAA data
Browse files Browse the repository at this point in the history
  • Loading branch information
robotastic committed Jan 30, 2025
1 parent 3821b55 commit aa66220
Show file tree
Hide file tree
Showing 7 changed files with 300 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Byte-compiled / optimized / DLL files
.env
__pycache__/
*.py[cod]
*$py.class
Expand Down
Binary file added skyscan-c2/ACFTREF.txt.zst
Binary file not shown.
2 changes: 2 additions & 0 deletions skyscan-c2/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ COPY poetry.lock .
RUN pip3 install poetry==1.5.1
RUN poetry config virtualenvs.create false
RUN poetry install --no-dev
ADD ./ACFTREF.txt.zst .
ADD MASTER.txt.zst .
ADD ./c2_pub_sub.py .

RUN wget https://github.com/IQTLabs/edgetech-axis-ptz-controller/raw/main/axis-ptz-controller/axis_ptz_utilities.py
Expand Down
Binary file added skyscan-c2/MASTER.txt.zst
Binary file not shown.
64 changes: 63 additions & 1 deletion skyscan-c2/c2_pub_sub.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ def __init__(
object_topic: str,
prioritized_ledger_topic: str,
manual_override_topic: str,
faa_master_csv: str,
faa_acftref_csv: str,
min_tilt: float,
max_tilt: float,
min_altitude: float,
Expand Down Expand Up @@ -78,6 +80,8 @@ def __init__(
self.object_topic = object_topic
self.prioritized_ledger_topic = prioritized_ledger_topic
self.manual_override_topic = manual_override_topic
self.faa_master_csv = faa_master_csv
self.faa_acftref_csv = faa_acftref_csv
self.device_latitude = float(device_latitude)
self.device_longitude = float(device_longitude)
self.device_altitude = float(device_altitude)
Expand All @@ -104,13 +108,16 @@ def __init__(
self.override_object = None
self.tracked_object = None

if self.mapping_filepath == "":
if self.mapping_filepath == "" or not os.path.isfile(self.mapping_filepath):
self.occlusion_mapping_enabled = False
else:
with open(mapping_filepath) as f:
self.occlusion_mapping = json.load(f)
self.occlusion_mapping_enabled = True

self.faa_master_df = pd.read_csv(self.faa_master_csv, converters={"MODE S CODE HEX": str.strip}, index_col="MODE S CODE HEX")
self.faa_acftref_df = pd.read_csv(self.faa_acftref_csv, converters={"CODE": str.strip},index_col="CODE")

# Compute tripod position in the geocentric (XYZ) coordinate
# system
self.r_XYZ_t = axis_ptz_utilities.compute_r_XYZ(
Expand Down Expand Up @@ -393,6 +400,51 @@ def _config_callback(
self.min_altitude = config.get("min_altitude", self.min_altitude)
self.max_altitude = config.get("max_altitude", self.max_altitude)

def _add_faa_info(self, object_ledger_df: pd.DataFrame) -> pd.DataFrame:
"""Add FAA information to the object ledger
Args:
object_ledger_df (pd.DataFrame): DataFrame of objects
Returns:
pd.DataFrame: DataFrame of objects with FAA information
"""

# logging.info("Adding FAA info")
# logging.info(object_ledger_df)
# logging.info("columns:", self.faa_master_df.columns.tolist())
# logging.info(self.faa_master_df.iloc[0])
try:
reg_matching_rows = self.faa_master_df.loc[object_ledger_df.name.upper()]
except KeyError as e:
logging.info(f"Aircraft not found in FAA data: {e} ")
return
except IndexError as e:
logging.info("indexerror")
logging.info(e)
return
except Exception as e:
logging.info(f"random error {e}")
#logging.info(object_ledger_df.name.upper())
if not reg_matching_rows.empty:
object_ledger_df['n_number'] = reg_matching_rows['N-NUMBER'].strip()
object_ledger_df['owner'] = reg_matching_rows['NAME'].strip()
object_ledger_df['aircraft_type'] = reg_matching_rows['TYPE AIRCRAFT']
object_ledger_df['engine_type'] = reg_matching_rows['TYPE ENGINE']


code = reg_matching_rows['MFR MDL CODE'].strip()
# get MFR and MODEL from ACFTREF.csv
acft_matching_rows = self.faa_acftref_df.loc[code]

if not acft_matching_rows.empty:
object_ledger_df['aircraft_mfr'] = acft_matching_rows['MFR'].strip()
object_ledger_df['aircraft_model'] = acft_matching_rows['MODEL'].strip()
object_ledger_df['num_engine'] = acft_matching_rows['NO-ENG']

#logging.info(object_ledger_df)
return object_ledger_df

def _elevation_check(self: Any, azimuth: float, elevation: float) -> bool:
"""Check if the elevation is within the acceptable range
Expand Down Expand Up @@ -437,6 +489,7 @@ def _target_selection_callback(


if len(object_ledger_df):
object_ledger_df = object_ledger_df.apply(lambda x: self._add_faa_info(x), axis=1)
### some logic to select which target
object_ledger_df["age"] = time() - object_ledger_df["timestamp"]
object_ledger_df["target"] = False
Expand Down Expand Up @@ -571,6 +624,13 @@ def _target_selection_callback(
"camera_pan": float(self.tracked_object["camera_pan"]),
"distance_3d": float(self.tracked_object["distance_3d"]),
"flight": str(self.tracked_object["flight"]),
"aircraft_type": str(self.tracked_object["aircraft_type"]),
"aircraft_mfr": str(self.tracked_object["aircraft_mfr"]),
"aircraft_model": str(self.tracked_object["aircraft_model"]),
"n_number": str(self.tracked_object["n_number"]),
"owner": str(self.tracked_object["owner"]),
"engine_type": str(self.tracked_object["engine_type"]),
"num_engine": str(self.tracked_object["num_engine"]),
"age": float(self.tracked_object["age"]),
},
}
Expand Down Expand Up @@ -690,6 +750,8 @@ def main(self: Any) -> None:
object_topic=str(os.environ.get("OBJECT_TOPIC")),
prioritized_ledger_topic=str(os.environ.get("PRIORITIZED_LEDGER_TOPIC")),
manual_override_topic=str(os.environ.get("MANUAL_OVERRIDE_TOPIC")),
faa_master_csv=os.getenv("FAA_MASTER_CSV", "MASTER.txt.zst"),
faa_acftref_csv=os.getenv("FAA_ACFTREF_CSV", "ACFTREF.txt.zst"),
device_latitude=float(os.environ.get("TRIPOD_LATITUDE")),
device_longitude=float(os.environ.get("TRIPOD_LONGITUDE")),
device_altitude=float(os.environ.get("TRIPOD_ALTITUDE")),
Expand Down
Loading

0 comments on commit aa66220

Please sign in to comment.