sim leader

This commit is contained in:
leo 2022-05-14 16:10:55 +02:00
parent 7439e4ca9a
commit c18d11bc17
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 51 additions and 61 deletions

103
Car.py
View File

@ -48,6 +48,9 @@ class Car():
self.laneShape=None self.laneShape=None
self.laneId=0 self.laneId=0
self.leader=None self.leader=None
self.leaderAtInter=None
self.leaderDist=0
self.leaderAtInterDist=0
self.startTime=float(startTime) self.startTime=float(startTime)
self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed
self.IA=(IA == '1') if isinstance(IA, str) else IA self.IA=(IA == '1') if isinstance(IA, str) else IA
@ -62,7 +65,6 @@ class Car():
self.b=20 self.b=20
self.minSpace=10 self.minSpace=10
self.interMinSpace=20 self.interMinSpace=20
self.leaderBefore=False
self.distToInter=0 self.distToInter=0
self.timeStopped=0 self.timeStopped=0
self.speedPercentage=0 self.speedPercentage=0
@ -137,9 +139,6 @@ class Car():
l = 0 l = 0
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId) carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) carsHere = list(filter(lambda c: c.id != self.id, carsHere))
self.leaderBefore = False
self.distToInter = 0
closestToReturn = None
while(l<maxDist): while(l<maxDist):
endPos = laneShape[shapeInd+1] endPos = laneShape[shapeInd+1]
@ -158,44 +157,29 @@ class Car():
l+=dist(self.pos,endPos) l+=dist(self.pos,endPos)
else: else:
l+=dist(laneShape[shapeInd],endPos) l+=dist(laneShape[shapeInd],endPos)
shapeInd+=1
if(shapeInd>=len(laneShape)-1):
shapeInd = 0
edgeInd+=1
if(not self.route[edgeInd].isSpecial()):
prevInd = edgeInd
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) # me demande pas pourquoi mais si on le convertit pas en liste ici le filter original est modifié
if(edgeInd>=len(self.route)-1):
return
newLane = self.getShape(edgeInd)
laneShape = newLane[0]
laneId = newLane[2]
else: else:
if l == 0: if l == 0:
l+=dist(self.pos, closest.pos) l+=dist(self.pos, closest.pos)
else: else:
l+=dist(laneShape[shapeInd], closest.pos) l+=dist(laneShape[shapeInd], closest.pos)
if l <= maxDist: if l <= maxDist:
if closestToReturn is None: self.leaderDist=l
self.leaderDist = l return closest
closestToReturn = closest
if l > self.interMinSpace and closestToReturn is not None:
return closestToReturn
else: else:
return return
shapeInd+=1
if(shapeInd>=len(laneShape)-1):
shapeInd = 0
edgeInd+=1
if l > self.interMinSpace and closestToReturn is not None:
return closestToReturn
carComing = self.getLeaderAtIntersection(prevInd,edgeInd)
if(carComing is not None):
self.distToInter = l # y as un bug qqu part dans le calcul de la distance, ça saute quand on change d'edge
if self.route[edgeInd].isSpecial():
self.distToInter += self.route[edgeInd + 1].getLength()
self.leaderDist = carComing[0]
self.leaderBefore = True
return carComing[1]
if(not self.route[edgeInd].isSpecial()):
prevInd = edgeInd
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) # me demande pas pourquoi mais si on le convertit pas en liste ici le filter original est modifié
if(edgeInd>=len(self.route)-1):
return
newLane = self.getShape(edgeInd)
laneShape = newLane[0]
laneId = newLane[2]
return return
def getCurrentEdge(self): def getCurrentEdge(self):
@ -214,6 +198,28 @@ class Car():
return cDist return cDist
return cDist return cDist
def getDistToEndOfEdge(self):
lgt = 0
lgt += dist(self.pos, self.laneShape[self.laneInd+1])
for p,n in zip(self.laneShape[self.laneInd+1:], self.laneShape[self.laneInd+2:]):
lgt += dist(p,n)
return lgt
def getLeaderAtIntersections(self, maxDist):
l = self.getDistToEndOfEdge()
edgeInd = self.index + 1
while l < maxDist:
carComing = self.getLeaderAtIntersection(edgeInd - 1,edgeInd)
l += self.route[edgeInd].getLength()
if carComing is not None:
self.distToInter = l
self.leaderAtInterDist = carComing[0]
return carComing[1]
edgeInd += 1
if edgeInd >= len(self.route):
return
return
def getLeaderAtIntersection(self, prevInd, edgeInd): def getLeaderAtIntersection(self, prevInd, edgeInd):
# On récupère les edges juste avant et juste après l'intersection # On récupère les edges juste avant et juste après l'intersection
while(self.route[edgeInd].isSpecial()): while(self.route[edgeInd].isSpecial()):
@ -285,7 +291,7 @@ class Car():
carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge) carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) closest = min(carsInEdge, key=lambda c: c[0])
cl = closest[1] cl = closest[1]
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo() and not (cl.v == 0 and (cl.leader is not None and cl.leaderBefore and cl.leaderDist > 10)): #TODO: le 10 je l'ai sorti de mon if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): #TODO: le 10 je l'ai sorti de mon
cars.append(closest) cars.append(closest)
for incEdge in prevNode.getIncoming(): for incEdge in prevNode.getIncoming():
@ -302,7 +308,7 @@ class Car():
carsInEdge = zip([self.getCarDist(c, incEdge, incLane.getIndex())+prevLanesLgt+intLaneLgt for c in carsInEdge], carsInEdge) carsInEdge = zip([self.getCarDist(c, incEdge, incLane.getIndex())+prevLanesLgt+intLaneLgt for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) closest = min(carsInEdge, key=lambda c: c[0])
cl = closest[1] cl = closest[1]
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo() and not (cl.v == 0 and (cl.leader is not None and cl.leaderBefore and cl.leaderDist > 10)): #TODO: comme avant (d'ailleurs faudrait les rassembler) if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): #TODO: comme avant (d'ailleurs faudrait les rassembler)
cars.append(closest) cars.append(closest)
@ -433,7 +439,7 @@ class Car():
self.v = 0 self.v = 0
return return
if not self.leaderBefore: if self.leaderAtInter is None:
self.forceThrough = False self.forceThrough = False
if leader is None: if leader is None:
@ -445,7 +451,7 @@ class Car():
bleader = leader.b bleader = leader.b
# si on est à une intersection # si on est à une intersection
if(self.leaderBefore): if(self.leaderAtInter is not None):
if self.v == 0: if self.v == 0:
self.timeAtInter += dt self.timeAtInter += dt
else: else:
@ -533,25 +539,8 @@ class Car():
if self.v < 1 and self.getCurrentEdge().isSpecial(): if self.v < 1 and self.getCurrentEdge().isSpecial():
print(f"{self.id} stalled where he souldn't have") 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) self.leader=self.getLeader(100)
self.leaderAtInter=self.getLeaderAtIntersections(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 vmax = self.vmax
if self.dynSpeed: if self.dynSpeed:
@ -598,7 +587,7 @@ class Car():
return 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 (inter : {self.leaderBefore})")) self.signals.updateDisp.emit(("Leader", f"{self.leader.id if self.leader is not None else 'None'} @ {self.leaderDist:.2f}m : {self.leaderAtInter.id if self.leaderAtInter is not None else 'None'} @ {self.leaderAtInterDist:.2f})"))
def __copy__(self): def __copy__(self):
copy = Car(self.id, self.rawRoute, self.startTime, self.dynSpeed, self.IA, self.map, self.controller, self.infoWidg) copy = Car(self.id, self.rawRoute, self.startTime, self.dynSpeed, self.IA, self.map, self.controller, self.infoWidg)

View File

@ -223,10 +223,10 @@ class CarController:
painter.setPen(Qt.green) painter.setPen(Qt.green)
colorOverride = True colorOverride = True
elif(selectedCar[0].leader is not None and selectedCar[0].leader.id == car.id): elif(selectedCar[0].leader is not None and selectedCar[0].leader.id == car.id):
if selectedCar[0].leaderBefore: painter.setPen(Qt.red)
painter.setPen(QColor(100,0,255)) colorOverride = True
else: elif(selectedCar[0].leaderAtInter is not None and selectedCar[0].leaderAtInter.id == car.id):
painter.setPen(Qt.red) painter.setPen(QColor(100,0,255))
colorOverride = True colorOverride = True
else: else:
painter.setPen(Qt.white) painter.setPen(Qt.white)
@ -254,3 +254,4 @@ class CarController:
return return
closest = min(self.cars, key=lambda c: dist(c.pos, [pos.x(), pos.y()])) closest = min(self.cars, key=lambda c: dist(c.pos, [pos.x(), pos.y()]))
self.selectedId = closest.id self.selectedId = closest.id
self.infoWidget.setCurrentIndex(self.cars.index(closest))