From 6194035099c1b503d4edabdfcced1a091728e7df Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Mon, 13 Feb 2023 09:44:42 +0100 Subject: [PATCH] Introduced checkboxes to control ambient field compensation (untested!) --- src/calibration.py | 24 +++++++++++++++++------- src/user_interface.py | 27 ++++++++++++++++++++------- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/calibration.py b/src/calibration.py index 721ec9e..3e3ad11 100644 --- a/src/calibration.py +++ b/src/calibration.py @@ -242,13 +242,14 @@ class CoilConstantCalibration(Thread): class MagnetometerCalibrationSimple(Thread): - def __init__(self, view_queue, calibration_points, calibration_interval, calibration_mag_field, + def __init__(self, view_queue, calibration_points, calibration_interval, compensated_field, 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.compensated_field = compensated_field self.matrix_trans_mgm_to_hh = [[x.get() for x in row] for row in mgm_to_helmholtz_cos_trans] # Hardware checks are done in the init method to allow for exception handling in main thread @@ -309,7 +310,10 @@ class MagnetometerCalibrationSimple(Thread): for vec_idx, test_vec in enumerate(test_vectors): # Command output applied_vec = test_vec * self.calibration_mag_field - self.cage_dev.set_field_raw(applied_vec) + if not self.compensated_field: + self.cage_dev.set_field_raw(applied_vec) # Set raw field not compensated field + else: + self.cage_dev.set_field_compensated(applied_vec) # Set compensated field not raw field # Sleep for a certain duration to allow psu to stabilize output and magnetometer to supply readings time.sleep(self.calibration_interval) @@ -410,13 +414,14 @@ class MagnetometerCalibrationSimple(Thread): class MagnetometerCalibrationComplete(Thread): def __init__(self, view_queue, calibration_points, calibration_interval, calibration_mag_field, - calibration_oversampling, mgm_to_helmholtz_cos_trans, right_column): + calibration_oversampling, compensated_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.var_oversampling = calibration_oversampling + self.compensated_field = compensated_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 @@ -479,7 +484,10 @@ class MagnetometerCalibrationComplete(Thread): for vec_idx, test_vec in enumerate(test_vectors): # Command output applied_vec = test_vec * self.calibration_mag_field - self.cage_dev.set_field_compensated(applied_vec) # Set compensated field not raw field + if not self.compensated_field: + self.cage_dev.set_field_raw(applied_vec) # Set raw field not compensated field + else: + self.cage_dev.set_field_compensated(applied_vec) # Set compensated field not raw field for i in range(self.var_oversampling): # Sleep for a certain duration to allow psu to stabilize output and magnetometer to supply readings @@ -496,7 +504,8 @@ class MagnetometerCalibrationComplete(Thread): # Save data point to raw_data list raw_data.append({'applied_x': applied_vec[0], 'applied_y': applied_vec[1], 'applied_z': applied_vec[2], - 'measured_x': raw_reading[0], 'measured_y': raw_reading[1], 'measured_z': raw_reading[2]}) + 'measured_x': raw_reading[0], 'measured_y': raw_reading[1], + 'measured_z': raw_reading[2]}) # Set new progress indicator for UI self.set_progress(True, vec_idx + 1) @@ -587,8 +596,9 @@ class MagnetometerCalibrationComplete(Thread): # Retrieve calibration parameters q_mat_inv = np.linalg.inv(q_mat) b = -np.dot(q_mat_inv, n) - #a_mat_inv = np.real(1 / csqrt(np.dot(n.T, np.dot(q_mat_inv, n)) - d) * linalg_scipy.sqrtm(q_mat)) - a_mat_inv = np.real(mag_amp_avg_set / np.sqrt(np.dot(n.T, np.dot(q_mat_inv, n)) - d) * scipy.linalg.sqrtm(q_mat)) + # a_mat_inv = np.real(1 / csqrt(np.dot(n.T, np.dot(q_mat_inv, n)) - d) * linalg_scipy.sqrtm(q_mat)) + a_mat_inv = np.real( + mag_amp_avg_set / np.sqrt(np.dot(n.T, np.dot(q_mat_inv, n)) - d) * scipy.linalg.sqrtm(q_mat)) a_mat = np.linalg.inv(a_mat_inv) # Calculate error cal_x = np.zeros(mag_x_m.shape) diff --git a/src/user_interface.py b/src/user_interface.py index 929d4d7..387336b 100644 --- a/src/user_interface.py +++ b/src/user_interface.py @@ -1255,6 +1255,7 @@ class CalibrateMagnetometerSimple(Frame): self.calibration_points_var = IntVar(value=8) self.mag_field_magnitude_var = DoubleVar(value=100) self.calibration_interval_var = DoubleVar(value=5) + self.compensated_field_var = BooleanVar(value=False) # Calibration results self.sensitivity_result_vars = [StringVar(), StringVar(), StringVar()] self.offset_result_vars = [StringVar(), StringVar(), StringVar()] @@ -1336,30 +1337,33 @@ class CalibrateMagnetometerSimple(Frame): calibration_point_nr_entry.grid(row=2, column=1, pady=5, sticky="nw") calibration_point_nr_unit = Label(controls_frame, text="s (> 2 s)") calibration_point_nr_unit.grid(row=2, column=2, pady=5, sticky="nw") + # Compensated field Checkbox + self.compensate_checkbox = Checkbutton(controls_frame, text="Compensate ambient field", + variable=self.compensated_field_var, onvalue=True, offvalue=False) + self.compensate_checkbox.grid(row=3, column=0, pady=5, sticky="nw") # Calibration start buttons start_button_frame = Frame(controls_frame) - start_button_frame.grid(row=3, column=0, columnspan=1, sticky="nw") + start_button_frame.grid(row=4, 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=3, column=1, columnspan=1) + reinitialize_button_frame.grid(row=4, 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=4, column=0, columnspan=2) + progress_bar_frame.grid(row=5, 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, length=240, variable=self.calibration_procedure_progress_var) calibration_procedure_progress.grid(row=0, column=1, padx=10, pady=10, sticky="nw") - row_counter += 1 # CENTER COLUMN # Magnetometer calibration results @@ -1614,12 +1618,14 @@ class CalibrateMagnetometerSimple(Frame): try: calibration_points = self.calibration_points_var.get() calibration_interval = self.calibration_interval_var.get() + compensated_field = self.self.compensated_field_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 > g.MAG_MAG_FIELD: raise MagFieldOutOfBounds self.calibration_thread = MagnetometerCalibrationSimple(self.view_mpi_queue, calibration_points, calibration_interval, + compensated_field, calibration_mag_field, self.mgm_to_helmholtz_cos_trans) self.calibration_thread.start() @@ -1751,6 +1757,7 @@ class CalibrateMagnetometerComplete(Frame): self.calibration_points_var = IntVar(value=8) self.calibration_interval_var = DoubleVar(value=5) self.calibration_oversampling_var = DoubleVar(value=1) + self.compensated_field_var = BooleanVar(value=True) # Calibration results self.a_mat_result_vars = [[DoubleVar(), DoubleVar(), DoubleVar()], [DoubleVar(), DoubleVar(), DoubleVar()], @@ -1849,23 +1856,27 @@ class CalibrateMagnetometerComplete(Frame): calibration_point_nr_entry.grid(row=3, column=1, pady=5, sticky="nw") calibration_point_nr_unit = Label(controls_frame, text="- (>= 1)") calibration_point_nr_unit.grid(row=3, column=2, pady=5, sticky="nw") + # Compensated field Checkbox + self.compensate_checkbox = Checkbutton(controls_frame, text="Compensate ambient field", + variable=self.compensated_field_var, onvalue=True, offvalue=False) + self.compensate_checkbox.grid(row=4, column=0, pady=5, sticky="nw") # Calibration start buttons start_button_frame = Frame(controls_frame) - start_button_frame.grid(row=4, column=0, columnspan=1, sticky="nw") + start_button_frame.grid(row=5, 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=4, column=1, columnspan=1) + reinitialize_button_frame.grid(row=5, 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=5, column=0, columnspan=2) + progress_bar_frame.grid(row=6, 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, @@ -2148,6 +2159,7 @@ class CalibrateMagnetometerComplete(Frame): calibration_interval = self.calibration_interval_var.get() calibration_mag_field = self.mag_field_magnitude_var.get() * 1e-6 # converted to micro Tesla calibration_oversampling = self.calibration_oversampling_var.get() + compensated_field = self.compensated_field_var.get() if calibration_mag_field <= 0 or calibration_mag_field > g.MAG_MAG_FIELD: raise MagFieldOutOfBounds self.calibration_thread = MagnetometerCalibrationComplete(self.view_mpi_queue, @@ -2155,6 +2167,7 @@ class CalibrateMagnetometerComplete(Frame): calibration_interval, calibration_mag_field, calibration_oversampling, + compensated_field, self.mgm_to_helmholtz_cos_trans, self.right_column) self.calibration_thread.start()