From 03eaf8330c0a9a42be6367dae77898d484373658 Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Sun, 29 Jan 2023 12:09:43 +0100 Subject: [PATCH] Set custom magnetic field magnitude during calibration --- src/calibration.py | 12 ++++----- src/exceptions.py | 5 ++++ src/user_interface.py | 57 +++++++++++++++++++++++++++++++------------ 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/calibration.py b/src/calibration.py index bf78e9d..30254b0 100644 --- a/src/calibration.py +++ b/src/calibration.py @@ -241,12 +241,12 @@ class CoilConstantCalibration(Thread): class MagnetometerCalibrationSimple(Thread): - TEST_VECTOR_MAGNITUDE = 100e-6 # In Tesla. Chosen so it can be achieved with a 3A PSU. - def __init__(self, view_queue, calibration_points, calibration_interval, mgm_to_helmholtz_cos_trans): + def __init__(self, view_queue, calibration_points, calibration_interval, calibration_mag_field, mgm_to_helmholtz_cos_trans): Thread.__init__(self) self.view_queue = view_queue self.calibration_points = calibration_points + self.calibration_mag_field = calibration_mag_field self.calibration_interval = calibration_interval self.matrix_trans_mgm_to_hh = [[x.get() for x in row] for row in mgm_to_helmholtz_cos_trans] @@ -307,7 +307,7 @@ class MagnetometerCalibrationSimple(Thread): # Collect sensor data for each test vector for vec_idx, test_vec in enumerate(test_vectors): # Command output - applied_vec = test_vec * self.TEST_VECTOR_MAGNITUDE + applied_vec = test_vec * self.calibration_mag_field self.cage_dev.set_field_raw(applied_vec) # Sleep for a certain duration to allow psu to stabilize output and magnetometer to supply readings @@ -407,13 +407,13 @@ class MagnetometerCalibrationSimple(Thread): class MagnetometerCalibrationComplete(Thread): - TEST_VECTOR_MAGNITUDE = 100e-6 # In Tesla. Chosen so it can be achieved with a 3A PSU. - def __init__(self, view_queue, calibration_points, calibration_interval, mgm_to_helmholtz_cos_trans, right_column): + def __init__(self, view_queue, calibration_points, calibration_interval, calibration_mag_field, mgm_to_helmholtz_cos_trans, right_column): Thread.__init__(self) self.view_queue = view_queue self.calibration_points = calibration_points self.calibration_interval = calibration_interval + self.calibration_mag_field = calibration_mag_field self.matrix_trans_mgm_to_hh = [[x.get() for x in row] for row in mgm_to_helmholtz_cos_trans] self.right_column = right_column @@ -473,7 +473,7 @@ class MagnetometerCalibrationComplete(Thread): # Collect sensor data for each test vector for vec_idx, test_vec in enumerate(test_vectors): # Command output - applied_vec = test_vec * self.TEST_VECTOR_MAGNITUDE + applied_vec = test_vec * self.calibration_mag_field self.cage_dev.set_field_raw(applied_vec) # Sleep for a certain duration to allow psu to stabilize output and magnetometer to supply readings diff --git a/src/exceptions.py b/src/exceptions.py index f1003d2..7e73f0f 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -11,3 +11,8 @@ class DeviceAccessError(Exception): class DeviceBusy(DeviceAccessError): """Error thrown when the HW proxy (i.e. access) cannot be acquired""" pass + + +class MagFieldOutOfBounds(Exception): + """Set magnetic field must be a positive number between 0 and 200µT!""" + pass diff --git a/src/user_interface.py b/src/user_interface.py index bb98f97..ce973cb 100644 --- a/src/user_interface.py +++ b/src/user_interface.py @@ -26,7 +26,7 @@ import src.config_handling as config import src.csv_logging as log from src.calibration import AmbientFieldCalibration, CoilConstantCalibration, MagnetometerCalibrationSimple, \ MagnetometerCalibrationComplete -from src.exceptions import DeviceAccessError +from src.exceptions import DeviceAccessError, MagFieldOutOfBounds from src.utility import ui_print, save_dict_list_to_csv, load_dict_list_from_csv import src.helmholtz_cage_device as helmholtz_cage_device @@ -1019,6 +1019,7 @@ class CalibrateMagnetometerSimple(Frame): self.calibration_procedure_progress_var = IntVar(value=0) # Calibration parameters self.calibration_points_var = IntVar(value=8) + self.mag_field_magnitude_var = DoubleVar(value=100) self.calibration_interval_var = DoubleVar(value=5) # Calibration results self.sensitivity_result_vars = [StringVar(), StringVar(), StringVar()] @@ -1070,33 +1071,38 @@ class CalibrateMagnetometerSimple(Frame): # Centered controls controls_frame = Frame(self.left_column) controls_frame.grid(row=row_counter, column=0, sticky="nw") + # Magnitude of magnetic field + mag_field_magnitude_label = Label(controls_frame, text="Magnetic field magnitude [µT]") + mag_field_magnitude_label.grid(row=0, column=0, pady=5, sticky="nw") + mag_field_magnitude_entry = Entry(controls_frame, textvariable=self.mag_field_magnitude_var) + mag_field_magnitude_entry.grid(row=0, column=1, pady=5, sticky="nw") # Number of calibration points calibration_point_nr_label = Label(controls_frame, text="# of calibration points") - calibration_point_nr_label.grid(row=0, column=0, pady=5, sticky="nw") + calibration_point_nr_label.grid(row=1, column=0, pady=5, sticky="nw") calibration_point_nr_entry = Entry(controls_frame, textvariable=self.calibration_points_var) - calibration_point_nr_entry.grid(row=0, column=1, pady=5, sticky="nw") + calibration_point_nr_entry.grid(row=1, column=1, pady=5, sticky="nw") # Measurement interval calibration_point_nr_label = Label(controls_frame, text="Measurement interval [s]") - calibration_point_nr_label.grid(row=1, column=0, pady=5, sticky="nw") + calibration_point_nr_label.grid(row=2, column=0, pady=5, sticky="nw") calibration_point_nr_entry = Entry(controls_frame, textvariable=self.calibration_interval_var) - calibration_point_nr_entry.grid(row=1, column=1, pady=5, sticky="nw") + calibration_point_nr_entry.grid(row=2, column=1, pady=5, sticky="nw") # Calibration start buttons start_button_frame = Frame(controls_frame) - start_button_frame.grid(row=2, column=0, columnspan=1, sticky="nw") + start_button_frame.grid(row=3, column=0, columnspan=1, sticky="nw") self.start_calibration_button = Button(start_button_frame, text="Start Calibration", command=self.start_calibration_procedure, pady=5, padx=5, font=SMALL_BUTTON_FONT) self.start_calibration_button.grid(row=0, column=0, padx=10, pady=(30, 10), sticky="we") # Reinitialize button reinitialize_button_frame = Frame(controls_frame) - reinitialize_button_frame.grid(row=2, column=1, columnspan=1) + reinitialize_button_frame.grid(row=3, column=1, columnspan=1) self.reinitialize_button = Button(reinitialize_button_frame, text="Reinitialize", command=self.reinitialize, pady=5, padx=5, font=SMALL_BUTTON_FONT) self.reinitialize_button.grid(row=0, column=0, padx=10, pady=(30, 10), sticky="we") # Calibration progress bar progress_bar_frame = Frame(controls_frame) - progress_bar_frame.grid(row=3, column=0, columnspan=2) + progress_bar_frame.grid(row=4, column=0, columnspan=2) calibration_procedure_progress_label = Label(progress_bar_frame, text="Progress:") calibration_procedure_progress_label.grid(row=0, column=0, padx=10, pady=10, sticky="nw") calibration_procedure_progress = ttk.Progressbar(progress_bar_frame, @@ -1354,12 +1360,18 @@ class CalibrateMagnetometerSimple(Frame): try: calibration_points = self.calibration_points_var.get() calibration_interval = self.calibration_interval_var.get() + calibration_mag_field = self.mag_field_magnitude_var.get() * 1e-6 # converted to micro Tesla + if calibration_mag_field <= 0 or calibration_mag_field > 110e-6: + raise MagFieldOutOfBounds self.calibration_thread = MagnetometerCalibrationSimple(self.view_mpi_queue, calibration_points, calibration_interval, + calibration_mag_field, self.mgm_to_helmholtz_cos_trans) self.calibration_thread.start() self.deactivate_buttons() + except (MagFieldOutOfBounds) as e: + messagebox.showwarning("Calibration failed", "\n{}".format(e)) except (DeviceAccessError, TclError) as e: messagebox.showwarning("Calibration failed", "Failed to start calibration:\n{}".format(e)) @@ -1476,6 +1488,7 @@ class CalibrateMagnetometerComplete(Frame): StringVar(value="No data")] self.calibration_procedure_progress_var = IntVar(value=0) # Calibration parameters + self.mag_field_magnitude_var = DoubleVar(value=100) self.calibration_points_var = IntVar(value=8) self.calibration_interval_var = DoubleVar(value=5) # Calibration results @@ -1538,33 +1551,38 @@ class CalibrateMagnetometerComplete(Frame): # Centered controls controls_frame = Frame(self.left_column) controls_frame.grid(row=row_counter, column=0, sticky="nw") + # Magnitude of magnetic field + mag_field_magnitude_label = Label(controls_frame, text="Magnetic field magnitude [µT]") + mag_field_magnitude_label.grid(row=0, column=0, pady=5, sticky="nw") + mag_field_magnitude_entry = Entry(controls_frame, textvariable=self.mag_field_magnitude_var) + mag_field_magnitude_entry.grid(row=0, column=1, pady=5, sticky="nw") # Number of calibration points calibration_point_nr_label = Label(controls_frame, text="# of calibration points") - calibration_point_nr_label.grid(row=0, column=0, pady=5, sticky="nw") + calibration_point_nr_label.grid(row=1, column=0, pady=5, sticky="nw") calibration_point_nr_entry = Entry(controls_frame, textvariable=self.calibration_points_var) - calibration_point_nr_entry.grid(row=0, column=1, pady=5, sticky="nw") + calibration_point_nr_entry.grid(row=1, column=1, pady=5, sticky="nw") # Measurement interval calibration_point_nr_label = Label(controls_frame, text="Measurement interval [s]") - calibration_point_nr_label.grid(row=1, column=0, pady=5, sticky="nw") + calibration_point_nr_label.grid(row=2, column=0, pady=5, sticky="nw") calibration_point_nr_entry = Entry(controls_frame, textvariable=self.calibration_interval_var) - calibration_point_nr_entry.grid(row=1, column=1, pady=5, sticky="nw") + calibration_point_nr_entry.grid(row=2, column=1, pady=5, sticky="nw") # Calibration start buttons start_button_frame = Frame(controls_frame) - start_button_frame.grid(row=2, column=0, columnspan=1, sticky="nw") + start_button_frame.grid(row=3, column=0, columnspan=1, sticky="nw") self.start_calibration_button = Button(start_button_frame, text="Start Calibration", command=self.start_calibration_procedure, pady=5, padx=5, font=SMALL_BUTTON_FONT) self.start_calibration_button.grid(row=0, column=0, padx=10, pady=(30, 10), sticky="we") # Reinitialize button reinitialize_button_frame = Frame(controls_frame) - reinitialize_button_frame.grid(row=2, column=1, columnspan=1) + reinitialize_button_frame.grid(row=3, column=1, columnspan=1) self.reinitialize_button = Button(reinitialize_button_frame, text="Reinitialize", command=self.reinitialize, pady=5, padx=5, font=SMALL_BUTTON_FONT) self.reinitialize_button.grid(row=0, column=0, padx=10, pady=(30, 10), sticky="we") # Calibration progress bar progress_bar_frame = Frame(controls_frame) - progress_bar_frame.grid(row=3, column=0, columnspan=2) + progress_bar_frame.grid(row=4, column=0, columnspan=2) calibration_procedure_progress_label = Label(progress_bar_frame, text="Progress:") calibration_procedure_progress_label.grid(row=0, column=0, padx=10, pady=10, sticky="nw") calibration_procedure_progress = ttk.Progressbar(progress_bar_frame, @@ -1838,13 +1856,19 @@ class CalibrateMagnetometerComplete(Frame): try: calibration_points = self.calibration_points_var.get() calibration_interval = self.calibration_interval_var.get() + calibration_mag_field = self.mag_field_magnitude_var.get() * 1e-6 # converted to micro Tesla + if calibration_mag_field <= 0 or calibration_mag_field > 110e-6: + raise MagFieldOutOfBounds self.calibration_thread = MagnetometerCalibrationComplete(self.view_mpi_queue, calibration_points, calibration_interval, + calibration_mag_field, self.mgm_to_helmholtz_cos_trans, self.right_column) self.calibration_thread.start() self.deactivate_buttons() + except (MagFieldOutOfBounds) as e: + messagebox.showwarning("Calibration failed", "\n{}".format(e)) except (DeviceAccessError, TclError) as e: messagebox.showwarning("Calibration failed", "Failed to start calibration:\n{}".format(e)) @@ -1874,7 +1898,8 @@ class CalibrateMagnetometerComplete(Frame): # Execute calibration function and display results sensor_parameters, mag_x_set, mag_y_set, mag_z_set, mag_x_m, mag_y_m, mag_z_m, cal_x, cal_y, cal_z, mag_amp_avg_set = MagnetometerCalibrationComplete.solve_system( raw_data, mgm_to_helmholtz_cos_trans) - MagnetometerCalibrationComplete.plot_magnetometer_calibration(self.right_column, mag_x_set, mag_y_set, mag_z_set, + MagnetometerCalibrationComplete.plot_magnetometer_calibration(self.right_column, mag_x_set, mag_y_set, + mag_z_set, mag_x_m, mag_y_m, mag_z_m, cal_x, cal_y, cal_z, mag_amp_avg_set)