Exemplo n.º 1
0
    graph, queue, k_m = initDStarLite(graph, queue, s_start, s_goal, k_m)

    basicfont = pygame.font.SysFont('avenirnext', 20)
    print(
        'Click to create obstacles or press spacebar to iterate through simulation'
    )

    # -------- Main Program Loop -----------
    while not done:
        for event in pygame.event.get():  # User did something
            if event.type == pygame.QUIT:  # If user clicked close
                done = True  # Flag that we are done so we exit this loop
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                # print('space bar! call next action')
                s_new, k_m = moveAndRescan(graph, queue, s_current,
                                           VIEWING_RANGE, k_m)
                if s_new == 'goal':
                    print('Goal Reached!')
                    done = True
                else:
                    s_current = s_new
                    pos_coords = stateNameToCoords(s_current)

            elif event.type == pygame.MOUSEBUTTONDOWN:
                # User clicks the mouse. Get the position
                pos = pygame.mouse.get_pos()
                # Change the x/y screen coordinates to grid coordinates
                column = pos[0] // (WIDTH + MARGIN)
                row = pos[1] // (HEIGHT + MARGIN)
                if (graph.cells[row][column] == 0):
                    graph.cells[row][column] = -1
Exemplo n.º 2
0
def main():

    # Loop until the user clicks the close button.
    done = False

    graph = GridWorld(dimension_x, dimension_y)

    s_start = input("Enter start (xnym, where n,m are coordinates) : ")
    s_goal = input("Enter goal (xnym, where n,m are coordinates)  : ")
    #	s_start = 'x1y2'
    #	s_goal = 'x9y7'
    goal_coords = stateNameToCoords(s_goal)
    start_coords = stateNameToCoords(s_start)

    graph.setStart(s_start)
    graph.setGoal(s_goal)
    k_m = 0
    s_last = s_start
    queue = []

    graph, queue, k_m = initDStarLite(graph, queue, s_start, s_goal, k_m)

    s_current = s_start
    pos_coords = stateNameToCoords(s_current)

    robot_centers = []

    # Initialize pygame
    pygame.init()

    screen = pygame.display.set_mode(WINDOW_SIZE)

    # Set title of screen
    pygame.display.set_caption("D* Lite Path Planning")

    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()
    basicfont = pygame.font.SysFont('Comic Sans MS', 22)

    # -------- Main Program Loop -----------
    while done == False:
        for event in pygame.event.get():  # User did something
            if event.type == pygame.QUIT:  # If user clicked close
                done = True  # Flag that we are done so we exit this loop
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                print('move')
                s_new, k_m = moveAndRescan(graph, queue, s_current, k_m)

                if s_new == 'goal':
                    print('Goal Reached!')
                    done = True
                else:
                    # print('setting s_current to ', s_new)
                    s_current = s_new
                    pos_coords = stateNameToCoords(s_current)
                    # print('got pos coords: ', pos_coords)

            elif event.type == pygame.MOUSEBUTTONDOWN:
                # User clicks the mouse. Get the position
                pos = pygame.mouse.get_pos()
                # Change the x/y screen coordinates to grid coordinates
                column = pos[0] // (width + margin)
                row = pos[1] // (height + margin)
                # Set that location to one
                if (graph.cells[row][column] == 0):
                    graph.cells[row][column] = -1

        # Set the screen background
        screen.fill(BLACK)

        # Draw the grid
        for row in range(dimension_y):
            for column in range(dimension_x):

                pygame.draw.rect(
                    screen, colors[graph.cells[row][column]],
                    [(margin + width) * column + margin,
                     (margin + height) * row + margin, width, height])
                node_name = 'x' + str(column) + 'y' + str(row)

        # fill in goal cell with GREEN
        pygame.draw.rect(
            screen, GREEN,
            [(margin + width) * start_coords[0] + margin,
             (margin + height) * start_coords[1] + margin, width, height])

        # fill in goal cell with RED
        pygame.draw.rect(
            screen, RED,
            [(margin + width) * goal_coords[0] + margin,
             (margin + height) * goal_coords[1] + margin, width, height])

        # draw moving robot, based on pos_coords

        # Set the new robot centre
        robot_center = [
            int(pos_coords[0] * (width + margin) + width / 2) + margin,
            int(pos_coords[1] * (height + margin) + height / 2) + margin
        ]
        draw_arrow(screen, BLACK, robot_center, robot_center)

        # maintain a list of all cells traversed
        robot_centers.append(robot_center)

        if len(robot_centers) > 1:
            for i in range(0, len(robot_centers) - 1):
                pygame.draw.line(screen, BLACK, robot_centers[i],
                                 robot_centers[i + 1], 3)

        # grey out visible boxes for robot
        screen.blit(
            transparent,
            (robot_center[0] - 1.5 * width - margin, robot_center[1] -
             1.5 * height - margin))  # (0,0) are the top-left coordinates

        # Limit to 60 frames per second
        clock.tick(20)

        # Go ahead and update the screen with what we've drawn.
        pygame.display.flip()

    # Be IDLE friendly. If you forget this line, the program will 'hang'
    # on exit.
    pygame.quit()