def load(self) -> 'SimulationData': with open(self.path_json, 'r') as f: obj = json.loads(f.read()) info = SimulationInfo() info.__dict__ = obj.get(self.f_info, {}) self.set(SimulationParams(**obj[self.f_params]), DecalRoad.from_dict(obj[self.f_road]), [SimulationDataRecord(**r) for r in obj[self.f_records]], info=info) return self
def run_sim(street_1: DecalRoad, ai_aggression): waypoint_goal = BeamNGWaypoint('waypoint_goal', get_node_coords(street_1.nodes[-1])) maps.beamng_map.generated().write_items(street_1.to_json() + '\n' + waypoint_goal.to_json()) beamng = BeamNGpy('localhost', 64256) scenario = Scenario('tig', 'tigscenario') vehicle = Vehicle('ego_vehicle', model='etk800', licence='TIG', color='Red') sim_data_collector = TrainingDataCollectorAndWriter(vehicle, beamng, street_1) scenario.add_vehicle(vehicle, pos=get_node_coords(street_1.nodes[0]), rot=get_rotation(street_1)) scenario.make(beamng) beamng.open() beamng.set_deterministic() beamng.load_scenario(scenario) beamng.pause() beamng.start_scenario() vehicle.ai_set_aggression(ai_aggression) vehicle.ai_drive_in_lane(False) vehicle.ai_set_speed(25) vehicle.ai_set_waypoint(waypoint_goal.name) #vehicle.ai_set_mode("manual") steps = 5 def start(): for idx in range(1000): if (idx * 0.05 * steps) > 3.: sim_data_collector.collect_and_write_current_data() if sim_data_collector.oob_monitor.is_oob(wrt="center"): raise ValueError("OOB detected during training") dist = distance(sim_data_collector.last_state.pos, waypoint_goal.position) if dist < 15.0: beamng.resume() break # one step is 0.05 seconds (5/100) beamng.step(steps) try: start() finally: beamng.close()
try: start() finally: beamng.close() if __name__ == '__main__': dataset_size = 10 road_storage = SeedStorage('training_set') simulation_attempts = 5 for idx in range(1, dataset_size + 1): path = road_storage.get_path_by_index(idx) road_generator = RoadGenerator(num_control_nodes=30, seg_length=20).generate() with open(path, 'w') as f: f.write(json.dumps(road_generator.to_dict())) street_1 = DecalRoad('street_1').add_4d_points(road_generator.sample_nodes) for attempt in range(simulation_attempts): try: print("Simulation number =", attempt) run_sim(street_1=street_1, ai_aggression=0.1) break except ValueError: pass
def setup_road_nodes(self, road_nodes): self.road_nodes = road_nodes self.decal_road: DecalRoad = DecalRoad('street_1').add_4d_points( road_nodes) self.road_points = RoadPoints().add_middle_nodes(road_nodes)
def initial_population_generator(path, config, problem): all_roads = [ filename for filename in glob.glob(str(path) + "\*.json", recursive=True) ] type = config.Feature_Combination shuffle(all_roads) roads = all_roads original_set = list() individuals = [] popsize = config.POPSIZE for road in roads: with open(road) as json_file: data = json.load(json_file) sample_nodes = data["road"]["nodes"] for node in sample_nodes: node[2] = -28.0 sample_nodes = np.array(sample_nodes) records = data["records"] bbox_size = (-250.0, 0.0, 250.0, 500.0) road_bbox = RoadBoundingBox(bbox_size) member = BeamNGMember(data["control_nodes"], [tuple(t) for t in sample_nodes], 20, road_bbox) member.config = config member.problem = problem simulation_id = time.strftime('%Y-%m-%d--%H-%M-%S', time.localtime()) sim_name = member.config.simulation_name.replace( '$(id)', simulation_id) simulation_data = SimulationData(sim_name) states = [] for record in records: state = VehicleState(timer=record["timer"], pos=record["pos"], dir=record["dir"], vel=record["vel"], steering=record["steering"], steering_input=record["steering_input"], brake=record["brake"], brake_input=record["brake_input"], throttle=record["throttle"], throttle_input=record["throttle_input"], wheelspeed=record["wheelspeed"], vel_kmh=record["vel_kmh"]) sim_data_record = SimulationDataRecord( **state._asdict(), is_oob=record["is_oob"], oob_counter=record["oob_counter"], max_oob_percentage=record["max_oob_percentage"], oob_distance=record["oob_distance"]) states.append(sim_data_record) simulation_data.params = SimulationParams( beamng_steps=data["params"]["beamng_steps"], delay_msec=int(data["params"]["delay_msec"])) simulation_data.road = DecalRoad.from_dict(data["road"]) simulation_data.info = SimulationInfo() simulation_data.info.start_time = data["info"]["start_time"] simulation_data.info.end_time = data["info"]["end_time"] simulation_data.info.elapsed_time = data["info"]["elapsed_time"] simulation_data.info.success = data["info"]["success"] simulation_data.info.computer_name = data["info"]["computer_name"] simulation_data.info.id = data["info"]["id"] simulation_data.states = states if len(states) > 0: member.distance_to_boundary = simulation_data.min_oob_distance() member.simulation = simulation_data individual: BeamNGIndividual = BeamNGIndividual(member, config) #individual.evaluate() b = tuple() feature_dimensions = generate_feature_dimension(type) for ft in feature_dimensions: i = feature_simulator(ft.feature_simulator, individual) b = b + (i, ) individuals.append([b, road, individual]) starting_point = choice(individuals) original_set.append(starting_point) i = 0 best_ind = individuals[0] while i < popsize - 1: max_dist = 0 for ind in individuals: dist = get_min_distance_from_set(ind, original_set) if dist > max_dist: max_dist = dist best_ind = ind original_set.append(best_ind) i += 1 base = config.initial_population_folder storage = SeedStorage(base) for index, road in enumerate(original_set): dst = storage.get_path_by_index(index + 1) ind = road[2] #copy(road[1], dst) with open(road[1]) as ff: json_file = json.load(ff) with open(dst, 'w') as f: f.write( json.dumps({ "control_nodes": json_file["control_nodes"], ind.m.simulation.f_params: ind.m.simulation.params._asdict(), ind.m.simulation.f_info: ind.m.simulation.info.__dict__, ind.m.simulation.f_road: ind.m.simulation.road.to_dict(), ind.m.simulation.f_records: [r._asdict() for r in ind.m.simulation.states] }))
# one step is 0.05 seconds (5/100) beamng.step(STEPS) try: start() finally: beamng.close() if __name__ == '__main__': NODES = 20 MAX_ANGLE = 80 # MAX_ANGLE = 130 # MAX_ANGLE = 60 NUM_SPLINE_NODES = 20 SEG_LENGTH = 25 road = RoadGenerator(num_control_nodes=NODES, max_angle=MAX_ANGLE, seg_length=SEG_LENGTH, num_spline_nodes=NUM_SPLINE_NODES).generate(visualise=False) from self_driving.beamng_road_visualizer import plot_road plot_road(road, save=True) street = DecalRoad('street_1', drivability=1, material='').add_4d_points(road.sample_nodes) run_sim(street)
def generate_random_solution_without_sim(self): """ To ease the bootstrap of the algorithm, we can generate the first solutions in the feature space, so that we start filling the bins """ # "Generate random solution" path = self.problem._seed_pool_strategy.get_seed() with open(path) as json_file: data = json.load(json_file) sample_nodes = data["road"]["nodes"] for node in sample_nodes: node[2] = -28.0 sample_nodes = np.array(sample_nodes) records = data["records"] bbox_size = (-250.0, 0.0, 250.0, 500.0) road_bbox = RoadBoundingBox(bbox_size) member = BeamNGMember(data["control_nodes"], [tuple(t) for t in sample_nodes], len(data["control_nodes"]), road_bbox) member.config = self.config member.problem = self.problem simulation_id = time.strftime('%Y-%m-%d--%H-%M-%S', time.localtime()) sim_name = member.config.simulation_name.replace( '$(id)', simulation_id) simulation_data = SimulationData(sim_name) states = [] for record in records: state = VehicleState(timer=record["timer"], pos=record["pos"], dir=record["dir"], vel=record["vel"], steering=record["steering"], steering_input=record["steering_input"], brake=record["brake"], brake_input=record["brake_input"], throttle=record["throttle"], throttle_input=record["throttle_input"], wheelspeed=record["wheelspeed"], vel_kmh=record["vel_kmh"]) sim_data_record = SimulationDataRecord( **state._asdict(), is_oob=record["is_oob"], oob_counter=record["oob_counter"], max_oob_percentage=record["max_oob_percentage"], oob_distance=record["oob_distance"]) states.append(sim_data_record) simulation_data.params = SimulationParams( beamng_steps=data["params"]["beamng_steps"], delay_msec=int(data["params"]["delay_msec"])) simulation_data.road = DecalRoad.from_dict(data["road"]) simulation_data.info = SimulationInfo() simulation_data.info.start_time = data["info"]["start_time"] simulation_data.info.end_time = data["info"]["end_time"] simulation_data.info.elapsed_time = data["info"]["elapsed_time"] simulation_data.info.success = data["info"]["success"] simulation_data.info.computer_name = data["info"]["computer_name"] simulation_data.info.id = data["info"]["id"] simulation_data.states = states if len(states) > 0: member.distance_to_boundary = simulation_data.min_oob_distance() member.simulation = simulation_data individual: BeamNGIndividual = BeamNGIndividual( member, self.config) individual.seed = path else: print("*********Bug************") return individual
def run_sim(street_1: DecalRoad): waypoints = [] for node in street_1.nodes: waypoint = BeamNGWaypoint("waypoint_" + str(node), get_node_coords(node)) waypoints.append(waypoint) print(len(waypoints)) maps.beamng_map.generated().write_items( street_1.to_json() + '\n' + "\n".join([waypoint.to_json() for waypoint in waypoints])) beamng = BeamNGpy('localhost', 64256) scenario = Scenario('tig', 'tigscenario') vehicle = Vehicle('ego_vehicle', model='etk800', licence='TIG', color='Red') sim_data_collector = TrainingDataCollectorAndWriter( vehicle, beamng, street_1) scenario.add_vehicle(vehicle, pos=get_node_coords(street_1.nodes[0]), rot=get_rotation(street_1)) scenario.make(beamng) beamng.open() beamng.set_deterministic() beamng.load_scenario(scenario) beamng.pause() beamng.start_scenario() vehicle.ai_drive_in_lane(True) vehicle.ai_set_mode("disabled") vehicle.ai_set_speed(10 / 4) steps = 5 def start(): for waypoint in waypoints[10:-1:20]: vehicle.ai_set_waypoint(waypoint.name) for idx in range(1000): if (idx * 0.05 * steps) > 3.: sim_data_collector.collect_and_write_current_data() dist = distance(sim_data_collector.last_state.pos, waypoint.position) if dist < 15.0: beamng.resume() break # one step is 0.05 seconds (5/100) beamng.step(steps) try: start() finally: beamng.close()