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
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

View File

@ -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

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:
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)")

View File

@ -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):

View File

@ -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)