forked from zietzm/Helmholtz_Test_Bench
Set custom magnetic field magnitude during calibration
This commit is contained in:
+6
-6
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user