From bed9dcc52a468cf067ea50c2e31977503983db44 Mon Sep 17 00:00:00 2001 From: leo Date: Sun, 27 Feb 2022 15:37:06 +0100 Subject: [PATCH] flow --- Car.py | 40 +++++++++++++++++++++++++++++----------- CarController.py | 18 +++++++++++++++--- Flow.py | 25 +++++++++++++++++++++++++ mainLoop.py | 4 ++-- test8.rou.xml | 10 ++++++++++ 5 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 Flow.py create mode 100644 test8.rou.xml diff --git a/Car.py b/Car.py index 1402ee0..9b57e4b 100644 --- a/Car.py +++ b/Car.py @@ -30,6 +30,8 @@ class Car(): self.vmax = newLane[1] self.laneId = newLane[2] + if self.infoWidg is None: + return self.signals.updateDisp.emit(("Index",f"{self.index}/{len(self.route)}")) self.signals.updateDisp.emit(("Edge",self.route[self.index])) @@ -47,11 +49,7 @@ class Car(): self.laneId=0 self.leader=None self.startTime=float(startTime) - - self.signals=updateSignals() - self.signals.updateDisp.connect(self.infoWidg.setVal) - self.signals.addGraphPt.connect(self.infoWidg.addSpeedPoint) - + self.pos=[0,0] self.v=0 self.a=10 @@ -60,13 +58,19 @@ class Car(): self.vmax=0 self.vroom = 0 + + self.rawRoute = route + + if infoWidg is None: + return + self.signals=updateSignals() + self.signals.updateDisp.connect(self.infoWidg.setVal) + self.signals.addGraphPt.connect(self.infoWidg.addSpeedPoint) self.signals.updateDisp.emit(("Position",self.pos)) self.signals.updateDisp.emit(("Vitesse",self.v)) self.signals.updateDisp.emit(("Index",f"{self.index}/{len(route)}")) - self.rawRoute = route - def prepareRoute(self): route = list(map(self.map.getEdge,self.rawRoute)) for r,rn in zip(route,route[1:]): @@ -161,8 +165,11 @@ class Car(): S=5 T=0.3 vsec=vleader+(S-vmax*T)/(vbar/bbar+T) - vd=min(self.v+self.a*dt,vmax,vsec) + vd=min(self.v+self.a*dt,vmax) #,vsec) self.v=max(0,vd) + + if self.infoWidg is None: + return self.signals.addGraphPt.emit((2,self.controller.t,self.v)) self.signals.addGraphPt.emit((0,self.controller.t,vmax)) self.signals.addGraphPt.emit((1,self.controller.t,vsec)) @@ -197,10 +204,21 @@ class Car(): self.pos[0]+=(endPos[0]-self.pos[0])*adv self.pos[1]+=(endPos[1]-self.pos[1])*adv lgt=0 - + + if randint(0,100) == 0: + self.vroom = 60 + + if self.infoWidg is None: + return self.signals.updateDisp.emit(("Position", self.pos)) self.signals.updateDisp.emit(("Vitesse", self.v)) self.signals.updateDisp.emit(("Leader", self.leader if self.leader is None else f"{self.leader.id} @ {self.leaderDist:.2f}m")) - if randint(0,100) == 0: - self.vroom = 60 + def __copy__(self): + copy = Car(self.id, self.rawRoute, self.startTime, self.map, self.controller, self.infoWidg) + copy.route = self.route + copy.pos = self.pos.copy() + copy.laneShape = self.laneShape + copy.laneId = self.laneId + copy.vmax = self.vmax + return copy diff --git a/CarController.py b/CarController.py index 82aa1cc..ff91fb5 100644 --- a/CarController.py +++ b/CarController.py @@ -1,5 +1,6 @@ import sumolib from Car import Car +from Flow import Flow from carInfo import Ui_carInfo from PySide6.QtWidgets import QWidget, QLabel from PySide6.QtCore import Qt, Slot, Signal, QThread @@ -78,6 +79,7 @@ class CarController: def __init__(self,parentMap): self.map=parentMap self.cars=[] + self.flows=[] self.t=0 self.infoWidget=None @@ -87,15 +89,21 @@ class CarController: while self.infoWidget.count() != 0: self.infoWidget.removeItem(0) - for vehicle in sumolib.xml.parse(path,"vehicle"): + for vehicle in sumolib.xml.parse(path,["vehicle","flow"]): route=vehicle.route[0].edges.split() - wId=self.infoWidget.addItem(carInfo(self.infoWidget), vehicle.id) - self.cars.append(Car(vehicle.id,route,vehicle.depart,self.map,self,self.infoWidget.widget(wId))) + if vehicle.name == "vehicle": + wId=self.infoWidget.addItem(carInfo(self.infoWidget), vehicle.id) + self.cars.append(Car(vehicle.id,route,vehicle.depart,self.map,self,self.infoWidget.widget(wId))) + elif vehicle.name == "flow": + self.flows.append(Flow(vehicle.id, route, vehicle.begin, vehicle.vehsPerHour, self.map, self)) def prepareRoute(self): for car in self.cars: car.prepareRoute() + for flow in self.flows: + flow.prepareRoute() + def getCarsOnEdge(self,edgeID): return filter(lambda c: c.route[c.index].getID()==edgeID,self.cars) @@ -110,6 +118,10 @@ class CarController: for car in self.cars: car.update(1.0/60) + for flow in self.flows: + if flow.shouldSpawn(self.t): + self.cars.append(flow.spawnCar()) + def draw(self,painter): for ind,car in enumerate(self.cars): selectedId = self.infoWidget.currentIndex() diff --git a/Flow.py b/Flow.py new file mode 100644 index 0000000..c669664 --- /dev/null +++ b/Flow.py @@ -0,0 +1,25 @@ +from Car import Car + +import copy + +class Flow: + def __init__(self,ID,route,start,vph,parentMap,parentController): + self.route = route + self.id = ID + self.startTime = start + self.vph = float(vph) + self.carModel = Car("model",self.route,start,parentMap,parentController,None) + self.carsSpawned = 0 + + def prepareRoute(self): + self.carModel.prepareRoute() + + def shouldSpawn(self, t): + f = self.carsSpawned / (t/3600) + return f < self.vph + + def spawnCar(self): + newCar = copy.copy(self.carModel) + newCar.id = self.id + str(self.carsSpawned) + self.carsSpawned += 1 + return newCar diff --git a/mainLoop.py b/mainLoop.py index 5d62914..4a5cbc1 100644 --- a/mainLoop.py +++ b/mainLoop.py @@ -72,9 +72,9 @@ class mainLoop(QObject): @threadSafe def quickLoad(self): - self.map.fromPath("test2.net.xml") + self.map.fromPath("test4.net.xml") self.painter.generateTransform() - self.controller.fromPath("test5.rou.xml") + self.controller.fromPath("test8.rou.xml") self.controller.prepareRoute() def updateFps(self): diff --git a/test8.rou.xml b/test8.rou.xml new file mode 100644 index 0000000..1e63708 --- /dev/null +++ b/test8.rou.xml @@ -0,0 +1,10 @@ + + + + + + + + +