forked from zietzm/Helmholtz_Test_Bench
Introduced checkboxes to control ambient field compensation (untested!)
This commit is contained in:
+17
-7
@@ -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)
|
||||
|
||||
+20
-7
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user