inter chack back + ui

This commit is contained in:
leo 2022-05-13 21:12:14 +02:00
parent 3370a466a9
commit 32496cd12c
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
7 changed files with 140 additions and 20 deletions

68
Car.py
View File

@ -1,7 +1,7 @@
import sumolib import sumolib
from math import dist, ceil, sqrt, log, cos, sin, atan2, pi from math import dist, ceil, sqrt, log, cos, sin, atan2, pi
from random import randint, uniform 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 PySide6.QtCore import QPointF, Signal, QObject, Qt
from itertools import islice from itertools import islice
@ -51,6 +51,8 @@ class Car():
self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed
self.IA=(IA == '1') if isinstance(IA, str) else IA self.IA=(IA == '1') if isinstance(IA, str) else IA
self.cligno=[] self.cligno=[]
self.isLeader=0
self.leaderStopped=0
self.pos=[0,0] self.pos=[0,0]
self.dir=0 self.dir=0
@ -260,20 +262,37 @@ class Car():
carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex()) for c in carsInEdge], carsInEdge) carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex()) for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) closest = min(carsInEdge, key=lambda c: c[0])
cars.append(closest) cars.append(closest)
# On cherche aussi dans les edges du node precedent et les edge d'avant # On cherche aussi dans les edges du node precedent et les edge d'avant
prevLanesLgt = intLaneLgt + conn[i].getFromLane().getLength() prevLanesLgt = intLaneLgt + conn[i].getFromLane().getLength()
prevNode = edge.getFromNode() prevNode = edge.getFromNode()
for intLaneID in prevNode.getInternal(): for intLaneID in prevNode.getInternal():
intLane = self.map.getLane(intLaneID) intLane = self.map.getLane(intLaneID)
intEdge = intLane.getEdge() intEdge = intLane.getEdge()
carsInEdge = self.controller.getCarsOnLane(intEdge.getID(), intLane.getIndex()) carsInEdge = list(self.controller.getCarsOnLane(intEdge.getID(), intLane.getIndex()))
carsInEdge = list(filter(lambda c: c.nextNonSpecialEdge() == edge and c.nextNonSpecialEdge(3) == conn[i].getTo(), carsInEdge))
if len(carsInEdge) != 0: if len(carsInEdge) != 0:
carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge) carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) 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): if(len(cars) == 0):
return None return None
@ -287,12 +306,17 @@ class Car():
def nextNonSpecialEdge(self, startOffset = 1): def nextNonSpecialEdge(self, startOffset = 1):
return next(filter(lambda e: not e.isSpecial(), islice(self.route, self.index + startOffset, None))) 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) pt = QPointF(*self.pos)
if self.forceThrough: if colorOverride:
pass
elif self.forceThrough:
painter.setPen(Qt.blue) painter.setPen(Qt.blue)
elif self.isLeader > 0:
painter.setPen(QColor(255,0,255))
elif self.leader is None: elif self.leader is None:
painter.setPen(Qt.gray) painter.setPen(Qt.gray)
painter.drawEllipse(pt,self.size,self.size) 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)) 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.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) self.v = min(vmax, self.v + self.a*dt)
return 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) # 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) # 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 # alors on accelere pour s'inserer
#print(tti, leader.T, marg, ltti) #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) self.v = min(vmax, self.v + self.a*dt)
#print(self.id, "ca passe") #print(self.id, "ca passe")
else:# sinon on freine else:# sinon on freine
@ -468,7 +496,7 @@ class Car():
# fonction pour verifier si on as pas une dependence circulaire de leader # fonction pour verifier si on as pas une dependence circulaire de leader
def circularLeaderDep(self): def circularLeaderDep(self):
l = self.leader l = self.leader
timeout = 5 timeout = 4
ls = [] ls = []
while l is not None and timeout > 0: while l is not None and timeout > 0:
ls.append(l.id) ls.append(l.id)
@ -493,7 +521,25 @@ class Car():
if self.v < 1 and self.getCurrentEdge().isSpecial(): if self.v < 1 and self.getCurrentEdge().isSpecial():
print(f"{self.id} stalled where he souldn't have") 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) 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 vmax = self.vmax
if self.dynSpeed: if self.dynSpeed:
@ -547,7 +593,7 @@ class Car():
copy.route = self.route copy.route = self.route
copy.cligno = self.cligno copy.cligno = self.cligno
copy.pos = self.pos.copy() copy.pos = self.pos.copy()
copy.laneShape = self.laneShape copy.laneShape = self.laneShape.copy()
copy.laneId = self.laneId copy.laneId = self.laneId
copy.vmax = self.vmax copy.vmax = self.vmax
return copy return copy

View File

@ -110,6 +110,7 @@ class CarController:
self.dynSpeedRat = 1 self.dynSpeedRat = 1
self.infoWidget = None self.infoWidget = None
self.selectedId = 0
self.vroomEnable=True self.vroomEnable=True
@ -210,16 +211,22 @@ class CarController:
#print(f"nope, y as déjà une voiture ici : n°{self.spawnFailed}") #print(f"nope, y as déjà une voiture ici : n°{self.spawnFailed}")
def draw(self,painter): def draw(self,painter):
selectedCar = [c for c in self.cars if c.id == self.selectedId]
for ind,car in enumerate(self.cars): for ind,car in enumerate(self.cars):
selectedId = self.infoWidget.currentIndex() #selectedId = self.infoWidget.currentIndex()
selectedCar = self.cars[selectedId] colorOverride = False
if ind == selectedId: if len(selectedCar) == 0:
pass
elif car.id == self.selectedId:
painter.setPen(Qt.green) 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) painter.setPen(Qt.red)
colorOverride = True
else: else:
painter.setPen(Qt.white) painter.setPen(Qt.white)
car.draw(painter) colorOverride = False
car.draw(painter, colorOverride)
def destroyCar(self, car): def destroyCar(self, car):
self.carsDestroyed += 1 self.carsDestroyed += 1
@ -236,3 +243,9 @@ class CarController:
def getFlowBacklog(self): def getFlowBacklog(self):
return sum([f.backlog(self.t) for f in self.flows]) 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

19
comp_rdp_t2.rou.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- generated on 2022-05-13 15:45:26 by Eclipse SUMO netedit Version 1.12.0
-->
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/routes_file.xsd">
<vehicle id="v_0" depart="1.00">
<route edges="E5 E1 E10 E9 E0 -E40 -E8"/>
</vehicle>
<vehicle id="v_1" depart="6.00">
<route edges="E6 E3 E9 E0 E11 -E10 -E5"/>
</vehicle>
<vehicle id="v_2" depart="0.00">
<route edges="E7 E2 E0 E11 E10 -E30 -E6"/>
</vehicle>
<vehicle id="v_3" depart="6.50">
<route edges="E8 E4 E11 E10 E9 -E20 -E7"/>
</vehicle>
</routes>

25
comp_rdp_t3.rou.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- generated on 2022-05-13 18:17:05 by Eclipse SUMO netedit Version 1.12.0
-->
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/routes_file.xsd">
<vehicle id="v_0" depart="0.00">
<route edges="E5 E1 E10 E9 E0 -E40 -E8"/>
</vehicle>
<vehicle id="v_1" depart="0.00">
<route edges="E6 E3 E9 E0 E11 -E10 -E5"/>
</vehicle>
<vehicle id="v_2" depart="0.00">
<route edges="E7 E2 E0 E11 E10 -E30 -E6"/>
</vehicle>
<vehicle id="v_5" depart="0.00">
<route edges="E8 E4 E11 -E10 -E5"/>
</vehicle>
<vehicle id="v_3" depart="1.00">
<route edges="E8 E4 E11 E10 E9 -E20 -E7"/>
</vehicle>
<vehicle id="v_4" depart="1.00">
<route edges="E8 E4 E11 E10 E9 -E20 -E7"/>
</vehicle>
</routes>

19
main.py
View File

@ -5,7 +5,7 @@ if 'SUMO_HOME' in os.environ:
else: else:
print("please declare environment variable 'SUMO_HOME'") 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.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog
from PySide6.QtGui import QSurfaceFormat, QAction from PySide6.QtGui import QSurfaceFormat, QAction
from window import Ui_MainWindow from window import Ui_MainWindow
@ -15,6 +15,7 @@ from mainLoop import mainLoop
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
stopMainLoopTimer = Signal() stopMainLoopTimer = Signal()
startMainLoop = Signal() startMainLoop = Signal()
setPhTimerInterval = Signal(int)
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.ui = Ui_MainWindow() self.ui = Ui_MainWindow()
@ -51,6 +52,7 @@ class MainWindow(QMainWindow):
self.ui.stopButton.clicked.connect(self.mainLoop.stopTimer) self.ui.stopButton.clicked.connect(self.mainLoop.stopTimer)
self.startMainLoop.connect(self.mainLoop.startTimer) self.startMainLoop.connect(self.mainLoop.startTimer)
self.setPhTimerInterval.connect(self.mainLoop.setTimerInterval)
self.stopMainLoopTimer.connect(self.mainLoop.stopTimer) self.stopMainLoopTimer.connect(self.mainLoop.stopTimer)
@ -70,6 +72,18 @@ class MainWindow(QMainWindow):
self.mainLoop.quickLoad() self.mainLoop.quickLoad()
elif e.key() == Qt.Key_G: elif e.key() == Qt.Key_G:
self.startMainLoop.emit() 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): def updateFPS(self):
self.fpsAverage += 1 self.fpsAverage += 1
@ -97,7 +111,8 @@ class MainWindow(QMainWindow):
widget = self.findChild(QLabel,"physicsFPS") widget = self.findChild(QLabel,"physicsFPS")
if(t == 0): if(t == 0):
return 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): def openNetwork(self):
filename = QFileDialog.getOpenFileName(self,"Open Network", "./", "Network File (*.net.xml)") filename = QFileDialog.getOpenFileName(self,"Open Network", "./", "Network File (*.net.xml)")

View File

@ -90,7 +90,7 @@ class mainLoop(QObject):
def quickLoad(self): def quickLoad(self):
self.map.fromPath("comp_rdp.net.xml") self.map.fromPath("comp_rdp.net.xml")
self.painter.generateTransform() self.painter.generateTransform()
self.controller.fromPath("comp_rdp_t1.rou.xml") self.controller.fromPath("comp_rdp.rou.xml")
self.controller.prepareRoute() self.controller.prepareRoute()
def updateFps(self): def updateFps(self):

View File

@ -1,5 +1,5 @@
from PySide6.QtOpenGLWidgets import QOpenGLWidget 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.QtGui import QPainter, QFont, QColor, QTransform, QOpenGLContext, QOpenGLFunctions
from PySide6 import QtOpenGL from PySide6 import QtOpenGL
@ -10,6 +10,7 @@ class mainPainter(QOpenGLWidget):
self.map = None self.map = None
self.carController = None self.carController = None
self.transform = QTransform() self.transform = QTransform()
self.debugPoint = QPointF(0,0)
def addMap(self, netMap): def addMap(self, netMap):
self.map = netMap self.map = netMap
@ -41,3 +42,4 @@ class mainPainter(QOpenGLWidget):
painter.setTransform(self.transform) painter.setTransform(self.transform)
self.map.draw(painter) self.map.draw(painter)
self.carController.draw(painter) self.carController.draw(painter)
#painter.drawEllipse(self.debugPoint, 10, 10)