forked from zietzm/Helmholtz_Test_Bench
Reset csv generation inputs to last reasonable value
This commit is contained in:
+30
-7
@@ -419,6 +419,8 @@ class ExecuteCSVMode(Frame):
|
||||
self.rot_cycle_number_vars = IntVar(value=1)
|
||||
self.rot_rate_vars = [DoubleVar(value=1), DoubleVar(value=0), DoubleVar(value=0),
|
||||
DoubleVar(value=0), DoubleVar(value=0), DoubleVar(value=0)]
|
||||
self.rot_rate_last_vars = [DoubleVar(value=1), DoubleVar(value=0), DoubleVar(value=0),
|
||||
DoubleVar(value=0), DoubleVar(value=0), DoubleVar(value=0)]
|
||||
|
||||
# --- UI ELEMENTS ---
|
||||
row_counter = 0 # keep track of which grid row we are in
|
||||
@@ -689,11 +691,12 @@ class ExecuteCSVMode(Frame):
|
||||
|
||||
def export_csv_sequence(self): # Generate and export csv sequence
|
||||
# Generate rotation data
|
||||
t, x, y, z = self.generate_csv_sequence()
|
||||
t, x, y, z, rr = self.generate_csv_sequence()
|
||||
# Assemble data to export
|
||||
rot_sequence = dict(enumerate(t))
|
||||
for i in range(len(t)):
|
||||
rot_sequence[i] = {'Time [s]]': t[i], 'xField [T]': x[i], 'yField [T]': y[i], 'zField [T]': z[i]}
|
||||
rot_sequence[i] = {'Time [s]]': t[i], 'xField [T]': x[i], 'yField [T]': y[i], 'zField [T]': z[i],
|
||||
'Rotation Rate [deg/s]': rr[i] }
|
||||
# Save dictionary to disk
|
||||
save_dict_list_to_csv2('test_sequence_rotation.csv', rot_sequence, query_path=True)
|
||||
ui_print("Saved test sequence to disc.")
|
||||
@@ -719,6 +722,7 @@ class ExecuteCSVMode(Frame):
|
||||
self.execute_button["state"] = "normal" # activate run button --> enable execution
|
||||
|
||||
def generate_csv_sequence(self):
|
||||
ui_print("Generate CSV File: started generating csv file from user inputs.")
|
||||
# Some fixed values
|
||||
rot_center_geom_mean_max = 100 # [µT] Maximum geometric mean
|
||||
rot_center_default = [0, 0, 0] # [µT]
|
||||
@@ -789,8 +793,9 @@ class ExecuteCSVMode(Frame):
|
||||
self.rot_cycle_number_vars.set("{:d}".format(rot_cycle_number))
|
||||
# Variable rotation rate
|
||||
# Solve integral of r(t) = r_0 + r_1 * t + r_2 * t ^ 2 + r3 * sin(r_4 * t + r_5) from 0 to tau
|
||||
R = 360 * rot_cycle_number # [deg] Cycle number multiples of full circle
|
||||
func = lambda tau2: r[0] + r[1] * tau2 + r[2] * tau2 ** 2 + r[3] * (np.sin(r[4] * tau2 + r[5]))
|
||||
func_integral = lambda tau: 360 - (r[0] * tau + r[1] / 2 * tau ** 2 + r[2] / 3 * tau ** 3
|
||||
func_integral = lambda tau: R - (r[0] * tau + r[1] / 2 * tau ** 2 + r[2] / 3 * tau ** 3
|
||||
- r[3] * (np.cos(r[4] * tau + r[5]) + np.cos(r[5]))
|
||||
+ r[3] * r[4] * (np.sin(r[4] * tau + r[5]) - np.sin(r[5])))
|
||||
tau_solution = -1
|
||||
@@ -804,14 +809,32 @@ class ExecuteCSVMode(Frame):
|
||||
i = i + 1
|
||||
if i == 1000:
|
||||
ui_print(
|
||||
"Warning: the user inputs for a rotation rate lead to no solution. Rate inputs reset to default")
|
||||
r = [1, 0, 0, 0, 0, 0, 0]
|
||||
for j in range(6): self.rot_rate_vars[j].set("{:.3f}".format(r[j]))
|
||||
"Warning: the user inputs for a rotation rate yield no solution. Rate reset to last working input.")
|
||||
# Resetting to last working condition
|
||||
for i in range(len(r)):
|
||||
r[i] = float(self.rot_rate_last_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -]
|
||||
self.rot_rate_vars[i].set(self.rot_rate_last_vars[i].get())
|
||||
if tau_solution >= 0 or abs(func_integral(tau_solution)) <= 0.5:
|
||||
tmp = r
|
||||
for i in range(len(r)):
|
||||
tmp[i] = float(self.rot_rate_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -]
|
||||
print(tmp)
|
||||
for i in range(len(r)):
|
||||
tmp[i] = float(self.rot_rate_last_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -]
|
||||
print(tmp)
|
||||
# Storing last working inputs
|
||||
for i in range(len(r)):
|
||||
self.rot_rate_last_vars[i].set(self.rot_rate_vars[i].get())
|
||||
ui_print("Generate CSV File: finished successfully with user inputs.")
|
||||
break
|
||||
|
||||
"""
|
||||
ui_print(
|
||||
"The cycle_time is tau = {:3f} with f(tau) = {:3f}".format(tau_solution[0], func_integral(tau_solution)[0]))
|
||||
"""
|
||||
# Calculate timing
|
||||
cycle_time = tau_solution
|
||||
arr_len = int(np.floor(cycle_time / rot_time_step)) * rot_cycle_number
|
||||
arr_len = int(np.floor(cycle_time / rot_time_step))
|
||||
# Find perpendicular vectors
|
||||
if v[1] == 0 and v[2] == 0:
|
||||
a = np.cross(v, [0, 1, 0])
|
||||
|
||||
Reference in New Issue
Block a user