Ajouté l'algo de conduite selon les instructions du chef
This commit is contained in:
parent
2abfcc53db
commit
2935893f02
38
Car.py
38
Car.py
@ -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):
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user