This commit is contained in:
leo 2022-02-27 15:37:06 +01:00
parent b5ac5a820f
commit bed9dcc52a
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
5 changed files with 81 additions and 16 deletions

40
Car.py
View File

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

View File

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

View File

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