2024-10-30 18:42:23 +03:00
|
|
|
import pyqtgraph as pg
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
2024-11-01 16:43:12 +03:00
|
|
|
from utils import read_json, DiagramParser
|
|
|
|
|
from uml import Request, UMLCreator
|
2024-10-30 18:42:23 +03:00
|
|
|
#нижний fe x1
|
|
|
|
|
import qt_settings as qts
|
|
|
|
|
from OptAlgorithm import OptAlgorithm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Application:
|
2024-11-01 16:43:12 +03:00
|
|
|
def __init__(self,
|
|
|
|
|
opt: OptAlgorithm,
|
|
|
|
|
bool_dict: dict,
|
|
|
|
|
float_dict: dict):
|
2024-10-30 18:42:23 +03:00
|
|
|
pg.setConfigOptions(antialias=True)
|
2024-11-01 11:08:02 +03:00
|
|
|
self.opt = opt
|
2024-11-01 16:43:12 +03:00
|
|
|
self.bool_dict = bool_dict
|
|
|
|
|
self.float_dict = float_dict
|
|
|
|
|
|
2024-10-30 18:42:23 +03:00
|
|
|
self.scaler = 1000
|
|
|
|
|
self._getIdealTimings()
|
|
|
|
|
self._init_app()
|
|
|
|
|
self.WeldTime = 0.5 #[sec]
|
|
|
|
|
self.alpha = 100 #[0-255 прозрачность фона]
|
|
|
|
|
|
|
|
|
|
def _init_app(self):
|
|
|
|
|
self.app = pg.mkQApp("Plotting")
|
|
|
|
|
self.win = pg.GraphicsLayoutWidget(show=True, title="")
|
|
|
|
|
self.win.resize(1000,600)
|
|
|
|
|
self.win.setWindowTitle('')
|
|
|
|
|
|
|
|
|
|
self.p11, self.l11 = self._init_graph('Electrode force, closure', 'Force', 'N', 'Time', 'ms')
|
|
|
|
|
#self.p21, _ = self._init_graph('Electrode force, compression', 'Force', 'N', 'Time', 'ms')
|
|
|
|
|
#self.p31, _ = self._init_graph('Electrode force, compression', 'Force', 'N', 'Time', 'ms')
|
|
|
|
|
self.win.nextRow()
|
|
|
|
|
self.p12, self.l12 = self._init_graph('Rotor Position, closure', 'Posicion', 'mm', 'Time', 'ms')
|
|
|
|
|
#self.p22, _ = self._init_graph('Rotor Position, compression', 'Posicion', 'mm', 'Time', 'ms')
|
|
|
|
|
#self.p32, _ = self._init_graph('Rotor Position, compression', 'Posicion', 'mm', 'Time', 'ms')
|
|
|
|
|
self.win.nextRow()
|
|
|
|
|
self.p13, self.l13 = self._init_graph('Rotor Speed, closure', 'Speed', 'mm/s', 'Time', 'ms')
|
|
|
|
|
#self.p23, _ = self._init_graph('Rotor Speed, compression', 'Speed', 'mm/s', 'Time', 'ms')
|
|
|
|
|
#self.p33, _ = self._init_graph('Rotor Speed, compression', 'Speed', 'mm/s', 'Time', 'ms')
|
|
|
|
|
self.win.nextRow()
|
|
|
|
|
|
|
|
|
|
self.p12.setXLink(self.p11)
|
|
|
|
|
self.p13.setXLink(self.p11)
|
|
|
|
|
|
|
|
|
|
self.p11.setAutoVisible(x=False, y=True)
|
|
|
|
|
self.p12.setAutoVisible(x=False, y=True)
|
|
|
|
|
self.p13.setAutoVisible(x=False, y=True)
|
|
|
|
|
|
|
|
|
|
def _init_graph(self, title, Yname, Yunits, Xname, Xunits):
|
|
|
|
|
p11 = self.win.addPlot(title = title)
|
|
|
|
|
p11.showGrid(x=True, y=True)
|
|
|
|
|
p11.setLabel('left', Yname, units=Yunits)
|
|
|
|
|
p11.setLabel('bottom', Xname, units=Xunits)
|
|
|
|
|
legend1 = pg.LegendItem((80,60), offset=(70,20))
|
|
|
|
|
legend1.setParentItem(p11)
|
|
|
|
|
return p11, legend1
|
|
|
|
|
|
|
|
|
|
def updatePlots(self):
|
2024-11-01 13:34:28 +03:00
|
|
|
self._plotRealData()
|
2024-10-30 18:42:23 +03:00
|
|
|
times = np.arange(20000)/10
|
|
|
|
|
self._plotIdealData(times)
|
|
|
|
|
|
|
|
|
|
def _getIdealTimings(self):
|
|
|
|
|
data = self.opt.Ts
|
2024-11-01 13:34:28 +03:00
|
|
|
self.idealTime = [data['tclose'], data['tgrow'], self.opt.getMarkOpen()]
|
|
|
|
|
|
2024-10-30 18:42:23 +03:00
|
|
|
def _form_idealdatGraph(self, times):
|
|
|
|
|
self.idealPhase0 = (self.idealTime[0])*self.scaler #Подъезд
|
|
|
|
|
self.idealPhase1 = (self.idealTime[0]+ self.idealTime[1])*self.scaler #Сжатие
|
|
|
|
|
self.idealPhase2 = (self.idealTime[0]+ self.idealTime[1] + self.WeldTime)*self.scaler #Сварка
|
|
|
|
|
self.idealPhase3 = (self.idealTime[0]+ self.idealTime[1] + self.idealTime[2] + self.WeldTime)*self.scaler #Разъезд
|
|
|
|
|
data = []
|
|
|
|
|
for time in times:
|
|
|
|
|
if time <= self.idealPhase0:
|
|
|
|
|
x_fe, x_me, v_fe, v_me, f = self.opt.calcPhaseClose(time/self.scaler)
|
|
|
|
|
elif time <= self.idealPhase1:
|
|
|
|
|
x_fe, x_me, v_fe, v_me, f = self.opt.calcPhaseGrow(time/self.scaler-self.idealTime[0])
|
|
|
|
|
elif time <= self.idealPhase2:
|
|
|
|
|
x_fe, x_me, v_fe, v_me, f = data[-1]
|
|
|
|
|
elif time <= self.idealPhase3:
|
|
|
|
|
x_fe, x_me, v_fe, v_me, f = self.opt.calcPhaseOpen(time/self.scaler-self.idealTime[0]-self.idealTime[1]-self.WeldTime)
|
|
|
|
|
else:
|
|
|
|
|
x_fe, x_me, v_fe, v_me, f = 0, 0, 0, 0, 0
|
|
|
|
|
data.append([x_fe, x_me, v_fe, v_me, f])
|
|
|
|
|
data = np.array(data).T
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def _plotRealData(self):
|
|
|
|
|
for i, (key, dat) in enumerate(self.float_dict.items()):
|
|
|
|
|
dat = np.array(dat).T
|
|
|
|
|
dat[0] = dat[0]*self.scaler
|
|
|
|
|
curve = pg.PlotDataItem(dat[0], dat[1], pen=pg.mkPen(color=qts.colors[i], width=2), name=key, autoDownsample=True, downsample=True)
|
|
|
|
|
if 'Electrode Force' in key:
|
|
|
|
|
self.p11.addItem(curve)
|
|
|
|
|
self.l11.addItem(curve, key)
|
|
|
|
|
elif 'Rotor Position' in key:
|
|
|
|
|
self.p12.addItem(curve)
|
|
|
|
|
self.l12.addItem(curve, key)
|
|
|
|
|
elif 'Rotor Speed' in key:
|
|
|
|
|
self.p13.addItem(curve)
|
|
|
|
|
self.l13.addItem(curve, key)
|
|
|
|
|
return dat[0]
|
|
|
|
|
|
|
|
|
|
def _plotIdealData(self, times):
|
|
|
|
|
data = self._form_idealdatGraph(times)
|
|
|
|
|
|
|
|
|
|
x_fe = pg.PlotDataItem(times, data[0]*1000, pen=pg.mkPen(color=qts.colors[8], width=2), name='x_fe', autoDownsample=True, downsample=True)
|
|
|
|
|
x_me = pg.PlotDataItem(times, data[1]*1000, pen=pg.mkPen(color=qts.colors[9], width=2), name='x_me', autoDownsample=True, downsample=True)
|
|
|
|
|
v_fe = pg.PlotDataItem(times, data[2]*1000, pen=pg.mkPen(color=qts.colors[8], width=2), name='v_fe', autoDownsample=True, downsample=True)
|
|
|
|
|
v_me = pg.PlotDataItem(times, data[3]*1000, pen=pg.mkPen(color=qts.colors[9], width=2), name='v_me', autoDownsample=True, downsample=True)
|
|
|
|
|
f = pg.PlotDataItem(times, data[4], pen=pg.mkPen(color=qts.colors[8], width=2), name='f', autoDownsample=True, downsample=True)
|
|
|
|
|
|
|
|
|
|
self.p11.addItem(f)
|
|
|
|
|
self.l11.addItem(f, 'Ideal force')
|
|
|
|
|
|
|
|
|
|
self.p12.addItem(x_fe)
|
|
|
|
|
self.l12.addItem(x_fe, 'FE POS')
|
|
|
|
|
self.p12.addItem(x_me)
|
|
|
|
|
self.l12.addItem(x_me, 'ME POS')
|
|
|
|
|
|
|
|
|
|
self.p13.addItem(v_fe)
|
|
|
|
|
self.l13.addItem(v_fe, 'FE VEL')
|
|
|
|
|
self.p13.addItem(v_me)
|
|
|
|
|
self.l13.addItem(v_me, 'ME VEL')
|
|
|
|
|
self._addBackgroundSplitter()
|
|
|
|
|
|
|
|
|
|
def _addBackgroundSplitter(self):
|
|
|
|
|
alpha = self.alpha
|
|
|
|
|
x = [[0, self.idealPhase0],
|
|
|
|
|
[self.idealPhase0, self.idealPhase1],
|
|
|
|
|
[self.idealPhase1, self.idealPhase2],
|
|
|
|
|
[self.idealPhase2, self.idealPhase3]]
|
|
|
|
|
y01 = [100000000000, 100000000000]
|
|
|
|
|
y0_1 = [-100000000000, -100000000000]
|
|
|
|
|
for i, _ in enumerate(x):
|
|
|
|
|
a01 = pg.PlotDataItem(_, y01, pen=pg.mkPen(color=qts.colors[8], width=2), name=' ')
|
|
|
|
|
a0_1 = pg.PlotDataItem(_, y0_1, pen=pg.mkPen(color=qts.colors[8], width=2), name=' ')
|
|
|
|
|
bg1 = pg.FillBetweenItem(a01, a0_1, qts.RGBA[i]+(alpha,))
|
|
|
|
|
bg2 = pg.FillBetweenItem(a01, a0_1, qts.RGBA[i]+(alpha,))
|
|
|
|
|
bg3 = pg.FillBetweenItem(a01, a0_1, qts.RGBA[i]+(alpha,))
|
|
|
|
|
self.p11.addItem(bg1)
|
|
|
|
|
self.p12.addItem(bg2)
|
|
|
|
|
self.p13.addItem(bg3)
|
|
|
|
|
|
|
|
|
|
self.p11.setYRange(-1000, 5000)
|
|
|
|
|
self.p12.setYRange(-50, 250)
|
|
|
|
|
self.p13.setYRange(-400, 400)
|
|
|
|
|
|
|
|
|
|
|
2024-11-01 16:43:12 +03:00
|
|
|
def get_ideal_timings(opt: OptAlgorithm) -> list[float]:
|
|
|
|
|
data = opt.Ts
|
|
|
|
|
ideal_time = [data['tclose'], data['tgrow'], opt.getMarkOpen()]
|
|
|
|
|
return ideal_time
|
2024-10-30 18:42:23 +03:00
|
|
|
|
|
|
|
|
|
2024-11-01 16:43:12 +03:00
|
|
|
def main():
|
2024-11-01 11:08:02 +03:00
|
|
|
operator_params = read_json("params/operator_params.json")
|
|
|
|
|
system_params = read_json("params/system_params.json")
|
|
|
|
|
opt_algorithm = OptAlgorithm(operator_config=operator_params, system_config=system_params)
|
2024-11-01 16:43:12 +03:00
|
|
|
ideal_times = get_ideal_timings(opt_algorithm)
|
|
|
|
|
|
|
|
|
|
parser = DiagramParser()
|
|
|
|
|
parser.setData("2024_10_28-17_03_34.csv")
|
|
|
|
|
bool_dict = parser.getBoolDict()
|
|
|
|
|
float_dict = parser.getFloatDict()
|
|
|
|
|
|
|
|
|
|
request_generator = Request(server_url='http://www.plantuml.com/plantuml/svg/')
|
|
|
|
|
uml_creator = UMLCreator(request_generator=request_generator,
|
|
|
|
|
ideal_time=ideal_times,
|
|
|
|
|
bool_dict=bool_dict,
|
|
|
|
|
float_dict=float_dict)
|
|
|
|
|
uml_creator.update_uml()
|
|
|
|
|
|
|
|
|
|
app = Application(opt=opt_algorithm,
|
|
|
|
|
bool_dict=bool_dict,
|
|
|
|
|
float_dict=float_dict)
|
|
|
|
|
|
2024-10-30 18:42:23 +03:00
|
|
|
app.updatePlots()
|
|
|
|
|
pg.exec()
|
|
|
|
|
|
2024-11-01 16:43:12 +03:00
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|