sim leader
This commit is contained in:
parent
7439e4ca9a
commit
c18d11bc17
103
Car.py
103
Car.py
@ -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)
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user