def load_nidata(self): nidata = loadmat(os.path.join(self.raw_dir, "nidata.mat"), squeeze_me=True) self.time_ni = nidata["t"] self.sr_ni = (1.0/(self.time_ni[1] - self.time_ni[0])) if "carriage_pos" in nidata: self.lin_enc = True self.carriage_pos = nidata["carriage_pos"] self.tow_speed_ni = fdiff.second_order_diff(self.carriage_pos, self.time_ni) self.tow_speed_ni = ts.smooth(self.tow_speed_ni, 8) self.tow_speed_ref = self.tow_speed_ni else: self.lin_enc = False self.tow_speed_ref = self.tow_speed_nom self.torque = nidata["torque_trans"] self.torque_arm = nidata["torque_arm"] self.drag = nidata["drag_left"] + nidata["drag_right"] # Remove offsets from drag, not torque t0 = 2 self.drag = self.drag - np.mean(self.drag[0:self.sr_ni*t0]) # Compute RPM and omega self.angle = nidata["turbine_angle"] self.rpm_ni = fdiff.second_order_diff(self.angle, self.time_ni)/6.0 self.rpm_ni = ts.smooth(self.rpm_ni, 8) self.omega_ni = self.rpm_ni*2*np.pi/60.0 self.omega = self.omega_ni self.tow_speed = self.tow_speed_ref
def EveryNCallback_py(taskHandle, everyNsamplesEventType, nSamples, callbackData_ptr): """Function called every N samples""" callbackdata = daqmx.get_callbackdata_from_id(callbackData_ptr) data, npoints = daqmx.ReadAnalogF64(taskHandle, self.nsamps, 10.0, daqmx.Val_GroupByChannel, self.nsamps, len(self.analogchans)) callbackdata.extend(data.tolist()) self.data["torque_trans"] = np.append(self.data["torque_trans"], data[:,0], axis=0) self.data["torque_arm"] = np.append(self.data["torque_arm"], data[:,1], axis=0) self.data["drag_left"] = np.append(self.data["drag_left"], data[:,2], axis=0) self.data["drag_right"] = np.append(self.data["drag_right"], data[:,3], axis=0) self.data["time"] = np.arange(len(self.data["torque_trans"]), dtype=float)/self.sr carpos, cpoints = daqmx.ReadCounterF64(self.carpostask, self.nsamps, 10.0, self.nsamps) self.data["carriage_pos"] = np.append(self.data["carriage_pos"], carpos) turbang, cpoints = daqmx.ReadCounterF64(self.turbangtask, self.nsamps, 10.0, self.nsamps) self.data["turbine_angle"] = np.append(self.data["turbine_angle"], turbang) self.data["turbine_rpm"] \ = ts.smooth(fdiff.second_order_diff(self.data["turbine_angle"], self.data["time"])/6.0, 8) return 0 # The function should return an integer
def process_tare_torque(nrun, plot=False): """Process a single tare torque run.""" print("Processing tare torque run", nrun) times = {0 : (35, 86), 1 : (12, 52), 2 : (11, 32), 3 : (7, 30)} nidata = loadhdf("Data/Raw/Tare-torque/" + str(nrun) + "/nidata.h5") # Compute RPM time_ni = nidata["time"] angle = nidata["turbine_angle"] rpm_ni = fdiff.second_order_diff(angle, time_ni)/6.0 rpm_ni = ts.smooth(rpm_ni, 8) try: t1, t2 = times[nrun] except KeyError: t1, t2 = times[3] meanrpm, _ = ts.calcstats(rpm_ni, t1, t2, 2000) torque = nidata["torque_trans"] meantorque, _ = ts.calcstats(torque, t1, t2, 2000) print("Tare torque =", meantorque, "Nm at", meanrpm, "RPM") if plot: plt.figure() plt.plot(time_ni, torque) plt.xlabel("Time (s)") plt.ylabel("Torque (Nm)") plt.tight_layout() plt.show() return meanrpm, -meantorque
def load_nidata(self): nidata = loadhdf(os.path.join(self.raw_dir, "nidata.h5")) self.time_ni = nidata["time"] self.sr_ni = (1.0/(self.time_ni[1] - self.time_ni[0])) self.carriage_pos = nidata["carriage_pos"] self.tow_speed_ni = fdiff.second_order_diff(self.carriage_pos, self.time_ni) self.tow_speed_ni = ts.smooth(self.tow_speed_ni, 100) self.tow_speed_ref = self.tow_speed_ni.copy() self.tow_speed_ref[np.abs(self.tow_speed_ref) < 0.01] = np.nan self.torque = nidata["torque_trans"] self.torque_arm = nidata["torque_arm"] self.drag = nidata["drag_left"] + nidata["drag_right"] # Remove offsets from drag, not torque t0 = 2 self.drag = self.drag - np.mean(self.drag[0:self.sr_ni*t0]) # Compute RPM and omega self.angle = nidata["turbine_angle"] self.rpm_ni = fdiff.second_order_diff(self.angle, self.time_ni)/6.0 self.rpm_ni = ts.smooth(self.rpm_ni, 8) self.omega_ni = self.rpm_ni*2*np.pi/60.0 self.omega = self.omega_ni self.tow_speed = self.tow_speed_ref
def process_strut_torque(nrun, zero_torque=0.0, plot=False, covers=False, verbose=False): """Process a single strut torque run.""" testplan = pd.read_csv("Config/Test plan/Strut-torque.csv", index_col="run") ref_speed = testplan.ref_speed.iloc[nrun] tsr_nom = testplan.tsr.iloc[nrun] revs = testplan.revs.iloc[nrun] rpm_nom = tsr_nom*ref_speed/R/(2*np.pi)*60 dur = revs/rpm_nom*60 if covers: if verbose: print("Processing strut torque with covers run", nrun) nidata = loadhdf("Data/Raw/Strut-torque-covers/" + str(nrun) + \ "/nidata.h5") else: if verbose: print("Processing strut torque run", nrun) nidata = loadhdf("Data/Raw/Strut-torque/" + str(nrun) + "/nidata.h5") # Compute RPM time_ni = nidata["time"] angle = nidata["turbine_angle"] rpm_ni = fdiff.second_order_diff(angle, time_ni)/6.0 rpm_ni = ts.smooth(rpm_ni, 8) t1, t2 = 9, dur meanrpm, _ = ts.calcstats(rpm_ni, t1, t2, 2000) torque = nidata["torque_trans"] torque += calc_tare_torque(rpm_ni) meantorque, _ = ts.calcstats(torque, t1, t2, 2000) tsr_ref = meanrpm/60.0*2*np.pi*R/ref_speed if verbose: print("Reference TSR =", np.round(tsr_ref, decimals=4)) print("Strut torque =", meantorque, "Nm at", meanrpm, "RPM") if plot: plt.figure() plt.plot(time_ni, torque) plt.xlabel("Time (s)") plt.ylabel("Torque (Nm)") plt.tight_layout() plt.show() meantorque -= zero_torque ct = meantorque/(0.5*rho*A*R*ref_speed**2) cp = ct*tsr_ref summary = pd.Series() summary["run"] = nrun summary["tsr_ref"] = tsr_ref summary["cp"] = cp summary["mean_torque"] = meantorque summary["mean_rpm"] = meanrpm return summary
def EveryNCallback_py(taskHandle, everyNsamplesEventType, nSamples, callbackData_ptr): """Function called every N samples""" callbackdata = daqmx.get_callbackdata_from_id(callbackData_ptr) data, npoints = daqmx.ReadAnalogF64(taskHandle, self.nsamps, 10.0, daqmx.Val_GroupByChannel, self.nsamps, len(self.analogchans)) callbackdata.extend(data.tolist()) self.data["torque_trans"] = np.append(self.data["torque_trans"], data[:, 0], axis=0) self.data["torque_arm"] = np.append(self.data["torque_arm"], data[:, 1], axis=0) self.data["drag_left"] = np.append(self.data["drag_left"], data[:, 2], axis=0) self.data["drag_right"] = np.append(self.data["drag_right"], data[:, 3], axis=0) self.data["t"] = np.arange(len(self.data["torque_trans"]), dtype=float) / self.sr carpos, cpoints = daqmx.ReadCounterF64(self.carpostask, self.nsamps, 10.0, self.nsamps) self.data["carriage_pos"] = np.append(self.data["carriage_pos"], carpos) turbang, cpoints = daqmx.ReadCounterF64(self.turbangtask, self.nsamps, 10.0, self.nsamps) self.data["turbine_angle"] = np.append(self.data["turbine_angle"], turbang) self.data["turbine_rpm"] \ = ts.smooth(fdiff.second_order_diff(self.data["turbine_angle"], self.data["t"])/6.0, 50) return 0 # The function should return an integer