def __init__(self, car, obs_dim=500): from fluids.assets import Car, Lane, Sidewalk, Terrain, TrafficLight, Waypoint, PedCrossing, Pedestrian state = car.state self.car = car self.grid_dim = obs_dim self.grid_square = Shape(x=car.x+obs_dim/3*np.cos(car.angle), y=car.y-obs_dim/3*np.sin(car.angle), xdim=obs_dim, ydim=obs_dim, angle=car.angle, color=None) self.all_collideables = [] collideable_map = {Waypoint:[]} for k, obj in iteritems(state.objects): if (car.can_collide(obj) or type(obj) in {TrafficLight}) and self.grid_square.intersects(obj): typ = type(obj) if typ not in collideable_map: collideable_map[typ] = [] collideable_map[typ].append(obj) self.all_collideables.append(obj) for waypoint in car.waypoints: collideable_map[Waypoint].append(waypoint) self.all_collideables.append(waypoint) debug_window = pygame.Surface((self.grid_dim, self.grid_dim)) gd = self.grid_dim a0 = self.car.angle + np.pi / 2 a1 = self.car.angle for typ in [Terrain, Sidewalk, Lane, Car, TrafficLight, Waypoint, PedCrossing, Pedestrian]: if typ in collideable_map: for obj in collideable_map[typ]: rel_obj = obj.get_relative((self.car.x+gd/2*np.cos(a0)-gd/6*np.cos(a1), self.car.y-gd/2*np.sin(a0)+gd/6*np.sin(a1), self.car.angle)) rel_obj.render(debug_window, border=None) self.pygame_rep = pygame.transform.rotate(debug_window, 90)
def __init__(self, car, obs_dim=500): from fluids.assets import ALL_OBJS, TrafficLight, Lane, Terrain, Sidewalk, \ PedCrossing, Street, Car, Waypoint, Pedestrian state = car.state self.car = car self.grid_dim = obs_dim self.grid_square = Shape(x=car.x + obs_dim / 3 * np.cos(car.angle), y=car.y - obs_dim / 3 * np.sin(car.angle), xdim=obs_dim, ydim=obs_dim, angle=car.angle, color=None) self.all_collideables = [] collideable_map = {typ: [] for typ in ALL_OBJS} for k, obj in iteritems(state.objects): if (car.can_collide(obj) or type(obj) in {TrafficLight, Lane, Street }) and self.grid_square.intersects(obj): typ = type(obj) if typ not in collideable_map: collideable_map[typ] = [] collideable_map[typ].append(obj) self.all_collideables.append(obj) for waypoint in car.waypoints: collideable_map[Waypoint].append(waypoint) self.all_collideables.append(waypoint) terrain_window = pygame.Surface((self.grid_dim, self.grid_dim)) drivable_window = pygame.Surface((self.grid_dim, self.grid_dim)) undrivable_window = pygame.Surface((self.grid_dim, self.grid_dim)) car_window = pygame.Surface((self.grid_dim, self.grid_dim)) ped_window = pygame.Surface((self.grid_dim, self.grid_dim)) light_window = pygame.Surface((self.grid_dim, self.grid_dim)) direction_window = pygame.Surface((self.grid_dim, self.grid_dim)) gd = self.grid_dim a0 = self.car.angle + np.pi / 2 a1 = self.car.angle rel = (self.car.x + gd / 2 * np.cos(a0) - gd / 6 * np.cos(a1), self.car.y - gd / 2 * np.sin(a0) + gd / 6 * np.sin(a1), self.car.angle) for typ in [Terrain, Sidewalk, PedCrossing]: for obj in collideable_map[typ]: rel_obj = obj.get_relative(rel) rel_obj.render(terrain_window, border=None) for obj in collideable_map[Lane]: rel_obj = obj.get_relative(rel) if not car.can_collide(obj): rel_obj.render(drivable_window, border=None) else: rel_obj.render(undrivable_window, border=None) for obj in collideable_map[Street]: rel_obj = obj.get_relative(rel) rel_obj.render(drivable_window, border=None) for obj in collideable_map[Car]: rel_obj = obj.get_relative(rel) rel_obj.render(car_window, border=None) for obj in collideable_map[Pedestrian]: rel_obj = obj.get_relative(rel) rel_obj.render(ped_window, border=None) for obj in collideable_map[TrafficLight]: rel_obj = obj.get_relative(rel) rel_obj.render(light_window, border=None) point = (int(gd / 6), int(gd / 2)) for p in self.car.waypoints: relp = p.get_relative(rel) new_point = int(relp.x), int(relp.y) pygame.draw.line(direction_window, (255, 255, 255), point, new_point, 10) point = new_point self.pygame_rep = [ pygame.transform.rotate(window, 90) for window in [ terrain_window, drivable_window, undrivable_window, car_window, ped_window, light_window, direction_window ] ]
def __init__(self, car, obs_dim=500, shape=(500, 500)): from fluids.assets import ALL_OBJS, TrafficLight, Lane, Terrain, Sidewalk, \ PedCrossing, Street, Car, Waypoint, Pedestrian state = car.state self.car = car self.shape = shape self.grid_dim = obs_dim self.downsample = self.shape != (obs_dim, obs_dim) self.grid_square = Shape(x=car.x + obs_dim / 3 * np.cos(car.angle), y=car.y - obs_dim / 3 * np.sin(car.angle), xdim=obs_dim, ydim=obs_dim, angle=car.angle, color=None, border_color=(200, 0, 0)) gd = self.grid_dim a0 = self.car.angle + np.pi / 2 a1 = self.car.angle # rel = (self.car.x + gd / 2 * np.cos(a0) - gd / 6 * np.cos(a1), # self.car.y - gd / 2 * np.sin(a0) + gd / 6 * np.sin(a1), # self.car.angle) rel = (self.car.x, self.car.y, self.car.angle) scale_factor = 500.0 # Gather the lights and cars objects for later information gathering traffic_lights = [] other_cars = [] for k, obj in iteritems(state.objects): if (car.can_collide(obj) or type(obj) in {TrafficLight, Lane, Street}) and self.grid_square.intersects(obj): typ = type(obj) if typ == TrafficLight: traffic_lights.append(obj) elif typ == Car: other_cars.append(obj) # Information about the stop light light_x, light_y = 0.0, 0.0 color_to_state = {RED:-1.0, YELLOW: 0.0, GREEN: 1.0} light_state = 1.0 # Default state to green so that if it doesn't exist the default behaviour is to go. # 0 if no light 1 if light exists light_exists = 0.0 closest_dist = 99999999 for light in traffic_lights: rel_obj = light.get_relative(rel) x, y = rel_obj.x, rel_obj.y dist_sq = x**2 + y**2 if dist_sq < closest_dist: closest_dist = dist_sq # TODO: Scale so the values aren't as large light_x, light_y = rel_obj.x, rel_obj.y light_exists = 1.0 light_state = color_to_state[light.color] light_x /= scale_factor light_y /= scale_factor # Information about the closest car other_car_x, other_car_y = 0.0, 0.0 other_car_vx, other_car_vy = 0.0, 0.0 other_car_exists = 0.0 closest_dist = 99999999 for other_car in other_cars: rel_obj = other_car.get_relative(rel) x, y = rel_obj.x, rel_obj.y dist_sq = x**2 + y**2 if dist_sq < closest_dist: closest_dist = dist_sq # TODO: Scale so the values aren't as large other_car_x, other_car_y = rel_obj.x, rel_obj.y other_car_exists = 1.0 relative_theta = other_car.angle - car.angle other_car_vx = other_car.vel * np.cos(relative_theta) other_car_vy = other_car.vel * -np.sin(relative_theta) other_car_exists other_car_x /= scale_factor other_car_y /= scale_factor # Information about the next waypoint # TODO: Scale so the values aren't as large if car.waypoints: rel_waypoint = car.waypoints[0].get_relative(rel) waypoint_x = rel_waypoint.x waypoint_y = rel_waypoint.y else: waypoint_x, waypoint_y = 50.0, 0.0 waypoint_x /= scale_factor waypoint_y /= scale_factor self.pygame_rep = [light_x, light_y, light_state, light_exists, other_car_x, other_car_y, other_car_vx, other_car_vy, other_car_exists, waypoint_x, waypoint_y, car.vel]
def __init__(self, car, obs_dim=500, shape=(500, 500)): from fluids.assets import ALL_OBJS, TrafficLight, Lane, Terrain, Sidewalk, \ PedCrossing, Street, Car, Waypoint, Pedestrian state = car.state self.car = car self.shape = shape self.grid_dim = obs_dim self.downsample = self.shape != (obs_dim, obs_dim) self.grid_square = Shape(x=car.x + obs_dim / 3 * np.cos(car.angle), y=car.y - obs_dim / 3 * np.sin(car.angle), xdim=obs_dim, ydim=obs_dim, angle=car.angle, color=None, border_color=(200, 0, 0)) self.all_collideables = [] collideable_map = {typ: [] for typ in ALL_OBJS} for k, obj in iteritems(state.objects): if (car.can_collide(obj) or type(obj) in {TrafficLight, Lane, Street }) and self.grid_square.intersects(obj): typ = type(obj) if typ == TrafficLight: if obj.color == RED: typ = "TrafficLight-Red" elif obj.color == GREEN: typ = "TrafficLight-Green" elif obj.color == YELLOW: typ = "TrafficLight-Yellow" if typ not in collideable_map: collideable_map[typ] = [] collideable_map[typ].append(obj) self.all_collideables.append(obj) for waypoint in car.waypoints: collideable_map[Waypoint].append(waypoint) self.all_collideables.append(waypoint) terrain_window = pygame.Surface((self.grid_dim, self.grid_dim)) drivable_window = pygame.Surface((self.grid_dim, self.grid_dim)) undrivable_window = pygame.Surface((self.grid_dim, self.grid_dim)) car_window = pygame.Surface((self.grid_dim, self.grid_dim)) ped_window = pygame.Surface((self.grid_dim, self.grid_dim)) light_window_red = pygame.Surface((self.grid_dim, self.grid_dim)) light_window_green = pygame.Surface((self.grid_dim, self.grid_dim)) light_window_yellow = pygame.Surface((self.grid_dim, self.grid_dim)) direction_window = pygame.Surface((self.grid_dim, self.grid_dim)) direction_pixel_window \ = pygame.Surface((self.grid_dim, self.grid_dim)) direction_edge_window \ = pygame.Surface((self.grid_dim, self.grid_dim)) gd = self.grid_dim a0 = self.car.angle + np.pi / 2 a1 = self.car.angle rel = (self.car.x + gd / 2 * np.cos(a0) - gd / 6 * np.cos(a1), self.car.y - gd / 2 * np.sin(a0) + gd / 6 * np.sin(a1), self.car.angle) for typ in [Terrain, Sidewalk, PedCrossing]: for obj in collideable_map[typ]: rel_obj = obj.get_relative(rel) rel_obj.render(terrain_window, border=None) for obj in collideable_map[Lane]: rel_obj = obj.get_relative(rel) if not car.can_collide(obj): rel_obj.render(drivable_window, border=None) else: rel_obj.render(undrivable_window, border=None) for obj in collideable_map[Street]: rel_obj = obj.get_relative(rel) rel_obj.render(drivable_window, border=None) for obj in collideable_map[Car]: rel_obj = obj.get_relative(rel) rel_obj.render(car_window, border=None) for obj in collideable_map[Pedestrian]: rel_obj = obj.get_relative(rel) rel_obj.render(ped_window, border=None) for obj in collideable_map["TrafficLight-Red"]: rel_obj = obj.get_relative(rel) rel_obj.render(light_window_red, border=None) for obj in collideable_map["TrafficLight-Green"]: rel_obj = obj.get_relative(rel) rel_obj.render(light_window_green, border=None) for obj in collideable_map["TrafficLight-Yellow"]: rel_obj = obj.get_relative(rel) rel_obj.render(light_window_green, border=None) point = (int(gd / 6), int(gd / 2)) edge_point = None def is_on_screen(point, gd): return 0 <= point[0] < gd and 0 <= point[1] < gd line_width = 20 for p in self.car.waypoints: relp = p.get_relative(rel) new_point = int(relp.x), int(relp.y) if not edge_point and is_on_screen( point, gd) and not is_on_screen(new_point, gd): edge_point = new_point pygame.draw.line(direction_window, (255, 255, 255), point, new_point, line_width) point = new_point if edge_point: edge_point = (min(gd - 1, max(0, edge_point[0])), min(gd - 1, max(0, edge_point[1]))) pygame.draw.circle(direction_pixel_window, (255, 255, 255), edge_point, line_width) if edge_point: if edge_point[0] == 0: pygame.draw.line(direction_edge_window, (255, 255, 255), (0, 0), (0, gd - 1), line_width) if edge_point[0] == gd - 1: pygame.draw.line(direction_edge_window, (255, 255, 255), (gd - 1, 0), (gd - 1, gd - 1), line_width) if edge_point[1] == 0: pygame.draw.line(direction_edge_window, (255, 255, 255), (0, 0), (gd - 1, 0), line_width) if edge_point[1] == gd - 1: pygame.draw.line(direction_edge_window, (255, 255, 255), (0, gd - 1), (gd - 1, gd - 1), line_width) self.pygame_rep = [ pygame.transform.rotate(window, 90) for window in [ terrain_window, drivable_window, undrivable_window, car_window, ped_window, light_window_red, light_window_green, light_window_yellow, direction_window, direction_pixel_window, direction_edge_window ] ]