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()
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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)
Example #6
0
 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