amélioré la detection du leader

This commit is contained in:
leo 2022-02-16 17:08:24 +01:00
parent e932b3253b
commit 4a6f5bf8e0
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 81 additions and 47 deletions

87
Car.py
View File

@ -1,21 +1,29 @@
import sumolib import sumolib
import math from math import dist
from PySide6.QtGui import QPainter from PySide6.QtGui import QPainter
from PySide6.QtCore import QPointF from PySide6.QtCore import QPointF
class Car: class Car:
def initPath(self): def getShape(self, edgeInd):
startEdge=self.route[self.index] startEdge = self.route[edgeInd]
nextEdge=self.route[self.index+1] nextEdge = self.route[edgeInd+1]
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 lane = startEdge.getLane(laneId)
lane=startEdge.getLane(laneId) vmax = lane.getSpeed()
self.vmax=lane.getSpeed() laneShape = lane.getShape()
self.laneShape=lane.getShape()
if(inverted): if(inverted):
self.laneShape.reverse() laneShape = laneShape.reverse()
return (laneShape, vmax, laneId)
def initPath(self):
newLane = self.getShape(self.index)
self.laneShape = newLane[0]
self.vmax = newLane[1]
self.laneId = newLane[2]
self.infoWidg.setVal("Index",f"{self.index}/{len(self.route)}") self.infoWidg.setVal("Index",f"{self.index}/{len(self.route)}")
self.infoWidg.setVal("Edge",self.route[self.index]) self.infoWidg.setVal("Edge",self.route[self.index])
@ -30,6 +38,8 @@ class Car:
self.index=0 self.index=0
self.laneInd=0 self.laneInd=0
self.route=[] self.route=[]
self.laneShape=None
self.laneId=0
self.leader=None self.leader=None
self.pos=[0,0] self.pos=[0,0]
@ -37,6 +47,8 @@ class Car:
self.a=10 self.a=10
self.b=20 self.b=20
self.vmax=0
self.infoWidg.setVal("Position",self.pos) self.infoWidg.setVal("Position",self.pos)
self.infoWidg.setVal("Vitesse",self.v) self.infoWidg.setVal("Vitesse",self.v)
self.infoWidg.setVal("Index",f"{self.index}/{len(route)}") self.infoWidg.setVal("Index",f"{self.index}/{len(route)}")
@ -63,6 +75,40 @@ class Car:
self.pos=list(self.laneShape[0]) self.pos=list(self.laneShape[0])
def getLeader(self, maxDist):
shapeInd = self.laneInd
edgeInd = self.index
laneShape = self.laneShape
laneId = self.laneId
l = 0
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
while(l<maxDist):
endPos = laneShape[shapeInd+1]
carsHere = filter(lambda c: c.laneInd == shapeInd, carsHere)
if(shapeInd == self.laneInd and edgeInd == self.index):
carsHere = filter(lambda c: dist(c.pos,endPos) < dist(self.pos,endPos),carsHere)
closest = None
try:
closest = min(carsHere, key=lambda c: dist(c.pos,laneShape[shapeInd]))
except ValueError:
if(shapeInd == self.laneInd and edgeInd == self.index):
l+=dist(self.pos,endPos)
else:
l+=dist(laneShape[shapeInd],endPos)
shapeInd+=1
if(shapeInd>=len(laneShape)-1):
shapeInd = 0
edgeInd+=1
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
if(edgeInd>=len(self.route)-1):
return
newLane = self.getShape(edgeInd)
laneShape = newLane[0]
laneId = newLane[2]
else:
return closest
return
def draw(self,painter): def draw(self,painter):
pt = QPointF(*self.pos) pt = QPointF(*self.pos)
painter.drawEllipse(pt,3,3) painter.drawEllipse(pt,3,3)
@ -87,26 +133,15 @@ class Car:
self.infoWidg.addSpeedPoint(1,self.controller.t,vsec) self.infoWidg.addSpeedPoint(1,self.controller.t,vsec)
def update(self,dt): def update(self,dt):
leaders=self.controller.getCarsOnEdge(self.route[self.index].getID()) self.leader=self.getLeader(50)
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): self.conduite(self.vmax,self.leader,dt)
minDist=db
leader=l
self.leader=leader
self.conduite(self.vmax,leader,dt)
lgt=self.v*dt lgt=self.v*dt
while(lgt>0): while(lgt>0):
endPos=self.laneShape[self.laneInd+1] endPos=self.laneShape[self.laneInd+1]
l=math.dist(self.pos,endPos) l=dist(self.pos,endPos)
if lgt>=l: if lgt>=l:
lgt-=l lgt-=l
pos=list(self.laneShape[-1]) pos=list(self.laneShape[-1])
@ -127,4 +162,4 @@ class Car:
self.infoWidg.setVal("Position", self.pos) self.infoWidg.setVal("Position", self.pos)
self.infoWidg.setVal("Vitesse", self.v) self.infoWidg.setVal("Vitesse", self.v)
self.infoWidg.setVal("Leader", leader if leader is None else leader.id) self.infoWidg.setVal("Leader", self.leader if self.leader is None else self.leader.id)

View File

@ -8,7 +8,7 @@ from math import ceil
class carInfo(QWidget): class carInfo(QWidget):
def __init__(self): def __init__(self):
super(carInfo,self).__init__() super().__init__()
self.ui = Ui_carInfo() self.ui = Ui_carInfo()
self.ui.setupUi(self) self.ui.setupUi(self)
self.maxV = 0 self.maxV = 0
@ -30,7 +30,7 @@ class carInfo(QWidget):
self.speedSeries[ind].remove(0) self.speedSeries[ind].remove(0)
self.speedSeries[ind].append(t,val) self.speedSeries[ind].append(t,val)
if(self.speedSeries[ind].count()>2): if self.speedSeries[ind].count()>2:
i = self.speedSeries[ind].count()-1 i = self.speedSeries[ind].count()-1
pm2 = self.speedSeries[ind].at(i-2) pm2 = self.speedSeries[ind].at(i-2)
pm1 = self.speedSeries[ind].at(i-1) pm1 = self.speedSeries[ind].at(i-1)
@ -38,13 +38,13 @@ class carInfo(QWidget):
diffL = (pm1.y() - pm2.y())/(pm1.x() - pm2.x()) diffL = (pm1.y() - pm2.y())/(pm1.x() - pm2.x())
diffR = (pm0.y() - pm1.y())/(pm0.x() - pm1.x()) diffR = (pm0.y() - pm1.y())/(pm0.x() - pm1.x())
diff2 = diffR - diffL diff2 = diffR - diffL
if(diff2 == 0): if diff2 == 0:
self.speedSeries[ind].remove(i-1) self.speedSeries[ind].remove(i-1)
xAxis = self.chart.axes(Qt.Horizontal,self.speedSeries[ind])[0] xAxis = self.chart.axes(Qt.Horizontal,self.speedSeries[ind])[0]
xAxis.setRange(max(t-500,0),t) xAxis.setRange(max(t-500,0),t)
if(val>self.maxV): if val>self.maxV:
self.maxV = val self.maxV = val
yAxis = self.chart.axes(Qt.Vertical, self.speedSeries[ind])[0] yAxis = self.chart.axes(Qt.Vertical, self.speedSeries[ind])[0]
yAxis.setMax(ceil(val+1)) yAxis.setMax(ceil(val+1))
@ -53,7 +53,7 @@ class carInfo(QWidget):
def setVal(self,key,val): def setVal(self,key,val):
obj = self.findChild(QLabel,key) obj = self.findChild(QLabel,key)
if(obj is None): if obj is None:
return return
obj.setText(f"{key} : {val}") obj.setText(f"{key} : {val}")
obj.update() obj.update()
@ -63,11 +63,12 @@ class CarController:
self.map=parentMap self.map=parentMap
self.cars=[] self.cars=[]
self.t=0 self.t=0
self.infoWidget=None
def fromPath(self,path): def fromPath(self,path):
self.cars=[] self.cars=[]
self.t=0 self.t=0
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"):
@ -79,16 +80,15 @@ class CarController:
for car in self.cars: for car in self.cars:
car.prepareRoute() car.prepareRoute()
def getCarsOnEdge(self,edgeID): # on devrai probablement utiliser une map ici (dict en python?) mais flemme def getCarsOnEdge(self,edgeID):
res=[] return filter(lambda c: c.route[c.index].getID()==edgeID,self.cars)
for car in self.cars:
cid=car.route[car.index].getID() def getCarsOnLane(self,edgeID,laneID):
if(cid==edgeID): cars = self.getCarsOnEdge(edgeID)
res.append(car) return cars #filter(lambda c: c.laneId == laneID,cars)
return res
def update(self): def update(self):
if(self.map.net is None): if self.map.net is None:
return return
self.t+=1 self.t+=1
for car in self.cars: for car in self.cars:
@ -98,7 +98,7 @@ class CarController:
for ind,car in enumerate(self.cars): for ind,car in enumerate(self.cars):
selectedId = self.infoWidget.currentIndex() selectedId = self.infoWidget.currentIndex()
selectedCar = self.cars[selectedId] selectedCar = self.cars[selectedId]
if(ind == selectedId): if ind == selectedId:
painter.setPen(Qt.green) painter.setPen(Qt.green)
elif(selectedCar.leader is not None and selectedCar.leader.id == car.id): elif(selectedCar.leader is not None and selectedCar.leader.id == car.id):
painter.setPen(Qt.red) painter.setPen(Qt.red)
@ -108,4 +108,3 @@ class CarController:
def setInfoWidget(self, widget): def setInfoWidget(self, widget):
self.infoWidget = widget self.infoWidget = widget