Reset csv generation inputs to last reasonable value

This commit is contained in:
2023-02-22 17:14:45 +01:00
parent ac475e1b81
commit c8b3a5e0ba
6 changed files with 276 additions and 433 deletions
+30 -7
View File
@@ -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])