Esempio n. 1
0
def start(sql_path=DB_FILE,num_runs=1,gyro_count=4,gyro_vars:GyroVars=GyroVars(), camera_params:CameraParameters=CisLunarCameraParameters) -> OPNAV_EXIT_STATUS:
    """
    Entry point into OpNav System.
    [sql_path]: path to .sqlite file with the SQL prefix
    [num_runs]: number of times observation step is run. Does not include propulsion events
                [num_runs] corresponds to number of trajectory measurements, not attitude measurements
    [gyro_count]: number of gyro measurements taken per observation step
    [gyro_vars]: GyroVars object containing gyroscope properties
    @return
    opnav_exit_status: 0 (success), ...
    """
    assert gyro_count > 1
    create_session = create_sensor_tables_from_path(sql_path)
    session = create_session()
    assert len(session.query(OpNavTrajectoryStateModel).all()) >= 1 and len(session.query(OpNavAttitudeStateModel).all()) >= 1

    propulsion_exit_status = __process_propulsion_events(session)
    if propulsion_exit_status is not OPNAV_EXIT_STATUS.SUCCESS:
        print(f'propulsion processing result: {propulsion_exit_status}')
        # TODO: Handle propulsion processing failure
        return propulsion_exit_status
        
    for run in range(num_runs):
        # process propagation step
        __observe(session, gyro_count)
        propagation_exit_status = __process_propagation(session, gyro_vars, camera_params)
        # TODO: Handle exit status
        if propagation_exit_status is not OPNAV_EXIT_STATUS.SUCCESS:
            print(f'propagation processing result: {propagation_exit_status}')
            return propagation_exit_status

    return OPNAV_EXIT_STATUS.SUCCESS
Esempio n. 2
0
def test_pressure_model():
    create_session = create_sensor_tables_from_path(MEMORY_DB_PATH)
    session = create_session()
    pressure_measurements = session.query(PressureModel).all()
    assert 0 == len(pressure_measurements)

    measurement_taken = datetime.datetime.now()
    pressure = 15.0

    new_measurement = PressureModel(measurement_taken=measurement_taken,
                                    pressure=pressure)
    session.add(new_measurement)
    session.commit()
    pressure_measurements = session.query(PressureModel).all()

    assert 1 == len(pressure_measurements)
    last_measurement = pressure_measurements[0]
    assert last_measurement.measurement_taken == measurement_taken
    assert last_measurement.pressure == pressure

    session.close()
    session = create_session()

    pressure_measurements = session.query(PressureModel).all()

    assert 1 == len(pressure_measurements)
    last_measurement = pressure_measurements[0]
    assert last_measurement.measurement_taken == measurement_taken
    assert last_measurement.pressure == pressure
Esempio n. 3
0
def start():
    """
    Confirms if estimates were computed successfully and if 
    they were added tp the appropriate databases.
    Return:
    opnav_exit_status: 0 (success), ...
    """
    create_session = create_sensor_tables_from_path(DB_FILE)
    session = create_session()
    new_entry = OpNavCoordinatesModel(time_retrieved=datetime.now(),
                                      velocity_x=0.,
                                      velocity_y=0.,
                                      velocity_z=0.,
                                      position_x=0.,
                                      position_y=0.,
                                      position_z=0.,
                                      attitude_q1=0.,
                                      attitude_q2=0.,
                                      attitude_q3=0.,
                                      attitude_q4=0.,
                                      attitude_rod1=0.,
                                      attitude_rod2=0.,
                                      attitude_rod3=0.,
                                      attitude_b1=0.,
                                      attitude_b2=0.,
                                      attitude_b3=0.)
    session.add(new_entry)
    session.commit()
    # Check db entries
    entries = session.query(OpNavCoordinatesModel).all()
    for entry in entries:
        print(entry)
    return 0
Esempio n. 4
0
    def __init__(self):
        super().__init__()
        logger.info("Initializing...")
        self.init_parameters()
        self.command_queue = Queue()
        self.downlink_queue = Queue()
        self.FMQueue = Queue()
        self.commands_to_execute = []
        self.downlinks_to_execute = []
        self.telemetry = Telemetry(self)
        self.burn_queue = Queue()
        self.reorientation_queue = Queue()
        self.reorientation_list = []
        self.maneuver_queue = Queue()  # maneuver queue
        # self.init_comms()
        self.command_handler = CommandHandler()
        self.downlink_handler = DownlinkHandler()
        self.command_counter = 0
        self.downlink_counter = 0
        self.command_definitions = CommandDefinitions(self)
        self.init_sensors()
        self.last_opnav_run = datetime.now()  # Figure out what to set to for first opnav run
        self.log_dir = LOG_DIR
        self.logger = get_log()
        self.attach_sigint_handler()  # FIXME

        if os.path.isdir(self.log_dir):
            self.flight_mode = RestartMode(self)
        else:
            os.makedirs(CISLUNAR_BASE_DIR)
            os.mkdir(LOG_DIR)
            self.flight_mode = BootUpMode(self)
        self.create_session = create_sensor_tables_from_path(DB_FILE)
Esempio n. 5
0
    def __init__(self, parent):
        super().__init__(parent)

        logger.info("Restarting...")
        create_session = create_sensor_tables_from_path(DB_FILE)
        self.session = create_session()

        self.log()
    def __init__(self, parent):
        super().__init__(parent)

        logger.info("Restarting...")
        logger.info("Creating DB session...")
        create_session = create_sensor_tables_from_path(DB_FILE)
        self.session = create_session()

        # add info about restart to database
        logger.debug("Logging to DB...")
        self.log()
Esempio n. 7
0
    def __init__(self):
        super().__init__()
        logger.info("Initializing...")
        self.init_parameters()
        self.command_queue = Queue()
        self.downlink_queue = Queue()
        self.FMQueue = Queue()
        self.commands_to_execute = []
        self.downlinks_to_execute = []
        self.burn_queue = Queue()
        self.reorientation_queue = Queue()
        self.reorientation_list = []
        self.maneuver_queue = Queue()  # maneuver queue
        self.opnav_queue = Queue()  # determine state of opnav success
        # self.init_comms()
        logger.info("Initializing commands and downlinks")
        self.command_handler = CommandHandler()
        self.downlink_handler = DownlinkHandler()
        self.command_counter = 0
        self.downlink_counter = 0
        self.command_definitions = CommandDefinitions(self)
        self.last_opnav_run = datetime.now()  # Figure out what to set to for first opnav run
        self.log_dir = LOG_DIR
        self.logger = get_log()
        self.attach_sigint_handler()  # FIXME
        self.file_block_bank = {}
        self.need_to_reboot = False
        self.gom: Gomspace
        self.gyro: GyroSensor
        self.adc: ADC
        self.rtc: RTC
        self.radio: Radio
        self.mux: camera.CameraMux
        self.camera: camera.Camera
        self.nemo_manager: NemoManager
        self.init_sensors()

        # Opnav subprocess variables
        self.opnav_proc_queue = Queue()
        self.opnav_process = Process()  # define the subprocess

        if os.path.isdir(self.log_dir):
            logger.info("We are in Restart Mode")
            self.flight_mode = RestartMode(self)
        else:
            logger.info("We are in Bootup Mode")
            os.makedirs(CISLUNAR_BASE_DIR, exist_ok=True)
            os.mkdir(LOG_DIR)
            self.flight_mode = BootUpMode(self)
        self.create_session = create_sensor_tables_from_path(DB_FILE)
        logger.info("Initializing Telemetry")
        self.telemetry = Telemetry(self)
        logger.info("Done intializing")
Esempio n. 8
0
    def __init__(self):
        super().__init__()
        logger.info("Initializing...")
        self.init_parameters()
        self.command_queue = Queue()
        self.downlink_queue = Queue()
        self.FMQueue = Queue()
        self.commands_to_execute = []
        self.downlinks_to_execute = []
        self.telemetry = Telemetry(self)
        self.burn_queue = Queue()
        self.reorientation_queue = Queue()
        self.reorientation_list = []
        self.maneuver_queue = Queue()  # maneuver queue
        self.opnav_queue = Queue()   # determine state of opnav success
        # self.init_comms()
        self.command_handler = CommandHandler()
        self.downlink_handler = DownlinkHandler()
        self.command_counter = 0
        self.downlink_counter = 0
        self.command_definitions = CommandDefinitions(self)
        self.last_opnav_run = datetime.now()  # Figure out what to set to for first opnav run
        self.log_dir = LOG_DIR
        self.logger = get_log()
        self.attach_sigint_handler()  # FIXME
        self.need_to_reboot = False

        self.gom = None
        self.gyro = None
        self.adc = None
        self.rtc = None
        self.radio = None
        self.mux = None
        self.camera = None
        self.init_sensors()

        # Telemetry
        self.tlm = Telemetry(self)

        # Opnav subprocess variables
        self.opnav_proc_queue = Queue()
        self.opnav_process = Process()  # define the subprocess

        if os.path.isdir(self.log_dir):
            self.flight_mode = RestartMode(self)
        else:
            os.makedirs(CISLUNAR_BASE_DIR, exist_ok=True)
            os.mkdir(LOG_DIR)
            self.flight_mode = BootUpMode(self)
        self.create_session = create_sensor_tables_from_path(DB_FILE)
    def __init__(self, parent):
        # The purpose of the parent object is to ensure that only one object is defined for each sensor/component
        # So almost all calls to sensors will be made through self._parent.<insert sensor stuff here>
        super().__init__(parent)

        self.gom = GomSensor(parent)
        self.gyr = GyroSensor(parent)
        self.prs = PressureSensor(parent)
        self.thm = ThermocoupleSensor(parent)
        self.rpi = PiSensor(parent)
        self.rtc = RtcSensor(parent)
        self.opn = OpNavSensor(parent)

        self.sensors = [self.gom, self.gyr, self.prs, self.thm, self.rpi, self.rtc]

        create_session = create_sensor_tables_from_path(DB_FILE)  # instantiate DB session
        self.session = create_session()  # instantiate DB session
Esempio n. 10
0
    def run_mode(self):
        logger.info("Boot up beginning...")
        time.sleep(BOOTUP_SEPARATION_DELAY)

        create_session = create_sensor_tables_from_path(DB_FILE)
        self.session = create_session()

        self.log()

        # deploy antennae
        # FIXME: differentiate between Hydrogen and Oxygen. Each satellite now has different required Bootup behaviors
        logger.info("Antennae deploy...")
        self.parent.gom.burnwire1(5)

        if self.parent.need_to_reboot:
            # TODO: double check the boot db history to make sure we aren't going into a boot loop
            # TODO: downlink something to let ground station know we're alive
            os.system("sudo reboot")
    def run_mode(self):
        logger.info("Boot up beginning...")
        logger.info("Time when sleep starts: " + str(datetime.now()))
        time.sleep(BOOTUP_SEPARATION_DELAY)
        logger.info("Time when sleep stops: " + str(datetime.now()))

        logger.info("Creating DB session...")
        create_session = create_sensor_tables_from_path(DB_FILE)
        self.session = create_session()

        logger.info("Logging info to DB...")
        self.log()

        # TODO deploy antennae
        # logger.info("Beginning burn wire...")
        # parent.gom.burnwire1(5)

        logger.info("Transferring to RestartMode via sudo reboot")
        os.system("sudo reboot")
Esempio n. 12
0
def setup_function(function):
    # Reset databases
    create_session = create_sensor_tables_from_path(sql_path)
    session = create_session()
    session.query(OpNavTrajectoryStateModel).delete()
    assert len(session.query(OpNavTrajectoryStateModel).all()) == 0
    session.query(OpNavAttitudeStateModel).delete()
    assert len(session.query(OpNavAttitudeStateModel).all()) == 0
    session.query(OpNavEphemerisModel).delete()
    assert len(session.query(OpNavEphemerisModel).all()) == 0
    session.query(OpNavCameraMeasurementModel).delete()
    assert len(session.query(OpNavCameraMeasurementModel).all()) == 0
    session.query(OpNavPropulsionModel).delete()
    assert len(session.query(OpNavPropulsionModel).all()) == 0
    session.query(OpNavGyroMeasurementModel).delete()
    assert len(session.query(OpNavGyroMeasurementModel).all()) == 0

    new_bootup = RebootsModel(is_bootup=False, reboot_at=datetime.now())
    session.add(new_bootup)
    session.commit()
Esempio n. 13
0
def test_telemetry_model():
    create_session = create_sensor_tables_from_path(MEMORY_DB_PATH)
    session = create_session()

    telemetry_measurements = session.query(TelemetryModel).all()
    assert 0 == len(telemetry_measurements), "FAIL"
    print("Creation of empty session -- PASS")
    print()

    make_entry(session)

    telemetry_measurements = session.query(TelemetryModel).all()
    assert 1 == len(telemetry_measurements), "FAIL"

    make_entry(session)
    make_entry(session)
    telemetry_measurements = session.query(TelemetryModel).all()
    assert 3 == len(telemetry_measurements), "FAIL"
    print("Creation of 3 entries -- PASS")
    print()

    print("displaying all TelemetryModel entries:")
    db_functions.display_model("Telemetry", session)
    print()

    print("display_model -- PASS")
    print()

    print(
        "displaying two (out of three) most recent entries in TelemetryModel:")
    db_functions.display_model_amount("Telemetry", 2, session)
    print()

    print("display_model_amount -- PASS")
    print()

    print("displaying most recent RPI entry:")
    db_functions.telemetry_query("RPI", 1, session)
    print()

    print("displaying 3 most recent GYRO entries:")
    db_functions.telemetry_query("GYRO", 3, session)
    print()

    print("telemetry_query -- PASS")
    print()

    print("... making another entry to TelemetryModel...")
    print("currently 4 entries")
    print()
    make_entry(session)
    telemetry_measurements = session.query(TelemetryModel).all()
    assert 4 == len(telemetry_measurements), "FAIL"

    print("cleaning TelemetryModel with entry_limit=2 \nonly two entries now:")
    db_functions.clean("Telemetry", session, 2)
    telemetry_measurements = session.query(TelemetryModel).all()
    assert 2 == len(telemetry_measurements), "FAIL"
    db_functions.display_model("Telemetry", session)
    print("length of TelemetryModel:", len(telemetry_measurements))
    print()

    print("clean -- PASS")
    print()

    print("wiping TelemetryModel of all entries")
    print("length before wiping:", len(telemetry_measurements))
    db_functions.wipe("Telemetry", session)
    telemetry_measurements = session.query(TelemetryModel).all()
    assert 0 == len(telemetry_measurements), "FAIL"
    db_functions.display_model("Telemetry", session)
    print("length after wiping:", len(telemetry_measurements))
    print()

    print("ALL TESTS PASS")
Esempio n. 14
0
def test_start(mocker):
    # Add data to test database
    create_session = create_sensor_tables_from_path(sql_path)
    session = create_session()
    # entries = session.query(OpNavPropulsionModel).all()
    time = datetime.now()
    entries = [
        OpNavPropulsionModel.from_tuples(
        0.0001, time_start=time+timedelta(0,-110), time_end=time+timedelta(0,-100)), # 10 second propulsion that occured 100 seconds ago
        OpNavTrajectoryStateModel.from_tuples(
        (0.,2.,3.), (2.,2.,3.), opnav_constants.TrajUKFConstants.P0.reshape(6,6), time=time+timedelta(0,-200)), # initial state used by propulsion step, output used by propagation step
        OpNavAttitudeStateModel.from_tuples(
            (0., 0., 0., 1.), (0., 1., 0.), (0.,2.,0.,), opnav_constants.AttitudeUKFConstants.P0.reshape(6,6), time=time+timedelta(0,-200)),

        OpNavEphemerisModel.from_tuples(
            sun_eph=(1111., 1111., 1111., 124., 24., 4.), moon_eph=(4244., 42424., 4244., 42., 42., 42.), time=time+timedelta(0,20)),
        OpNavEphemerisModel.from_tuples(
            sun_eph=(2222., 2222., 2222., 124., 24., 4.), moon_eph=(4244., 42424., 4244., 42., 42., 42.), time=time+timedelta(0,-3)),
        OpNavEphemerisModel.from_tuples(
            sun_eph=(3333., 3333., 3333., 124., 24., 4.), moon_eph=(4244., 42424., 4244., 42., 42., 42.), time=time+timedelta(1,0)),

        #OpNavCameraMeasurementModel.from_tuples(
        #    measurement=(0.2, 0.1, 0.2, 0.1, 0.11, 0.22), time=time), # camera measurement taken now, uses state

        OpNavGyroMeasurementModel.from_tuples(
            measurement=(0., 2., 1.), time=time+timedelta(0,-50)), # Not picked because gyro was read before this run's corresponding cam meas
        OpNavGyroMeasurementModel.from_tuples(
            measurement=(2., 1., 1.), time=time+timedelta(0,0.1)),
        OpNavGyroMeasurementModel.from_tuples(
            measurement=(2., 1., 1.), time=time+timedelta(0,0.21234)),
        OpNavGyroMeasurementModel.from_tuples(
            measurement=(2., 1., 1.), time=time+timedelta(0,0.31244)),
    ]
    session.bulk_save_objects(entries)
    session.commit()
    # mocks
    # do not test observe()
    def observe_mock(session, gyro_count):
        return opnav_constants.OPNAV_EXIT_STATUS.SUCCESS

    # mocker.patch('core.opnav.__observe', side_effect=observe_mock)

    def select_camera_mock(id):
        print("select_mock")
        return

    # Don't use select_camera_mock for software demo
    #mocker.patch('core.opnav.select_camera', side_effect=select_camera_mock)

    idx = [0]
    timestamps = [981750, 981750, 2028950, 2028950, 3010700, 3010700]
    videos = ['/home/stephen_z/Desktop/test-videos/cam1_expLow.mjpeg', '/home/stephen_z/Desktop/test-videos/cam1_expHigh.mjpeg',
              '/home/stephen_z/Desktop/test-videos/cam2_expLow.mjpeg', '/home/stephen_z/Desktop/test-videos/cam2_expHigh.mjpeg',
              '/home/stephen_z/Desktop/test-videos/cam3_expLow.mjpeg', '/home/stephen_z/Desktop/test-videos/cam3_expHigh.mjpeg']

    def record_video_mock(filename, framerate, recTime, exposure):
        print("video_mock")
        time = timestamps[idx[0]]
        filename = videos[idx[0]]
        idx[0] += 1
        return (filename, time)

    # Don't use record_video mock for software demo
    #mocker.patch('core.opnav.record_video', side_effect=record_video_mock)

    def record_gyro_mock(count):
        print("gyro_mock")
        return np.array([[0, 5, 0]])

    mocker.patch('core.opnav.record_gyro', side_effect=record_gyro_mock)


    # start opnav system
    opnav.start(sql_path=sql_path, num_runs=1, gyro_count=2)