diff --git a/Agent_Midras_Lappe.py b/Agent_Midras_Lappe.py new file mode 100755 index 0000000000000000000000000000000000000000..46cbb5c6d4f5e4b0ac50024c437e53eafb6065ab --- /dev/null +++ b/Agent_Midras_Lappe.py @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Jan 12 17:17:49 2021 + +@author: theob +""" + +import asyncio +import Gym_new +import time +import nest_asyncio +import numpy as np +import random + + +async def main(): + + # Erstellen einer neuen Gym und Verbinden mit dem Server + env = Gym_new.Gym() + await env.connect_websocket() + + step_width = 0.02 + + # Zufällige Anzahl an Stepss machen um zufällige Zeit in Simulation + # verstreichen zu lassen anschließend reset der Simulation + command = "" + for i in range(random.randrange(0, 50)): + observationO, rewardO, doneO, infoO = await env.step(command, 0.2) + observation, reward, done, info = await env.reset(step_width) + + # Setzen der initialwerte und erstellen von Benötigten Arrays + sensorsO = np.array(observationO[2]) + sensors_dir = [] + for i in range(len(sensorsO)): + x = (-np.sin(-i*2*np.pi/len(sensorsO))) + y = (np.cos(-i*2*np.pi/len(sensorsO))) + sensors_dir.append([x, y]) + sensors_dir = np.array(sensors_dir) + sensors_dir_len = sensors_dir*sensorsO[:, np.newaxis] + sollwinkel = 0 + sollgeschwindigkeit = 0 + sensors_old = np.zeros([len(sensorsO), 5]) + speed_old = np.zeros([1, 5]) + sensors_old[:, 0] = sensorsO + sensors_old = np.roll(sensors_old, 1) + zubringer = True + abstand_rechts = 2 + aufgefahren = False + + # Erstellen eines Log arrays und Zeitloggs + # zur Dokumentation des Sensorveränderung + change_speed_log = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0]]) + timeg = 0 + + # Zählvariable Falls bestimmte Anzahl an Simulationen + # durchlaufen werden soll + i = 1 + durchlaeufe = 100 + while(True): + # Senden des Stepps an den Server + observation, reward, done, info = await env.step(command, step_width) + + # Zurücksetzen von Command für den nächsten Step + command = "" + + # Speichern der Zurückgegebenen Werte + speed = observation[0] + steering_angle = observation[1] + sensors = np.array(observation[2]) + + # Verarbeitung der Zurückgegebenen Werte + sensors_old = np.roll(sensors_old, 1) + sensors_old[:, 0] = sensors + speed_old = np.roll(speed_old, 1) + speed_old[:, 0] = speed + speed_mean = np.mean(speed_old) + sensor_change_speed = ((sensors_old[:, 4]-sensors_old[:, 0]) + / (5*step_width)) + sensors_dir_len = sensors_dir*sensors[:, np.newaxis] + sensors_dir_speed = sensors_dir*sensor_change_speed[:, np.newaxis] + sensors_dir_speed[:, 0] -= speed_mean/3.6 + dir_sum = np.sum(sensors_dir_len, axis=0) + + # Speichern der Änderungsgeschwindigkeit der Sensoren im Log + change_speed_log = np.append(change_speed_log, ([np.append( + timeg, sensor_change_speed)]), axis=0) + timeg = timeg+step_width + + # Steuerung für die Auffahrt + if(zubringer): + sollgeschwindigkeit = 16*(sensors[0]-2.3) + try: + sollwinkel = 3.7*((dir_sum[0])/13+( + (sensors[1]+sensors[5])-(sensors[3]+sensors[7]))/13)*( + speed/abs(speed)) + except Exception: + sollwinkel = 3.7*((dir_sum[0])/13+((sensors[1]+sensors[5])-( + sensors[3]+sensors[7]))/13) + + # Erkennen ob der Zubringer verlassen wurde + if((sensor_change_speed[7] < -13) & (reward[0] < 247)): + zubringer = False + + # Steuerung für den Beschleunigungsstreifen und die Autobahn + if(not zubringer): + weight_s1_s3 = 1 + weight_s2 = 1 + sollgeschwindigkeit = 8.5*(sensors[0]-2.3) + + # Abstand Rechts erhöhen um auf zu fahren wenn frei + if((not aufgefahren) & (sensors[7] > 3.5) & (sensors[6] > 3) & + (sensors[5] > 2) & (abstand_rechts < 6)): + abstand_rechts += 0.1 + + # Steuerung der geschwindigkeit auf dem Beschleunigungsstreifen + elif(not aufgefahren): + sollgeschwindigkeit = 80 + (sensors[7]-sensors[5])*5 + + # Abstand rechts auf festen Wert setzen wenn Aufgefahren wurde + if((sensors[2] > 5) & (abstand_rechts > 5)): + abstand_rechts = 5.5 + aufgefahren = True + + # Abstand rechts und Ausrichtung am Ende des + # Beschleunigungsstreifens anpasen + if(aufgefahren & (abs(sensor_change_speed[1]) > 8)): + abstand_rechts = 1 + weight_s1_s3 = 0 + weight_s2 = 0 + + # Sollwinkel Berechnen wenn speed == 0 ==> Exception + # Speed wird dann nicht berücksichtigt + try: + sollwinkel = 3.3*(weight_s1_s3*(sensors[1]-sensors[3])/3 + + weight_s2*(sensors[2]-abstand_rechts)/3)*( + speed/abs(speed)) + except Exception: + sollwinkel = 3.3*(weight_s1_s3*(sensors[1]-sensors[3])/3 + + weight_s2*(sensors[2]-abstand_rechts)/3) + + # Hinzufügen von Commands in abhängigkeit der errechneten Sollwerte + if(sollwinkel > steering_angle): + command += ("steer_right") + elif(sollwinkel < steering_angle): + command += ("steer_left") + if(sollgeschwindigkeit > speed): + command += ("accelerate") + elif((speed > 0) & (sollgeschwindigkeit < speed)): + command += ("brake") + elif(sollgeschwindigkeit < speed): + command += ("reverse") + + # Warten damit der Server die gesendeten Daten verarbeiten kann + # ermöglicht außerdem beobachten des Agenten + # Server könnte auch schneller + time.sleep(0.05) + + # Erkennen ob die Simulation abgebrochen werden muss oder + # das Ziel erreicht wurde + if(done or (reward[1] > 50) or (reward[0] < 170)): + + # Einkommentieren um sich den Verlauf des Sensor Change speed von + # Sensor 1 und 7 nach der Simulation an zu schauen. + # Dabei sollte i auf 1 gesetzt werden + # plt.plot(change_speed_log[:,0],change_speed_log[:,[2,8]]) + # plt.legend(['Sensor 1','Sensor 7']) + # plt.xlabel('t in Sekunden') + # plt.ylabel('ds/dt') + # plt.xlim(0.01,12) + # plt.show() + + # Einkommentieren um die Ergenisse der Simulation zu speichern + # f=open('Client_Test_Done.csv','ab') + # np.savetxt(f,[np.append(done,reward[0])]) + # print(np.append(done,reward[0])) + # f.close() + + # Zurücksetzen der Simulation + aufgefahren = False + zubringer = True + observation, reward, done, info = await env.reset(step_width) + + # Abbruch wenn die gewünschte Anzahl an durchläufen erreicht wurde + if i == durchlaeufe: + break + i += 1 + +# Starten der Anwendung wenn das Skript als Hauptprogramm ausgeführt wird +# jedoch nicht beim Import +if __name__ == "__main__": + nest_asyncio.apply() + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) diff --git a/client_V7.py b/client_V7.py deleted file mode 100755 index 1f817d406d2ff3f563c66cb5a3c94c30084c41b8..0000000000000000000000000000000000000000 --- a/client_V7.py +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Tue Jan 12 17:17:49 2021 - -@author: theob -""" - -import asyncio -import Gym_new -import time -import nest_asyncio -import numpy as np -import random -import math -import matplotlib.pyplot as plt -async def main(): - - env = Gym_new.Gym() - await env.connect_websocket() - command = "" - #observation, reward, done, info = await env.reset(0.017) - # observation, reward, done, info = await env.step("accelerate,steer_right", 0.17) - # #actionen sind accelerate, steer_left, steer_right, brake, reverse - # print(observation) - # print(reward) - # print(done) - for i in range(random.randrange(0, 50)): - #print(i) - observationO, rewardO, doneO, infoO = await env.step(command, 0.2) - - - step_width = 0.02 - #observationO, rewardO, doneO, infoO = await env.step(command, 0.02) - observation, reward, done, info = await env.reset(step_width) - speedO = observationO[0] - steering_angleO = observationO[1] - sensorsO = np.array(observationO[2]) - sensors_dir = [] - for i in range(len(sensorsO)): - x = (-np.sin(-i*2*np.pi/len(sensorsO))) - y = (np.cos(-i*2*np.pi/len(sensorsO))) - sensors_dir.append([x,y]) - sensors_dir =np.array(sensors_dir) - sensors_dir_len=sensors_dir*sensorsO[:,np.newaxis] - #print(sensors_dir_len) - sollwinkel=0 - sollgeschwindigkeit = 0 - sensors_old =np.zeros([len(sensorsO), 5]) - speed_old = np.zeros([1,5]) - #print(sensors_old) - sensors_old[:,0]=sensorsO - sensors_old = np.roll(sensors_old,1) - #print(sensors_old) - zubringer = True - abstand_rechts = 2 - aufgefahren = False - change_speed_log = np.array([[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]]) - timeg = 0; - i=1 - - while(True): - - - observation, reward, done, info = await env.step(command, step_width) - - command = "" - speed = observation[0] - steering_angle = observation[1] - sensors = np.array(observation[2]) - sensors_old = np.roll(sensors_old,1) - sensors_old[:,0]=sensors - speed_old = np.roll(speed_old,1) - speed_old[:,0]=speed - speed_mean = np.mean(speed_old) - #print("Durchschnittsgeschwindigkeit"+str(speed_mean)) - sensor_change_speed = (sensors_old[:,4]-sensors_old[:,0])/(5*step_width) - change_speed_log = np.append(change_speed_log,([np.append(timeg,sensor_change_speed)]),axis = 0) - timeg = timeg+step_width - #print("Change Speed" + str(sensor_change_speed)) - #print(sensors_old) - sensors_sum = np.sum(np.absolute(sensors)) - # print("Summe der Sensoren"+str(sensors_sum)) - sensors_dir_len=sensors_dir*sensors[:,np.newaxis] - sensors_dir_speed = sensors_dir*sensor_change_speed[:,np.newaxis] - sensors_dir_speed[:,0]-=speed_mean/3.6 - #print("Sensors Speed mit x Y"+str(sensors_dir_speed)) - #print(sensors_dir_len) - dir_sum = np.sum(sensors_dir_len,axis=0) - #print(dir_sum) - #aufgefahren = False - - #print("Sensors Sum = "+str(sensors_sum)) - if(zubringer): #Steuerung für die Auffahrt (sensors_sum < 90) & - - #sollgeschwindigkeit = 90*(2.2*sensors[0]-sensors[4])/13 #1.9 1.7 - #sollgeschwindigkeit = 90*(2.2*sensors[0]-5)/13 - sollgeschwindigkeit = 16*(sensors[0]-2.3) - try: - sollwinkel = 3.7*((dir_sum[0])/13+((sensors[1]+sensors[5])-(sensors[3]+sensors[7]))/13)*(speed/abs(speed))#3.3 3.7 - except Exception as e: - sollwinkel = 3.7*((dir_sum[0])/13+((sensors[1]+sensors[5])-(sensors[3]+sensors[7]))/13) - #print("Sollwinkel auffahrt "+str(sollwinkel)) - - #print('Sensor Change speed'+ str( sensor_change_speed[7])) - #if((sensors_sum>=90)): - if((sensor_change_speed[7]<-13)&(reward[0]<247)): #&(sensors_sum>=90) - zubringer = False - if(not zubringer): - weight_s1_s3 = 1 - weight_s2 = 1 - #if() - #sollgeschwindigkeit = (50*(2.2*sensors[0]-5)/13) - sollgeschwindigkeit = 8.5*(sensors[0]-2.3) - if((not aufgefahren)&(sensors[7]>3.5)&(sensors[6]>3)&(sensors[5]>2)&(abstand_rechts<6)): - abstand_rechts += 0.1#0.06 - elif(not aufgefahren): - #sollgeschwindigkeit=130*(1-np.exp(-sensors[0]/5)) - sollgeschwindigkeit = 80 + (sensors[7]-sensors[5])*5 - - if((sensors[2]>5)&(abstand_rechts>5)):#sensor[2]>5.5 #not aufgefahren & (abs(sensor_change_speed[1])<10) - abstand_rechts = 5.5 - aufgefahren = True - #print("Sensor 3 change_spped"+str(abs(sensor_change_speed[1]))) - if(aufgefahren&(abs(sensor_change_speed[1])>8)):#&(abstand_rechts>4.5)): #& - abstand_rechts = 1#1.5 #0.3*sensor_change_speed[1]/60 - weight_s1_s3 = 0 - weight_s2 = 0 - #time.sleep(1) - #time.sleep(0.5) - #sollwinkel = 1.3*(dir_sum[0]+16)/13 - #print("Abstand rechts soll "+str(abstand_rechts)) - try: - sollwinkel = 3.3*(weight_s1_s3*(sensors[1]-sensors[3])/3+weight_s2*(sensors[2]-abstand_rechts)/3)*(speed/abs(speed))#(sensors[7]-sensors[5])/13) - except Exception as e: - sollwinkel = 3.3*(weight_s1_s3*(sensors[1]-sensors[3])/3+weight_s2*(sensors[2]-abstand_rechts)/3) - # print("Sensor 1 "+str(sensors[1])) - # print("Sensor 3 "+str(sensors[3])) - #print("Sensor 2 "+str(sensors[2])) - #print("Sensor 7 "+str(sensors[7])) - - - #print("Sollwinkel"+str(sollwinkel)) - if(sollwinkel>steering_angle): - # print("steer_right") - command +=("steer_right") - elif(sollwinkel<steering_angle): - # print("steer_left") - command +=("steer_left") - #print("Sollgeschwindigkeit"+str(sollgeschwindigkeit)) - if(sollgeschwindigkeit>speed): - command += ("accelerate") - elif((speed>0) & (sollgeschwindigkeit<speed)): - command +=("brake") - elif(sollgeschwindigkeit<speed): - command +=("reverse") - - if(sensors_sum==0): - command +=("reset") - # if reward[1] < 0: - # env.reset(0.01) - #if speed < 50 : - # command += ("accelerate") - - # if(sensorsO[1]-sensors[1]>0 ): - # command += (",steer_left" ) - # elif(sensorsO[7]-sensors[7]>0): - # command +=("steer_right") - # elif ( (sensors[1] + 2 < sensors[7])&(abs(steering_angle)<3) ): # - # command += (",steer_left" ) - # elif ( (sensors[1] > sensors[7]+2)&(abs(steering_angle)<3)): #(sensors[1] > sensors[7]+1)& - # command +=("steer_right") - - # else: - # if ((sensors[4]-sensorsO[4]>0) & (steering_angle != 0) & (sensors[6] > 2.5) & (sensors[0]>10)): - # command +=("steer_left") - # elif ((sensors[5]-sensorsO[5]>0) & (steering_angle != 0) & (sensors[2] > 2.5)& (sensors[0]>10)): - # command +=("steer_right") - #observation, reward, done, info = await env.reset(0.017) - observationO, rewardO, doneO, infoO = observation, reward, done, info - #print(observation) - #print(reward) - #print(done) - time.sleep(0.05) - - if(done or (reward[1]>50)or (reward[0]<170)): - # print(change_speed_log) - # print(change_speed_log[:,0]) - # print(change_speed_log[:,1]) - # for i in range(1,8): - # plt.plot(change_speed_log[:,0],change_speed_log[:,i]) # plotting by columns - # plt.plot(change_speed_log[:,0],change_speed_log[:,[2,8]]) - # plt.legend(['Sensor 1','Sensor 7']) - # plt.xlabel('t in Sekunden') - # plt.ylabel('ds/dt') - # plt.xlim(0.01,12) - # plt.show() - # f=open('ClientV4Changespeed.csv','ab') - # np.savetxt(f,change_speed_log) - # f.close() - #break - # f=open('ClientV7TestDone_all_maps.csv','ab') - # np.savetxt(f,[np.append(done,reward[0])]) - # print(np.append(done,reward[0])) - # f.close() - - aufgefahren = False - zubringer = True - observation, reward, done, info = await env.reset(step_width) - observation, reward, done, info = await env.reset(step_width) - if i == 100: - break - i+=1 - -if __name__ == "__main__": - nest_asyncio.apply() - loop = asyncio.get_event_loop() - loop.run_until_complete(main()) \ No newline at end of file