From 16de024bb6b81bca250edc97a7e33529b6084834 Mon Sep 17 00:00:00 2001 From: Franz Bethke <bethke@math.hu-berlin.de> Date: Mon, 4 Dec 2017 23:05:29 +0100 Subject: [PATCH] Rework CACC-sim; for uncertainty --- modules/CACC/CACC-Module-Test.py | 203 +++++++++++++++++++------------ 1 file changed, 126 insertions(+), 77 deletions(-) diff --git a/modules/CACC/CACC-Module-Test.py b/modules/CACC/CACC-Module-Test.py index e2c8c8db..e2f631fa 100644 --- a/modules/CACC/CACC-Module-Test.py +++ b/modules/CACC/CACC-Module-Test.py @@ -1,96 +1,130 @@ import random +import IPython +import sys import matplotlib matplotlib.use('TkAgg') from matplotlib import pyplot as plt -class Car(object): - cSpeed = None - cPos = None - cDist = None +class UnderCIPDerror(Exception): + pass - cIPD = None - IPD = None - PS = None +class Car(object): - def __init__(self, prev, speed, position, IPD, PS): + def __init__(self, prev, speed, position, IPD, PS, tStep): self.plattonPrev = prev - self.cSpeed = speed self.cPos = position - self.updateDis() - self.cIPD = 0.01*IPD # noch keine cIPD definition existent self.IPD = IPD self.PS = PS + self.tStep = tStep self.bcIPD = False + + RAND = 0.5 + self.SonarSystemUnc = random.uniform(-RAND,RAND) # in cm + self.SonarStatisticalUnc = lambda : random.gauss(0,RAND) # in cm + + self.SpeedSystemUnc = random.uniform(-RAND,RAND) # in meter per seconds + self.SpeedStatisticalUnc = lambda : random.gauss(0,RAND) # in meter per seconds + + # self.SpeedSystemUnc = random.uniform(0,0) # in meter per seconds + # self.SpeedStatisticalUnc = lambda : random.gauss(0,0) # in meter per seconds + + self.EngineSystemUnc = random.uniform(-RAND,RAND) # in meter per seconds + # self.EngineSystemUnc = random.uniform(0,0) # in meter per seconds + + self.setSpeed(speed) + self.getDistance() + self.v_v = self.cSpeed return None def getCIPD(self): - return self.cIPD + return 0.01*self.IPD - def getPos(self): - return self.cPos - def getSpeed(self): - return self.cSpeed - + if self.cSpeed <= 1e-8: + return 0 + return self.SpeedSystemUnc + self.cSpeed + self.SpeedStatisticalUnc() + + def setSpeed(self,value): + if value > 1e-8: + self.cSpeed = value + self.speed = self.EngineSystemUnc + value + else: + self.cSpeed = 0 + self.speed = 0 + def getDistance(self): - return self.cDist + setLater = False + try: + self.oldDist = self.dist + except AttributeError: + setLater = True + + if not self.plattonPrev == None: + self.dist = self.SonarSystemUnc + (self.plattonPrev.cPos - self.cPos) + self.SonarStatisticalUnc() + else: + self.dist = sys.maxsize + + if setLater: + self.oldDist = self.dist + return self.dist def updatePos(self): - self.cPos = self.cPos + self.cSpeed/16 #Ticklaenge. Kann zusammen mit dem i in den Updates angepasst werden. Das Produkt beider muss 1 sein + self.cPos += self.cSpeed/float(tStep) - def updateDis(self): + def estimateVeloVA(self): if not self.plattonPrev == None: - self.cDist = - self.cPos + self.plattonPrev.getPos()#* random.uniform(0.999, 1.001) # bis zu 0.001 relative Abweichung auf die Entfernungsmessung + return self.getSpeed() + (self.dist - self.oldDist)*self.tStep def updateSpeed(self): if not self.bcIPD: - d_c = self.cDist - v_c = self.cSpeed + d = self.getDistance() # sensor data + v = self.getSpeed() # sesnor data IPD = self.IPD - PS = self.PS - v_n = None + PS = self.PS + v_new = None if not self.plattonPrev == None: - v_v = self.plattonPrev.getSpeed() #* random.uniform(0.9, 1.1) # bis zu 0.1 relative Abweichung auf die Geschwindigkeitsmessung - if self.checkInbound(d_c, IPD, 0.01*IPD): - if self.checkInbound (v_c, v_v, 0.01*v_v): - if self.checkInbound(v_c, PS, 0.01*PS): - v_n = PS + # v_v = self.plattonPrev.getSpeed() # TODO estimate this speed + self.v_v = self.estimateVeloVA() + v_v = self.v_v + if checkInbound(d, IPD, 0.01*IPD): + if checkInbound (v, v_v, 0.01*v_v): + if checkInbound(v, PS, 0.01*PS): + v_new = PS else: - if v_c > PS: - v_n = v_v - abs(PS-v_v)/4 + if v > PS: + v_new = v_v - abs(PS-v_v)/4 else: - v_n = v_v + abs(PS-v_v)/4 + v_new = v_v + abs(PS-v_v)/4 else: - if v_c > v_v: - v_n = v_v - abs(PS-v_v)/4 + if v > v_v: + v_new = v_v - abs(PS-v_v)/4 else: - v_n = v_v + abs(PS-v_v)/4 + v_new = v_v + abs(PS-v_v)/4 else: - v_n = min((v_v * (d_c/IPD)**2), v_c*1.1) #Der Exponent gibt an, wie schnell die Aenderung umgesetzt werden soll + v_new = (v_v * (d/IPD)**2) #Der Exponent gibt an, wie schnell die Aenderung umgesetzt werden soll inertia = 0.8 # in [0,1] und gibt die Traegheit des Fahrzeuges an - self.cSpeed = inertia * v_c + (1- inertia) * v_n + self.setSpeed(inertia * v + (1- inertia) * v_new) + + if self.getCIPD() > d: + print("raise") + raise UnderCIPDerror("under CIPD!") - self.cIPD = self.IPD * 0.01 #too low - if self.cIPD > self.cDist: - self.cSpeed = 0 - self.bcIPD = True - self.cIPD = -10 #Zur Visualisierung - else: - v_v = self.cSpeed + else: # this is for the LV c = 0.8 - self.cSpeed = c * v_c + (1-c) * PS + self.v_v = 0 + self.setSpeed(c * v + (1-c) * PS) - def checkInbound(self, argument, target, delta): #Ueberall ist ein delta von 0.01 hinterlegt - if argument > target + delta: - return False - elif argument < target - delta: - return False - else: - return True +def checkInbound(argument, target, delta): #Ueberall ist ein delta von 0.01 hinterlegt + if argument > target + delta: + return False + elif argument < target - delta: + return False + else: + return True def broadcastPlattonSettings(carList, newIPD, newPS): for item in carList: @@ -100,7 +134,6 @@ def broadcastPlattonSettings(carList, newIPD, newPS): def update(carList): for item in carList: item.updatePos() - item.updateDis() for item in reversed(carList): item.updateSpeed() @@ -108,14 +141,17 @@ if __name__ == "__main__": maxT = [20, 40, 80, 110, 130,150,170] # times for events setIPD = [40, 40, 40, 60, 45, 30, 15] # event of IPD (activ until time event) setPS = [20, 30, 10, 10, 10, 10, 10] # event of PS (activ until time event) + # setIPD = [40, 40, 40, 40, 40, 40, 40] # event of IPD (activ until time event) + # setPS = [20, 20, 20, 20, 20, 20, 20] # event of PS (activ until time event) v = [52.0, 50.0, 10.0] # startvektor (Startgeschwindikeit) - pos = [70, 30, 0] # startvektor (Startposition) + pos = [90, 30, 0] # startvektor (Startposition) + tStep = 30.0 cars = [] - cars.append(Car(None, v[0], pos[0], setIPD[0], setPS[0])) - cars.append(Car(cars[0], v[1], pos[1], setIPD[0], setPS[0])) - cars.append(Car(cars[1], v[2], pos[2], setIPD[0], setPS[0])) + cars.append(Car(None, v[0], pos[0], setIPD[0], setPS[0],tStep)) + cars.append(Car(cars[0], v[1], pos[1], setIPD[0], setPS[0],tStep)) + cars.append(Car(cars[1], v[2], pos[2], setIPD[0], setPS[0],tStep)) t = [] mesIPD= [] @@ -123,10 +159,13 @@ if __name__ == "__main__": y_pos = [[],[],[]] y_speed = [[],[],[]] + y_cSpeed = [[],[],[]] y_dist = [[],[],[]] + y_cDist = [[],[],[]] y_cdist = [[],[],[]] + y_v_v = [[],[],[]] - i = 0.0 + i = 0.0; end = False for j in range(0, len(maxT)): IPD = setIPD[j] PS = setPS[j] @@ -138,39 +177,49 @@ if __name__ == "__main__": mesPS.append(PS) for k in range(0, len(cars)): - y_pos[k].append(cars[k].getPos()) + y_pos[k].append(cars[k].cPos) y_speed[k].append(cars[k].getSpeed()) + y_cSpeed[k].append(cars[k].cSpeed) + y_v_v[k].append(cars[k].v_v) for k in range(1, len(cars)): y_dist[k].append(cars[k].getDistance()) + y_cDist[k].append(cars[k-1].cPos - cars[k].cPos) y_cdist[k].append(cars[k].getCIPD()) - i = i+0.0625 - update(cars) + i = i+1/tStep + try: + update(cars) + except UnderCIPDerror: + print("catch") + end = True + break + if end: break plt.subplot(131) - plt.plot(t, y_pos[0], 'r', label='LV') - plt.plot(t, y_pos[1], 'b', label='FV 1') - plt.plot(t, y_pos[2], 'g', label='FV 2') - plt.legend() + plt.plot(t, y_pos[0], 'r') + plt.plot(t, y_pos[1], 'b') + # plt.plot(t, y_pos[2], 'g') plt.title("Position") plt.subplot(132) - plt.plot(t, mesPS, 'r--', label='PS') - plt.plot(t, y_speed[0], 'r-', label='LV') - plt.plot(t, y_speed[1], 'b-', label='FV 1') - plt.plot(t, y_speed[2], 'g-', label='FV 2') - plt.legend() + plt.plot(t, mesPS, 'm--') + plt.plot(t, y_speed[0], 'r--') + plt.plot(t, y_cSpeed[0], 'r-') + plt.plot(t, y_speed[1], 'b--') + plt.plot(t, y_cSpeed[1], 'b') + plt.plot(t, y_v_v[1], 'g') + # plt.plot(t, y_speed[2], 'g') plt.title("Speed") plt.subplot(133) - plt.plot(t, mesIPD, 'r--', label='IPD') - plt.plot(t, y_dist[1], 'b-', label='FV1 - LV - Distance') - plt.plot(t, y_cdist[1], 'b--', label='FV1 - cIPD)') - plt.plot(t, y_dist[2], 'g-', label='FV2 - FV1 - Distance') - plt.plot(t, y_cdist[2], 'g--', label='FV2 - cIPD') - plt.legend() + plt.plot(t, mesIPD, 'r--') + plt.plot(t, y_dist[1], 'b-') + plt.plot(t, y_cdist[1], 'b--') + plt.plot(t, y_cDist[1], 'b--') + # plt.plot(t, y_dist[2], 'g-') + # plt.plot(t, y_cdist[2], 'g--') plt.title("Distance") plt.show() -- GitLab