def propagate_orbits(p_days, p_step): satellites = Satellite.objects.all() for sat in satellites: tle_data = { "line_1":sat.satellite_tle1, "line_2":sat.satellite_tle2, } try: orbit_track_latest = SatelliteOrbitTrack.objects.filter(satellite_ref=sat).order_by('-timestamp') if not orbit_track_latest: raise SatelliteOrbitTrack.DoesNotExist else: start_date = orbit_track_latest[0].timestamp start_date = start_date + timedelta(seconds = p_step) except SatelliteOrbitTrack.DoesNotExist: start_date = datetime.now() end_date = start_date + timedelta(days = p_days) print(start_date) print(end_date) track = compute_orbit_track(tle_data,datetime_to_mission_timer(start_date),datetime_to_mission_timer(end_date),p_step) for item in track: new_record = SatelliteOrbitTrack() new_record.satellite_ref = sat new_record.timestamp = item["timestamp"] new_record.latitude = item["lat"] new_record.longitude = item["lng"] new_record.altitude = item["alt"] new_record.save()
def compute_orbit_track(tle_data, p_start_date, p_end_date, p_step): # calculate time interval in minutes from inputs date_time_1 = mission_timer_to_datetime(p_start_date) date_time_2 = mission_timer_to_datetime(p_end_date) running_date = date_time_1 ts = load.timescale() satellite = EarthSatellite(tle_data["line_1"], tle_data["line_2"], "Satellite", ts) result = [] while running_date < date_time_2: running_date = running_date + timedelta(0, p_step) time_data = datetime_to_mission_timer(running_date) time_instant = ts.utc( time_data["year"], time_data["month"], time_data["day"], time_data["hour"], time_data["min"], time_data["sec"], ) geocentric = satellite.at(time_instant) subpoint = geocentric.subpoint() data = { "timestamp": running_date, "lat": float(subpoint.latitude.degrees), "lng": float(subpoint.longitude.degrees), "alt": float(subpoint.elevation.km), } result.append(data) return result
def create_mission_instance(p_norad_id, p_scenario_id, p_start_date): mission = {} if p_scenario_id == 0: norad_id = p_norad_id start_date = datetime_to_mission_timer(p_start_date) tle_data = get_tle_data(norad_id) scenario_data = { "scenario_id":0, "objectives":[] } else: scenario_data = get_scenario_data(p_scenario_id) norad_id = scenario_data["initial_setup"]["norad_id"] start_date = scenario_data["start_date"] tle_data = get_tle_data(norad_id) satellite_config = get_satellite_config(norad_id) mission["environment"] = EnvironmentSimulator.create_mission_environment(norad_id, start_date, tle_data) mission["satellite"] = SatelliteSimulator.create_mission_satellite(satellite_config) mission["scenario"] = ScenarioEngine.initialize_scenario(mission, scenario_data) return mission
def create_mission_scenario(p_norad_id, p_instrument_id, scenario_objectives): objectives = generate_objectives(p_lat, p_lon, p_net, p_nlt, p_action) obdh_script = generate_obdh_script(objectives[1]) objectives[0]["definition"]["payload"] = obdh_script scenario_data = { "scenario_id":None, "start_date":datetime_to_mission_timer(datetime.now()), "mission_name": "eo_basic", "description": "A basic Earth Observation mission", "initial_setup":{ "norad_id":p_norad_id, "instrument_id":p_instrument_id, "fp_precision":0.001, }, "objectives":objectives } return scenario_data
def schedule_action(p_norad_id, p_instrument_id, p_lat, p_lon, p_net, p_nlt, p_action): target_passes = get_target_passes(p_norad_id, p_lat, p_lon, p_net, p_nlt) if len(target_passes)>0: # get uplink and downlink ground station passes start_date = datetime_to_mission_timer(datetime.now()) uplink_timestamp = get_groundstation_passes(p_norad_id, start_date, p_net) downlink_timestamp = get_groundstation_passes(p_norad_id, p_nlt, None ) # create scenario objectives scenario_objectives = [ ["uplink", {"timestamp":uplink_timestamp}], [p_action, {"target":[p_lat, p_lon], "date_range":[p_net, p_nlt], "instrument":p_instrument_id}], ["downlink",{"timestamp":downlink_timestamp}], ] # create scenario and mission instances scenario_data = create_mission_scenario(p_norad_id, scenario_objectives) mission = create_mission_instance(p_norad_id, scenario_data["scenario_id"], scenario_data["start_date"]) result = save_mission(mission, "user", "*****@*****.**") return result["hash_key"] else: return ("Action Not Possible For Parameters Specified", None)
def increment_mission_timer(self, p_mission_timer, p_seconds): current_date = mission_timer_to_datetime(p_mission_timer) delta = timedelta(seconds=p_seconds) new_date = current_date + delta p_mission_timer = datetime_to_mission_timer(new_date) return p_mission_timer