Ajouté l'algo de conduite selon les instructions du chef

This commit is contained in:
leo 2022-02-10 18:36:19 +01:00
parent 2abfcc53db
commit 2935893f02
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 38 additions and 10 deletions

38
Car.py
View File

@ -10,15 +10,18 @@ class Car:
inverted=not (startEdge.getToNode()==nextEdge.getFromNode() or startEdge.getToNode()==nextEdge.getToNode()) inverted=not (startEdge.getToNode()==nextEdge.getFromNode() or startEdge.getToNode()==nextEdge.getToNode())
laneId=0 if not inverted else 1 laneId=0 if not inverted else 1
self.laneShape=startEdge.getLane(laneId).getShape() lane=startEdge.getLane(laneId)
self.vmax=lane.getSpeed()
self.laneShape=lane.getShape()
if(inverted): if(inverted):
self.laneShape.reverse() self.laneShape.reverse()
print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}") print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}")
def __init__(self,carID,route,parentMap,surface): def __init__(self,carID,route,parentMap,parentController,surface):
self.id=carID self.id=carID
self.map=parentMap self.map=parentMap
self.controller=parentController
self.index=0 self.index=0
self.laneInd=0 self.laneInd=0
self.route=[] self.route=[]
@ -49,20 +52,37 @@ class Car:
def draw(self,col): def draw(self,col):
pg.draw.circle(self.surf,col,self.map.convertPos(self.pos),5) pg.draw.circle(self.surf,col,self.map.convertPos(self.pos),5)
def conduite(self): def conduite(self,vmax,leader,dt):
vmax=100 # vitesse max sur la route actuelle if(leader==None):
vleader=vmax # vitesse de la voiture leader self.v=vmax
bleader=15 return
else:
vleader=leader.v # vitesse de la voiture leader
bleader=leader.b
vbar=(self.v+vleader)/2 vbar=(self.v+vleader)/2
bbar=(bleader+self.b)/2 # decelleration de la vleader et de self bbar=(bleader+self.b)/2
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(vmax,vsec) vd=min(self.v*self.a*dt,vmax,vsec)
self.v=max(0,vd) self.v=max(0,vd)
def update(self,dt): def update(self,dt):
self.conduite() leaders=self.controller.getCarsOnEdge(self.route[self.index].getID())
leader=None
minDist=self.route[self.index].getLength()
for l in leaders:
db=math.dist(self.pos,l.pos)
de=math.dist(l.pos,self.laneShape[-1])
df=math.dist(self.pos,self.laneShape[-1])
if(de<df and db<minDist):
minDist=db
leader=l
self.conduite(self.vmax,leader,dt)
lgt=self.v*dt lgt=self.v*dt
while(lgt>0): while(lgt>0):

View File

@ -11,7 +11,15 @@ class CarController:
def fromPath(self,path): def fromPath(self,path):
for vehicle in sumolib.xml.parse(path,"vehicle"): for vehicle in sumolib.xml.parse(path,"vehicle"):
route=vehicle.route[0].edges.split() route=vehicle.route[0].edges.split()
self.cars.append(Car(vehicle.id,route,self.map,self.surf)) self.cars.append(Car(vehicle.id,route,self.map,self,self.surf))
def getCarsOnEdge(self,edgeID): # on devrai probablement utiliser une map ici (dict en python?) mais flemme
res=[]
for car in self.cars:
cid=car.route[car.index].getID()
if(cid==edgeID):
res.append(car)
return res
def update(self): def update(self):
for car in self.cars: for car in self.cars: