From 32496cd12c7857221bb5c8db494d3d03b9f6e808 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 13 May 2022 21:12:14 +0200 Subject: [PATCH] inter chack back + ui --- Car.py | 68 +++++++++++++++++++++++++++++++++++++-------- CarController.py | 23 +++++++++++---- comp_rdp_t2.rou.xml | 19 +++++++++++++ comp_rdp_t3.rou.xml | 25 +++++++++++++++++ main.py | 19 +++++++++++-- mainLoop.py | 2 +- mainPainter.py | 4 ++- 7 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 comp_rdp_t2.rou.xml create mode 100644 comp_rdp_t3.rou.xml diff --git a/Car.py b/Car.py index defa6c6..88b4be8 100644 --- a/Car.py +++ b/Car.py @@ -1,7 +1,7 @@ import sumolib from math import dist, ceil, sqrt, log, cos, sin, atan2, pi from random import randint, uniform -from PySide6.QtGui import QPainter +from PySide6.QtGui import QPainter, QColor from PySide6.QtCore import QPointF, Signal, QObject, Qt from itertools import islice @@ -51,6 +51,8 @@ class Car(): self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed self.IA=(IA == '1') if isinstance(IA, str) else IA self.cligno=[] + self.isLeader=0 + self.leaderStopped=0 self.pos=[0,0] self.dir=0 @@ -260,20 +262,37 @@ class Car(): carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex()) for c in carsInEdge], carsInEdge) closest = min(carsInEdge, key=lambda c: c[0]) cars.append(closest) - + # On cherche aussi dans les edges du node precedent et les edge d'avant prevLanesLgt = intLaneLgt + conn[i].getFromLane().getLength() prevNode = edge.getFromNode() for intLaneID in prevNode.getInternal(): intLane = self.map.getLane(intLaneID) intEdge = intLane.getEdge() - carsInEdge = self.controller.getCarsOnLane(intEdge.getID(), intLane.getIndex()) - carsInEdge = list(filter(lambda c: c.nextNonSpecialEdge() == edge and c.nextNonSpecialEdge(3) == conn[i].getTo(), carsInEdge)) + carsInEdge = list(self.controller.getCarsOnLane(intEdge.getID(), intLane.getIndex())) if len(carsInEdge) != 0: carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge) closest = min(carsInEdge, key=lambda c: c[0]) - cars.append(closest) - + cl = closest[1] + if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): + cars.append(closest) + + for incEdge in prevNode.getIncoming(): + if incEdge.isSpecial(): + continue + incLane = incEdge.getLane(0) + intConn = incEdge.getConnections(edge) + intLaneLgt = 0 + if len(intConn) != 0: + intLaneLgt = self.map.getLane(intConn[0].getViaLaneID()).getLength() + carsInEdge = list(self.controller.getCarsOnEdge(incEdge.getID())) + #carsInEdge = list(filter(lambda c: c.nextNonSpecialEdge() == edge and c.nextNonSpecialEdge(3) == conn[i].getTo() and (c.leader is None or c.leader.getCurrentEdge().getID() != c.getCurrentEdge().getID()), carsInEdge)) + if len(carsInEdge) != 0: + carsInEdge = zip([self.getCarDist(c, incEdge, incLane.getIndex())+prevLanesLgt+intLaneLgt for c in carsInEdge], carsInEdge) + closest = min(carsInEdge, key=lambda c: c[0]) + cl = closest[1] + if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): + cars.append(closest) if(len(cars) == 0): return None @@ -287,12 +306,17 @@ class Car(): def nextNonSpecialEdge(self, startOffset = 1): return next(filter(lambda e: not e.isSpecial(), islice(self.route, self.index + startOffset, None))) - def draw(self,painter): + def draw(self,painter, colorOverride): pt = QPointF(*self.pos) - if self.forceThrough: + if colorOverride: + pass + elif self.forceThrough: painter.setPen(Qt.blue) + elif self.isLeader > 0: + painter.setPen(QColor(255,0,255)) elif self.leader is None: painter.setPen(Qt.gray) + painter.drawEllipse(pt,self.size,self.size) painter.drawLine(self.pos[0], self.pos[1], self.pos[0]+5*cos(self.dir), self.pos[1]+5*sin(self.dir)) @@ -444,13 +468,17 @@ class Car(): self.leader = None # On supprime le leader (pour que seulement la premiere voiture detecte la dependance circulaire) self.v = min(vmax, self.v + self.a*dt) return + + if self.leaderStopped > 1: + self.v = min(vmax, self.v + self.a*dt) + return # si on est suffisement loin de l'intersection (i.e on s'en fout du leader) # ou si on as le temps d'arriver à l'intersection avant le leader (plus un marge pour garder un distance de sécu) # alors on accelere pour s'inserer #print(tti, leader.T, marg, ltti) - if self.distToInter > self.interMinSpace + dts or (tti + leader.T + marg) < ltti: + if self.distToInter > self.interMinSpace + dts or self.distToInter < 3 or (tti + leader.T + marg) < ltti: self.v = min(vmax, self.v + self.a*dt) #print(self.id, "ca passe") else:# sinon on freine @@ -468,7 +496,7 @@ class Car(): # fonction pour verifier si on as pas une dependence circulaire de leader def circularLeaderDep(self): l = self.leader - timeout = 5 + timeout = 4 ls = [] while l is not None and timeout > 0: ls.append(l.id) @@ -493,7 +521,25 @@ class Car(): if self.v < 1 and self.getCurrentEdge().isSpecial(): print(f"{self.id} stalled where he souldn't have") """ + oldLeaderId = "None" + if self.leader is not None: + oldLeaderId = self.leader.id + if self.leaderBefore: + self.leader.isLeader -= 1 + self.leader=self.getLeader(100) + + if self.leader is not None: + if self.leader.id != oldLeaderId: + self.leaderStopped = 0 + + if self.leaderBefore: + self.leader.isLeader += 1 + if self.leader.v == 0: + self.leaderStopped += dt + print(self.leaderStopped) + + vmax = self.vmax if self.dynSpeed: @@ -547,7 +593,7 @@ class Car(): copy.route = self.route copy.cligno = self.cligno copy.pos = self.pos.copy() - copy.laneShape = self.laneShape + copy.laneShape = self.laneShape.copy() copy.laneId = self.laneId copy.vmax = self.vmax return copy diff --git a/CarController.py b/CarController.py index effcb7d..f24fcce 100644 --- a/CarController.py +++ b/CarController.py @@ -110,6 +110,7 @@ class CarController: self.dynSpeedRat = 1 self.infoWidget = None + self.selectedId = 0 self.vroomEnable=True @@ -210,16 +211,22 @@ class CarController: #print(f"nope, y as déjà une voiture ici : n°{self.spawnFailed}") def draw(self,painter): + selectedCar = [c for c in self.cars if c.id == self.selectedId] for ind,car in enumerate(self.cars): - selectedId = self.infoWidget.currentIndex() - selectedCar = self.cars[selectedId] - if ind == selectedId: + #selectedId = self.infoWidget.currentIndex() + colorOverride = False + if len(selectedCar) == 0: + pass + elif car.id == self.selectedId: painter.setPen(Qt.green) - elif(selectedCar.leader is not None and selectedCar.leader.id == car.id): + colorOverride = True + elif(selectedCar[0].leader is not None and selectedCar[0].leader.id == car.id): painter.setPen(Qt.red) + colorOverride = True else: painter.setPen(Qt.white) - car.draw(painter) + colorOverride = False + car.draw(painter, colorOverride) def destroyCar(self, car): self.carsDestroyed += 1 @@ -236,3 +243,9 @@ class CarController: def getFlowBacklog(self): return sum([f.backlog(self.t) for f in self.flows]) + + def selectClosest(self, pos): + if len(self.cars) == 0: + return + closest = min(self.cars, key=lambda c: dist(c.pos, [pos.x(), pos.y()])) + self.selectedId = closest.id diff --git a/comp_rdp_t2.rou.xml b/comp_rdp_t2.rou.xml new file mode 100644 index 0000000..b5ff69d --- /dev/null +++ b/comp_rdp_t2.rou.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/comp_rdp_t3.rou.xml b/comp_rdp_t3.rou.xml new file mode 100644 index 0000000..c6a1a43 --- /dev/null +++ b/comp_rdp_t3.rou.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main.py b/main.py index 9f33ffc..1008cdb 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ if 'SUMO_HOME' in os.environ: else: print("please declare environment variable 'SUMO_HOME'") -from PySide6.QtCore import Qt, QTimer, QElapsedTimer, QThread, Slot, Signal +from PySide6.QtCore import Qt, QTimer, QElapsedTimer, QThread, Slot, Signal, QPointF from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog from PySide6.QtGui import QSurfaceFormat, QAction from window import Ui_MainWindow @@ -15,6 +15,7 @@ from mainLoop import mainLoop class MainWindow(QMainWindow): stopMainLoopTimer = Signal() startMainLoop = Signal() + setPhTimerInterval = Signal(int) def __init__(self): super().__init__() self.ui = Ui_MainWindow() @@ -51,6 +52,7 @@ class MainWindow(QMainWindow): self.ui.stopButton.clicked.connect(self.mainLoop.stopTimer) self.startMainLoop.connect(self.mainLoop.startTimer) + self.setPhTimerInterval.connect(self.mainLoop.setTimerInterval) self.stopMainLoopTimer.connect(self.mainLoop.stopTimer) @@ -70,6 +72,18 @@ class MainWindow(QMainWindow): self.mainLoop.quickLoad() elif e.key() == Qt.Key_G: self.startMainLoop.emit() + elif e.key() == Qt.Key_E: + self.setPhTimerInterval.emit(0) + elif e.key() == Qt.Key_D: + self.setPhTimerInterval.emit(17) + elif e.key() == Qt.Key_F: + self.setPhTimerInterval.emit(500) + + def mousePressEvent(self, QMouseEvent): + tran = self.ui.mainSurf.transform.inverted()[0] + worldPoint = tran.map(QMouseEvent.position() - QPointF(5, 30)) + self.mainLoop.controller.selectClosest(worldPoint) + self.ui.mainSurf.debugPoint = worldPoint def updateFPS(self): self.fpsAverage += 1 @@ -97,7 +111,8 @@ class MainWindow(QMainWindow): widget = self.findChild(QLabel,"physicsFPS") if(t == 0): return - widget.setText(f"ph fps : {1000/t:.1f}") + dt = self.mainLoop.controller.dt + widget.setText(f"ph fps : {1000/t:.1f}, speedup : {1000/t * dt:.1f}") def openNetwork(self): filename = QFileDialog.getOpenFileName(self,"Open Network", "./", "Network File (*.net.xml)") diff --git a/mainLoop.py b/mainLoop.py index 164abaf..619760b 100644 --- a/mainLoop.py +++ b/mainLoop.py @@ -90,7 +90,7 @@ class mainLoop(QObject): def quickLoad(self): self.map.fromPath("comp_rdp.net.xml") self.painter.generateTransform() - self.controller.fromPath("comp_rdp_t1.rou.xml") + self.controller.fromPath("comp_rdp.rou.xml") self.controller.prepareRoute() def updateFps(self): diff --git a/mainPainter.py b/mainPainter.py index 58a1cbf..a7dfb61 100644 --- a/mainPainter.py +++ b/mainPainter.py @@ -1,5 +1,5 @@ from PySide6.QtOpenGLWidgets import QOpenGLWidget -from PySide6.QtCore import Qt, QThread +from PySide6.QtCore import Qt, QThread, QPointF from PySide6.QtGui import QPainter, QFont, QColor, QTransform, QOpenGLContext, QOpenGLFunctions from PySide6 import QtOpenGL @@ -10,6 +10,7 @@ class mainPainter(QOpenGLWidget): self.map = None self.carController = None self.transform = QTransform() + self.debugPoint = QPointF(0,0) def addMap(self, netMap): self.map = netMap @@ -41,3 +42,4 @@ class mainPainter(QOpenGLWidget): painter.setTransform(self.transform) self.map.draw(painter) self.carController.draw(painter) + #painter.drawEllipse(self.debugPoint, 10, 10)