예제 #1
0
    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)
예제 #2
0
    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
            ]
        ]
예제 #3
0
    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]
예제 #4
0
    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
            ]
        ]