flow
This commit is contained in:
parent
b5ac5a820f
commit
bed9dcc52a
40
Car.py
40
Car.py
@ -30,6 +30,8 @@ class Car():
|
|||||||
self.vmax = newLane[1]
|
self.vmax = newLane[1]
|
||||||
self.laneId = newLane[2]
|
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(("Index",f"{self.index}/{len(self.route)}"))
|
||||||
self.signals.updateDisp.emit(("Edge",self.route[self.index]))
|
self.signals.updateDisp.emit(("Edge",self.route[self.index]))
|
||||||
|
|
||||||
@ -47,11 +49,7 @@ class Car():
|
|||||||
self.laneId=0
|
self.laneId=0
|
||||||
self.leader=None
|
self.leader=None
|
||||||
self.startTime=float(startTime)
|
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.pos=[0,0]
|
||||||
self.v=0
|
self.v=0
|
||||||
self.a=10
|
self.a=10
|
||||||
@ -60,13 +58,19 @@ class Car():
|
|||||||
self.vmax=0
|
self.vmax=0
|
||||||
|
|
||||||
self.vroom = 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(("Position",self.pos))
|
||||||
self.signals.updateDisp.emit(("Vitesse",self.v))
|
self.signals.updateDisp.emit(("Vitesse",self.v))
|
||||||
self.signals.updateDisp.emit(("Index",f"{self.index}/{len(route)}"))
|
self.signals.updateDisp.emit(("Index",f"{self.index}/{len(route)}"))
|
||||||
|
|
||||||
self.rawRoute = route
|
|
||||||
|
|
||||||
def prepareRoute(self):
|
def prepareRoute(self):
|
||||||
route = list(map(self.map.getEdge,self.rawRoute))
|
route = list(map(self.map.getEdge,self.rawRoute))
|
||||||
for r,rn in zip(route,route[1:]):
|
for r,rn in zip(route,route[1:]):
|
||||||
@ -161,8 +165,11 @@ class Car():
|
|||||||
S=5
|
S=5
|
||||||
T=0.3
|
T=0.3
|
||||||
vsec=vleader+(S-vmax*T)/(vbar/bbar+T)
|
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)
|
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((2,self.controller.t,self.v))
|
||||||
self.signals.addGraphPt.emit((0,self.controller.t,vmax))
|
self.signals.addGraphPt.emit((0,self.controller.t,vmax))
|
||||||
self.signals.addGraphPt.emit((1,self.controller.t,vsec))
|
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[0]+=(endPos[0]-self.pos[0])*adv
|
||||||
self.pos[1]+=(endPos[1]-self.pos[1])*adv
|
self.pos[1]+=(endPos[1]-self.pos[1])*adv
|
||||||
lgt=0
|
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(("Position", self.pos))
|
||||||
self.signals.updateDisp.emit(("Vitesse", self.v))
|
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"))
|
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:
|
def __copy__(self):
|
||||||
self.vroom = 60
|
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
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import sumolib
|
import sumolib
|
||||||
from Car import Car
|
from Car import Car
|
||||||
|
from Flow import Flow
|
||||||
from carInfo import Ui_carInfo
|
from carInfo import Ui_carInfo
|
||||||
from PySide6.QtWidgets import QWidget, QLabel
|
from PySide6.QtWidgets import QWidget, QLabel
|
||||||
from PySide6.QtCore import Qt, Slot, Signal, QThread
|
from PySide6.QtCore import Qt, Slot, Signal, QThread
|
||||||
@ -78,6 +79,7 @@ class CarController:
|
|||||||
def __init__(self,parentMap):
|
def __init__(self,parentMap):
|
||||||
self.map=parentMap
|
self.map=parentMap
|
||||||
self.cars=[]
|
self.cars=[]
|
||||||
|
self.flows=[]
|
||||||
self.t=0
|
self.t=0
|
||||||
self.infoWidget=None
|
self.infoWidget=None
|
||||||
|
|
||||||
@ -87,15 +89,21 @@ class CarController:
|
|||||||
while self.infoWidget.count() != 0:
|
while self.infoWidget.count() != 0:
|
||||||
self.infoWidget.removeItem(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()
|
route=vehicle.route[0].edges.split()
|
||||||
wId=self.infoWidget.addItem(carInfo(self.infoWidget), vehicle.id)
|
if vehicle.name == "vehicle":
|
||||||
self.cars.append(Car(vehicle.id,route,vehicle.depart,self.map,self,self.infoWidget.widget(wId)))
|
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):
|
def prepareRoute(self):
|
||||||
for car in self.cars:
|
for car in self.cars:
|
||||||
car.prepareRoute()
|
car.prepareRoute()
|
||||||
|
|
||||||
|
for flow in self.flows:
|
||||||
|
flow.prepareRoute()
|
||||||
|
|
||||||
def getCarsOnEdge(self,edgeID):
|
def getCarsOnEdge(self,edgeID):
|
||||||
return filter(lambda c: c.route[c.index].getID()==edgeID,self.cars)
|
return filter(lambda c: c.route[c.index].getID()==edgeID,self.cars)
|
||||||
|
|
||||||
@ -110,6 +118,10 @@ class CarController:
|
|||||||
for car in self.cars:
|
for car in self.cars:
|
||||||
car.update(1.0/60)
|
car.update(1.0/60)
|
||||||
|
|
||||||
|
for flow in self.flows:
|
||||||
|
if flow.shouldSpawn(self.t):
|
||||||
|
self.cars.append(flow.spawnCar())
|
||||||
|
|
||||||
def draw(self,painter):
|
def draw(self,painter):
|
||||||
for ind,car in enumerate(self.cars):
|
for ind,car in enumerate(self.cars):
|
||||||
selectedId = self.infoWidget.currentIndex()
|
selectedId = self.infoWidget.currentIndex()
|
||||||
|
25
Flow.py
Normal file
25
Flow.py
Normal file
@ -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
|
@ -72,9 +72,9 @@ class mainLoop(QObject):
|
|||||||
|
|
||||||
@threadSafe
|
@threadSafe
|
||||||
def quickLoad(self):
|
def quickLoad(self):
|
||||||
self.map.fromPath("test2.net.xml")
|
self.map.fromPath("test4.net.xml")
|
||||||
self.painter.generateTransform()
|
self.painter.generateTransform()
|
||||||
self.controller.fromPath("test5.rou.xml")
|
self.controller.fromPath("test8.rou.xml")
|
||||||
self.controller.prepareRoute()
|
self.controller.prepareRoute()
|
||||||
|
|
||||||
def updateFps(self):
|
def updateFps(self):
|
||||||
|
10
test8.rou.xml
Normal file
10
test8.rou.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!-- generated on 2022-02-27 14:22:47 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">
|
||||||
|
<flow id="f_0" begin="0.00" end="3600.00" vehsPerHour="3600.00">
|
||||||
|
<route edges="gneE0 gneE1"/>
|
||||||
|
</flow>
|
||||||
|
</routes>
|
Loading…
x
Reference in New Issue
Block a user