Set custom magnetic field magnitude during calibration

This commit is contained in:
2023-01-29 12:09:43 +01:00
parent 1354aed150
commit 03eaf8330c
3 changed files with 52 additions and 22 deletions
+6 -6
View File
@@ -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
+5
View File
@@ -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
+41 -16
View File
@@ -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)