def run_scenario(self): global base_filename, default_model, default_color, default_scenario, setpoint global prev_error #vehicle_loadfile = 'vehicles/pickup/pristine.save.json' # setup DNN model + weights m = Model() model = m.define_model_BeamNG("BeamNGmodel-4.h5") random.seed(1703) setup_logging() #beamng = BeamNGpy('localhost', 64256, home='C:/Users/merie/Documents/BeamNG.research.v1.7.0.1') beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1clean') scenario = Scenario(default_scenario, 'research_test') vehicle = Vehicle('ego_vehicle', model=default_model, licence='LOWPRESS', color=default_color) vehicle = setup_sensors(vehicle) spawn = spawn_point(default_scenario, 'highway') scenario.add_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat']) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) # Start BeamNG and enter the main loop bng = beamng.open(launch=True) bng.hide_hud() bng.set_deterministic() # Set simulator to be deterministic bng.set_steps_per_second(100) # With 60hz temporal resolution # Load and start the scenario bng.load_scenario(scenario) bng.start_scenario() # perturb vehicle #vehicle.ai_set_mode('span') #vehicle.ai_drive_in_lane(True) #vehicle_loadfile = 'vehicles/etk800/fronttires_0psi.pc' # vehicle_loadfile = 'vehicles/etk800/backtires_0psi.pc' # vehicle_loadfile = 'vehicles/etk800/chassis_forcefeedback201.pc' # vehicle.load_pc(vehicle_loadfile, False) vehicle.deflate_tires([1,1,1,1]) #vehicle.break_all_breakgroups() #vehicle.break_hinges() # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt bng.resume() wheelspeed = 0.0; throttle = 0.0; prev_error = setpoint; damage_prev = None; runtime = 0.0 kphs = [] damage = None final_img = None # Send random inputs to vehice and advance the simulation 20 steps for _ in range(1024): # collect images image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') img = m.process_image(image) prediction = model.predict(img) # control params kph = ms_to_kph(wheelspeed) throttle = throttle_PID(kph, dt) brake = 0 #if throttle < 0: if setpoint < kph: brake = throttle / 1000.0 throttle = 0.0 # throttle = 0.2 # random.uniform(0.0, 1.0) # brake = random.choice([0, 0, 0.1 , 0.2]) steering = float(prediction[0][0]) #random.uniform(-1.0, 1.0) vehicle.control(throttle=throttle, steering=steering, brake=brake) steering_state = bng.poll_sensors(vehicle)['electrics']['steering'] steering_input = bng.poll_sensors(vehicle)['electrics']['steering_input'] avg_wheel_av = bng.poll_sensors(vehicle)['electrics']['avg_wheel_av'] wheelspeed = bng.poll_sensors(vehicle)['electrics']['wheelspeed'] damage = bng.poll_sensors(vehicle)['damage'] new_damage = diff_damage(damage, damage_prev) damage_prev = damage print("\n") # #print("steering state: {}".format(steering_state)) # print("AI steering_input: {}".format(steering_input)) #print("avg_wheel_av: {}".format(avg_wheel_av)) # print("DAVE2 steering prediction: {}".format(float(prediction[0][0]))) print("throttle:{}".format(throttle)) print("brake:{}".format(brake)) print("kph: {}".format(ms_to_kph(wheelspeed))) print("new_damage:{}".format(new_damage)) kphs.append(ms_to_kph(wheelspeed)) if new_damage > 0.0: final_img = image break bng.step(5) runtime += (0.05) # print("runtime:{}".format(round(runtime, 2))) # print("time to crash:{}".format(round(runtime, 2))) bng.close() avg_kph = float(sum(kphs)) / len(kphs) plt.imshow(final_img) plt.pause(0.01) return runtime, avg_kph, damage['damage'], kphs
def run_spawn_for_deflation(vehicle_model='etk800', deflation_pattern=[0, 0, 0, 0]): global base_filename, default_color, default_scenario, setpoint global prev_error global fcam vehicle_loadfile = 'vehicles/hopper/crawler.pc' # setup DNN model + weights m = Model() model = m.define_model_BeamNG("BeamNGmodel-5.h5") random.seed(1703) setup_logging() # beamng = BeamNGpy('localhost', 64256, home='C:/Users/merie/Documents/BeamNG.research.v1.7.0.1') beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1clean') scenario = Scenario(default_scenario, 'research_test') vehicle = Vehicle('ego_vehicle', model=vehicle_model, licence='LOWPRESS', color=default_color) vehicle = setup_sensors(vehicle) spawn = spawn_point(default_scenario, 'highway') # scenario.add_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat']) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) # Start BeamNG and enter the main loop bng = beamng.open(launch=True) # bng.hide_hud() bng.set_deterministic() # Set simulator to be deterministic # Load and start the scenario bng.load_scenario(scenario) bng.start_scenario() # load part config #pc = vehicle.get_part_config() # loadfile = 'C:/Users/merie/Documents/BeamNG.research/vehicles/hopper/front17x8rear17x9.json' # vehicle.load(loadfile) bng.spawn_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat'], partConfig='vehicles/hopper/custom.pc') #bng.set_relative_camera() # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt # vehicle.control(throttle=0.0, steering=0.0, brake=1.0) # perturb vehicle # before_state = copy.deepcopy(vehicle.state) before_state = bng.poll_sensors(vehicle)['front_cam'] before_state['vel'] = vehicle.state['vel'] before_state['roll'] = vehicle.state['roll'] before_state['pitch'] = vehicle.state['pitch'] before_state['yaw'] = vehicle.state['yaw'] # print("vehicle position before deflation via beamstate:{}".format(vehicle.get_object_position())) # print("vehicle position before deflation via vehicle state:{}".format(vehicle.state)) print( "vehicle position before deflation via camera:{}".format(before_state)) image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') # print("camera sensor before deflation: {}".format(bng.poll_sensors(vehicle)['front_cam'])) #get_camera_rot_and_pos([-0.3, 1, 1.0], [0, 0.75, 0], before_state['pos'], before_state['dir'], before_state['up']) img = m.process_image(image) before_prediction = model.predict(img) before_state["prediction"] = before_prediction plt.imshow(image) plt.pause(0.01) if deflation_pattern != [0, 0, 0, 0]: print("deflating according to pattern {}".format(deflation_pattern)) vehicle.deflate_tires(deflation_pattern) time.sleep(1) bng.resume() bng.set_steps_per_second(100) bng.set_deterministic() totalsecs = 0.0 deflation_traj = [] while totalsecs <= 30: vehicle.update_vehicle() # vehicle.control(throttle=0.0, steering=0.0, brake=1.0) after_state = bng.poll_sensors(vehicle)['front_cam'] after_state['vel'] = vehicle.state['vel'] after_state['roll'] = vehicle.state['roll'] after_state['pitch'] = vehicle.state['pitch'] after_state['yaw'] = vehicle.state['yaw'] print("roll:{}, pitch:{}, yaw:{}".format(vehicle.state['roll'], vehicle.state['pitch'], vehicle.state['yaw'])) deflation_traj.append(round(math.degrees(vehicle.state['pitch'][0]), 4)) bng.step(100) totalsecs += 1 # after_state = copy.deepcopy(vehicle.state) # print("vehicle position after deflation via beamstate:{}".format(vehicle.get_object_position())) # print("vehicle position after deflation via vehicle state:{}".format(vehicle.state)) image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') print("vehicle position after deflation via camera:{}".format(after_state)) #print("camera sensor output: {}".format(bng.poll_sensors(vehicle)['front_cam']['rot'])) #print("camera pos output: {}".format(bng.poll_sensors(vehicle)['front_cam']['pos'])) # print("camera rot output: {}".format(bng.poll_sensors(vehicle)['front_cam']['direction'])) # print("fcam.encode_engine_request() = {}".format(fcam.encode_engine_request())) damages = bng.poll_sensors(vehicle)['damage']['deform_group_damage'] d = ["{}={}".format(k, damages[k]['damage']) for k in damages.keys()] print("vehicle pressure after deflation: lowpressure={} damages:".format( bng.poll_sensors(vehicle)['damage']['lowpressure'], d)) img = m.process_image(image) after_state["prediction"] = model.predict(img) plt.imshow(image) plt.pause(0.01) bng.close() return before_state, after_state, deflation_traj
def main(): random.seed(1703) setup_logging() # Plotting code setting up a 3x2 figure # fig = plt.figure(1, figsize=(10, 5)) # axarr = fig.subplots(2, 3) # a_colour = axarr[0, 0] # b_colour = axarr[1, 0] # a_depth = axarr[0, 1] # b_depth = axarr[1, 1] # a_annot = axarr[0, 2] # b_annot = axarr[1, 2] # plt.ion() #beamng = BeamNGpy('localhost', 64256, home='C:/Users/merie/Documents/BeamNG.research.v1.7.0.1') beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1') # Create a scenario in west_coast_usa scenario = Scenario('west_coast_usa', 'research_test') # Set up first vehicle, with two cameras, gforces sensor, lidar, electrical # sensors, and damage sensors vehicle = Vehicle('ego_vehicle', model='etk800', licence='RED', color='Red') # Set up sensors pos = (-0.3, 1, 1.0) direction = (0, 1, 0) fov = 120 resolution = (512, 512) front_camera = Camera(pos, direction, fov, resolution, colour=True, depth=True, annotation=True) pos = (0.0, 3, 1.0) direction = (0, -1, 0) fov = 90 resolution = (512, 512) back_camera = Camera(pos, direction, fov, resolution, colour=True, depth=True, annotation=True) gforces = GForces() electrics = Electrics() damage = Damage() #lidar = Lidar(visualized=False) timer = Timer() # Attach them vehicle.attach_sensor('front_cam', front_camera) vehicle.attach_sensor('back_cam', back_camera) vehicle.attach_sensor('gforces', gforces) vehicle.attach_sensor('electrics', electrics) vehicle.attach_sensor('damage', damage) vehicle.attach_sensor('timer', timer) scenario.add_vehicle(vehicle, pos=(-717.121, 101, 118.675), rot=None, rot_quat=(0, 0, 0.3826834, 0.9238795)) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) # Start BeamNG and enter the main loop bng = beamng.open(launch=True) try: bng.hide_hud() bng.set_deterministic() # Set simulator to be deterministic bng.set_steps_per_second(60) # With 60hz temporal resolution # Load and start the scenario bng.load_scenario(scenario) bng.start_scenario() # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt vehicle.deflate_tires([1, 1, 1, 1]) # Send random inputs to vehice and advance the simulation 20 steps for _ in range(1024): throttle = random.uniform(0.0, 1.0) steering = random.uniform(-1.0, 1.0) brake = random.choice([0, 0, 0, 1]) vehicle.control(throttle=throttle, steering=steering, brake=brake) bng.step(20) # Retrieve sensor data and show the camera data. sensors = bng.poll_sensors(vehicle) print('{} seconds passed.'.format(sensors['timer']['time'])) # a_colour.imshow(sensors['front_cam']['colour'].convert('RGB')) # a_depth.imshow(sensors['front_cam']['depth'].convert('L')) # a_annot.imshow(sensors['front_cam']['annotation'].convert('RGB')) # # b_colour.imshow(sensors['back_cam']['colour'].convert('RGB')) # b_depth.imshow(sensors['back_cam']['depth'].convert('L')) # b_annot.imshow(sensors['back_cam']['annotation'].convert('RGB')) # plt.pause(0.00001) finally: bng.close()
def run_scenario(vehicle_model='etk800', deflation_pattern=[0, 0, 0, 0], parts_config='vehicles/hopper/custom.pc', run_number=0): global base_filename, default_color, default_scenario, default_spawnpoint, steps_per_sec global integral, prev_error, setpoint integral = 0.0 prev_error = 0.0 # setup DNN model + weights sm = DAVE2Model() # steering_model = Model().define_model_BeamNG("BeamNGmodel-racetracksteering8.h5") # throttle_model = Model().define_model_BeamNG("BeamNGmodel-racetrackthrottle8.h5") dual_model = sm.define_dual_model_BeamNG() # dual_model = sm.load_weights("BeamNGmodel-racetrackdualcomparison10K.h5") # dual_model = sm.define_multi_input_model_BeamNG() # dual_model = sm.load_weights("BeamNGmodel-racetrackdual-comparison10K-PIDcontrolset-4.h5") # dual_model = sm.load_weights("BeamNGmodel-racetrackdual-comparison40K-PIDcontrolset-1.h5") # BeamNGmodel-racetrack-multiinput-dualoutput-comparison10K-PIDcontrolset-1.h5 # BeamNGmodel-racetrackdual-comparison100K-PIDcontrolset-2 dual_model = sm.load_weights( "BeamNGmodel-racetrackdual-comparison100K-PIDcontrolset-2.h5") # dual_model = sm.load_weights("BeamNGmodel-racetrack-multiinput-dualoutput-comparison103K-PIDcontrolset-1.h5") random.seed(1703) setup_logging() beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1clean', user='******') scenario = Scenario(default_scenario, 'research_test') vehicle = Vehicle('ego_vehicle', model=vehicle_model, licence='EGO', color=default_color) vehicle = setup_sensors(vehicle) spawn = spawn_point(default_scenario, default_spawnpoint) scenario.add_vehicle( vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat']) #, partConfig=parts_config) add_barriers(scenario) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) # Start BeamNG and enter the main loop bng = beamng.open(launch=True) #bng.hide_hud() bng.set_deterministic() # Set simulator to be deterministic bng.set_steps_per_second(steps_per_sec) # With 60hz temporal resolution bng.load_scenario(scenario) bng.start_scenario() # bng.spawn_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat'], partConfig=parts_config) # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt # bng.resume() # perturb vehicle print("vehicle position before deflation via beamstate:{}".format( vehicle.get_object_position())) print("vehicle position before deflation via vehicle state:{}".format( vehicle.state)) image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') # plt.imshow(image) # plt.pause(0.01) vehicle.deflate_tires(deflation_pattern) bng.step(steps_per_sec * 6) vehicle.update_vehicle() # print("vehicle position after deflation via beamstate:{}".format(vehicle.get_object_position())) # print("vehicle position after deflation via vehicle state:{}".format(vehicle.state)) pitch = vehicle.state['pitch'][0] roll = vehicle.state['roll'][0] z = vehicle.state['pos'][2] image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') # plt.imshow(image) # plt.pause(0.01) # bng.resume() # vehicle.break_all_breakgroups() # vehicle.break_hinges() wheelspeed = 0.0 throttle = 0.0 prev_error = setpoint damage_prev = None runtime = 0.0 kphs = [] traj = [] pitches = [] rolls = [] steering_inputs = [] throttle_inputs = [] timestamps = [] damage = None final_img = None # Send random inputs to vehice and advance the simulation 20 steps overall_damage = 0.0 total_loops = 0 total_imgs = 0 total_predictions = 0 while overall_damage <= 0: # collect images sensors = bng.poll_sensors(vehicle) image = sensors['front_cam']['colour'].convert('RGB') # plt.imshow(image) # plt.pause(0.01) total_imgs += 1 img = sm.process_image(np.asarray(image)) wheelspeed = sensors['electrics']['wheelspeed'] kph = ms_to_kph(wheelspeed) dual_prediction = dual_model.predict(x=[img, np.array([kph])]) # steering_prediction = steering_model.predict(img) # throttle_prediction = throttle_model.predict(img) dt = sensors['timer']['time'] - runtime runtime = sensors['timer']['time'] # control params brake = 0 # steering = float(steering_prediction[0][0]) #random.uniform(-1.0, 1.0) # throttle = float(throttle_prediction[0][0]) steering = float(dual_prediction[0][0]) #random.uniform(-1.0, 1.0) throttle = float(dual_prediction[0][1]) total_predictions += 1 if abs(steering) > 0.2: setpoint = 20 else: setpoint = 40 # if runtime < 10: throttle = throttle_PID(kph, dt) # if throttle > 1: # throttle = 1 # if setpoint < kph: # brake = 0.0 #throttle / 10000.0 # throttle = 0.0 vehicle.control(throttle=throttle, steering=steering, brake=brake) steering_inputs.append(steering) throttle_inputs.append(throttle) timestamps.append(runtime) steering_state = sensors['electrics']['steering'] steering_input = sensors['electrics']['steering_input'] avg_wheel_av = sensors['electrics']['avg_wheel_av'] damage = sensors['damage'] overall_damage = damage["damage"] new_damage = diff_damage(damage, damage_prev) damage_prev = damage vehicle.update_vehicle() traj.append(vehicle.state['pos']) pitches.append(vehicle.state['pitch'][0]) rolls.append(vehicle.state['roll'][0]) kphs.append(ms_to_kph(wheelspeed)) total_loops += 1 if new_damage > 0.0: final_img = image break bng.step(1, wait=True) if runtime > 300: print("Exited after 5 minutes successful runtime") break if distance( spawn['pos'], vehicle.state['pos']) < 5 and sensors['timer']['time'] > 10: reached_start = True break # print("runtime:{}".format(round(runtime, 2))) # print("time to crash:{}".format(round(runtime, 2))) bng.close() # avg_kph = float(sum(kphs)) / len(kphs) plt.imshow(final_img) plt.savefig("Run-{}-finalimg.png".format(run_number)) plt.pause(0.01) plot_input(timestamps, steering_inputs, "Steering", run_number=run_number) plot_input(timestamps, throttle_inputs, "Throttle", run_number=run_number) plot_input(timestamps, kphs, "KPHs", run_number=run_number) print("Number of steering_inputs:", len(steering_inputs)) print("Number of throttle inputs:", len(throttle_inputs)) results = "Total loops: {} \ntotal images: {} \ntotal predictions: {} \nexpected predictions ={}*{}={}".format( total_loops, total_imgs, total_predictions, round(runtime, 3), steps_per_sec, round(runtime * steps_per_sec, 3)) print(results) results = { 'runtime': round(runtime, 3), 'damage': damage, 'kphs': kphs, 'traj': traj, 'pitch': round(pitch, 3), 'roll': round(roll, 3), "z": round(z, 3), 'final_img': final_img, 'total_predictions': total_predictions, 'expected_predictions': round(runtime * steps_per_sec, 3) } return results
def run_scenario(vehicle_model='etk800', deflation_pattern=[0, 0, 0, 0], parts_config=None): global base_filename, default_color, default_scenario, default_spawnpoint, setpoint, steps_per_sec global integral, prev_error integral = 0.0 prev_error = 0.0 # setup DNN model + weights # m = Model() # model = m.define_model_BeamNG("BeamNGmodel-racetrack.h5") random.seed(1703) setup_logging() beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1clean') scenario = Scenario(default_scenario, 'research_test') # unperturbed_vehicle = Vehicle('unperturbed_vehicle', model=vehicle_model, # licence='SAFE', color='Red') # unperturbed_vehicle = setup_sensors(unperturbed_vehicle) vehicle = Vehicle('ego_vehicle', model=vehicle_model, licence='EGO', color=default_color) vehicle = setup_sensors(vehicle) spawn = get_spawn_point(default_scenario, default_spawnpoint) scenario.add_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat']) temp = copy.deepcopy(spawn['pos']) temp = [temp[0] + lanewidth, temp[1] + lanewidth, temp[2]] # scenario.add_vehicle(unperturbed_vehicle, pos=temp, rot=None, rot_quat=spawn['rot_quat']) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) bng = beamng.open(launch=True) #bng.hide_hud() bng.set_deterministic() # Set simulator to be deterministic bng.set_steps_per_second(steps_per_sec) # Load and start the scenario bng.load_scenario(scenario) bng.start_scenario() #bng.spawn_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat'], partConfig=parts_config) # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt bng.resume() # perturb vehicle vehicle.deflate_tires(deflation_pattern) bng.step(steps_per_sec * 6) vehicle.update_vehicle() damage = 0 runtime = 0 while damage <= 0: sensors = bng.poll_sensors(vehicle) headlight_img = sensors['headlight_cam']['colour'].convert('RGB') # sensors[''] # prediction = model.predict() # steering = float(prediction[0][0]) #random.uniform(-1.0, 1.0) # vehicle.control(throttle=throttle, steering=steering, brake=brake) return_str = '\nPERTURBED headlight_cam INFO:' print('\nPERTURBED headlight_cam INFO:') temp = bng.poll_sensors(vehicle)['headlight_cam'] for key in temp: if key == 'rotation': degs = euler_from_quaternion(temp[key][0], temp[key][1], temp[key][2], temp[key][3]) return_str = "{}\nquaternions {}".format(return_str, temp[key]) return_str = "{}\n{} {}".format(return_str, key, [round(i, 3) for i in degs]) print(key, degs) elif key != "colour" and key != "annotation" and key != "depth": return_str = "{}\n{} {}".format(return_str, key, temp[key]) print(key, temp[key]) print('\nPERTURBED rearview_cam INFO:') return_str = "{}\nPERTURBED rearview_cam INFO:".format(return_str) # temp = bng.poll_sensors(vehicle)['rearview_cam'] for key in temp: if key == 'rotation': degs = euler_from_quaternion(temp[key][0], temp[key][1], temp[key][2], temp[key][3]) return_str = "{}\nquaternions {}".format(return_str, temp[key]) return_str = "{}\n{} {}".format(return_str, key, [round(i, 3) for i in degs]) print(key, degs) elif key != "colour" and key != "annotation" and key != "depth": return_str = "{}\n{} {}".format(return_str, key, temp[key]) print(key, temp[key]) # rearview_img = bng.poll_sensors(vehicle)['rearview_cam']['colour'].convert('RGB') headlight_img = sensors['headlight_cam']['colour'].convert('RGB') bng.step(1) damage = sensors['damage']['damage'] runtime = sensors['timer']['time'] # print("runtime:{}".format(round(runtime, 2))) print("time to crash:{} damage:{}".format(round(runtime, 2), damage)) bng.close() # avg_kph = float(sum(kphs)) / len(kphs) # plt.imshow(rearview_img) # plt.pause(0.01) plt.imshow(headlight_img) plt.pause(0.01) # results = {'pitch': round(pitch,3), 'roll':round(roll,3), "z":round(z,3), 'rearview_img':rearview_img, 'headlight_img':headlight_img} return return_str
def run_scenario_ai_version(vehicle_model='etk800', deflation_pattern=[0, 0, 0, 0], parts_config=None): global base_filename, default_color, default_scenario, default_spawnpoint, setpoint, steps_per_sec global prev_error random.seed(1703) setup_logging() beamng = BeamNGpy('localhost', 64256, home='H:/BeamNG.research.v1.7.0.1clean', user="******") scenario = Scenario(default_scenario, 'research_test') vehicle = Vehicle('ego_vehicle', model=vehicle_model, licence='AI', color=default_color) vehicle = setup_sensors(vehicle) spawn = get_spawn_point(default_scenario, default_spawnpoint) # scenario.add_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat']) # Compile the scenario and place it in BeamNG's map folder scenario.make(beamng) # Start BeamNG and enter the main loop bng = beamng.open(launch=True) bng.set_deterministic() # Set simulator to be deterministic bng.set_steps_per_second(steps_per_sec) # With 100hz temporal resolution # Load and start the scenario bng.load_scenario(scenario) bng.start_scenario() # create vehicle to be chased chase_vehicle = Vehicle('chase_vehicle', model='miramar', licence='CHASEE', color='Red') bng.spawn_vehicle(chase_vehicle, pos=(469.784, 346.391, 144.982), rot=None, rot_quat=(-0.0037852677050978, -0.0031219546217471, -0.78478640317917, 0.61974692344666)) bng.spawn_vehicle(vehicle, pos=spawn['pos'], rot=None, rot_quat=spawn['rot_quat'], partConfig=parts_config) # Put simulator in pause awaiting further inputs bng.pause() assert vehicle.skt #bng.resume() # perturb vehicle print("vehicle position before deflation via beamstate:{}".format( vehicle.get_object_position())) print("vehicle position before deflation via vehicle state:{}".format( vehicle.state)) image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') plt.imshow(image) plt.pause(0.01) vehicle.deflate_tires(deflation_pattern) bng.step(steps_per_sec * 6) vehicle.update_vehicle() # print("vehicle position after deflation via beamstate:{}".format(vehicle.get_object_position())) # print("vehicle position after deflation via vehicle state:{}".format(vehicle.state)) pitch = vehicle.state['pitch'][0] roll = vehicle.state['roll'][0] z = vehicle.state['pos'][2] image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') plt.imshow(image) plt.pause(0.01) bng.resume() vehicle.ai_set_mode('chase') vehicle.ai_set_target('chase_vehicle') vehicle.ai_drive_in_lane(True) damage_prev = None runtime = 0.0 traj = [] kphs = [] for _ in range(650): image = bng.poll_sensors(vehicle)['front_cam']['colour'].convert('RGB') damage = bng.poll_sensors(vehicle)['damage'] wheelspeed = bng.poll_sensors(vehicle)['electrics']['wheelspeed'] new_damage = diff_damage(damage, damage_prev) damage_prev = damage runtime = bng.poll_sensors(vehicle)['timer']['time'] vehicle.update_vehicle() traj.append(vehicle.state['pos']) kphs.append(ms_to_kph(wheelspeed)) if new_damage > 0.0: break bng.step(5) bng.close() results = { 'runtime': round(runtime, 3), 'damage': damage, 'kphs': kphs, 'traj': traj, 'pitch': round(pitch, 3), 'roll': round(roll, 3), "z": round(z, 3), 'final_img': image } return results