inter chack back + ui
This commit is contained in:
parent
3370a466a9
commit
32496cd12c
68
Car.py
68
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
|
||||
|
@ -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
19
comp_rdp_t2.rou.xml
Normal 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
25
comp_rdp_t3.rou.xml
Normal 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
19
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)")
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user