Skip to content
Snippets Groups Projects
main.py 5.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • import yaml
    
    import os
    import random
    import numpy as np
    import pygame
    
    rachelmoan's avatar
    rachelmoan committed
    from guided_mrmp.utils import Env, Roomba, Robot, create_random_starts_and_goals
    
    from guided_mrmp.planners import RRT
    from guided_mrmp.planners import RRTStar
    
    
    from guided_mrmp.planners.db_guided_mrmp import GuidedMRMP
    
    from guided_mrmp.simulator import Simulator
    
    from guided_mrmp.utils.library import Library
    
    class_function_names_dict = {
        'Roomba': Roomba
    
    rachelmoan's avatar
    rachelmoan committed
        # 'RRT': RRT(),
        # 'RRTStar': RRTStar(),
        }
    
    # robot = class_names_dist[config["robot_naame"]](**config["robot_params"])
    
    
    def load_settings(file_path):
        with open(file_path, 'r') as file:
            settings = yaml.safe_load(file)
        return settings
    
    
    def set_python_seed(seed):
        print(f"***Setting Python Seed {seed}***")
        os.environ['PYTHONHASHSEED'] = str(seed)
        np.random.seed(seed)
        random.seed(seed)
    
    def plan_decoupled_path(env, start, goal, solver="RRT*", 
                            step_length=20, goal_sample_rate=.5, num_samples=500000, r=80):
        """
        Plan decoupled path from a given start to a given goal, using a single-agent solver.
    
        inputs:
            - start (tuple): (x,y) location of start 
            - goal (tuple): (x,y) location of goal 
            - solver (string): Name of single-agent solver to be used
            - step_length (float): 
            - goal_sample_rate (float):
            - num_samples (int):
            - r (float):
        output:
            - path (list): list of nodes in path 
        """
        if solver == "RRT":
            rrt = RRT(env, start, goal, step_length, goal_sample_rate, num_samples)
    
    rachelmoan's avatar
    rachelmoan committed
            path, tree = rrt.run()
    
        elif solver == "RRT*":
            rrtstar = RRTStar(env, start, goal, step_length, goal_sample_rate, num_samples,r)
    
    rachelmoan's avatar
    rachelmoan committed
            path, tree = rrtstar.run()
    
        else:
            print(f"Solver {solver} is not yet implemented. Choose something else.")
            return None
    
    
    rachelmoan's avatar
    rachelmoan committed
        return list(reversed(path)), tree
    
    def initialize_robots(starts, goals, dynamics_models, radii, target_v, env):
    
        """
        NOTE This function (and the plan_decoupled_paths function could just exist as 
        helper functions elsewhere to make this class easier to understand)
        """
    
        # print("initializing robots")
    
    
        robots = []
    
        colors = [list(np.random.choice(range(256), size=3)) for i in range(len(starts))]
    
    
        for i, (start, goal, dynamics_model, radius, color) in enumerate(zip(starts, goals, dynamics_models, radii, colors)):
    
            # print(f"planning path for robot {i} from {start} to {goal} ")
    
    rachelmoan's avatar
    rachelmoan committed
            rrtpath, tree = plan_decoupled_path(env, (start[0],start[1]), (goal[0],goal[1]))
    
            xs = []
            ys = []
            for node in rrtpath:
                xs.append(node[0])
                ys.append(node[1])
    
            waypoints = [xs,ys]
    
    
            # print(f"waypoints = {waypoints}")
    
            start_heading = np.arctan2(goal[1] - start[1], goal[0] - start[0])
            start = [start[0], start[1], start_heading]
    
    rachelmoan's avatar
    rachelmoan committed
            r = Robot(i,color,radius,start,goal,dynamics_model,target_v,rrtpath,waypoints, tree)
    
    def initialize_libraries(library_fnames=["guided_mrmp/database/2x3_library","guided_mrmp/database/3x3_library","guided_mrmp/database/5x2_library"]):
        """
        Load the 2x3, 3x3, and 2x5 libraries. Store them in self.lib-x- 
        Inputs: 
            library_fnames - the folder containing the library files
        """
        # Create each of the libraries
        print(f"Loading libraries. This usually takes about 10 seconds...")
        lib_2x3 = Library(library_fnames[0])
        lib_2x3.read_library_from_file()
        
        lib_3x3 = Library(library_fnames[1])
        lib_3x3.read_library_from_file()
    
        
        lib_2x5 = Library(library_fnames[2])
        lib_2x5.read_library_from_file()
    
        return [lib_2x3, lib_3x3, lib_2x5]
    
    
    
    if __name__ == "__main__":
    
    rachelmoan's avatar
    rachelmoan committed
        # Load the settings
    
        settings = load_settings("settings_files/settings.yaml")
    
        set_python_seed(1123)
        # set_python_seed(11235813)
    
    rachelmoan's avatar
    rachelmoan committed
    
        # Load and create the environment
    
        circle_obstacles = settings['environment']['circle_obstacles']
        rectangle_obstacles = settings['environment']['rectangle_obstacles']
    
    rachelmoan's avatar
    rachelmoan committed
        x_range = settings['environment']['x_range']
        y_range = settings['environment']['y_range']
    
        # sim_x_range = settings['simulator']['sim_x_range']
        # sim_y_range = settings['simulator']['sim_y_range']
    
    rachelmoan's avatar
    rachelmoan committed
        env = Env(x_range, y_range, circle_obstacles, rectangle_obstacles)
    
    rachelmoan's avatar
    rachelmoan committed
        # Load the dynamics models
        dynamics_models_st = settings['dynamics_models']
    
    rachelmoan's avatar
    rachelmoan committed
        dynamics_models = []
        for model in dynamics_models_st:
    
            dynamics_models.append(class_function_names_dict[model](settings))
    
    rachelmoan's avatar
    rachelmoan committed
        # Load and create the robots
        robot_starts = settings['robot_starts']
        robot_goals = settings['robot_goals']
    
        robot_radii = settings['robot_radii']
        target_v = settings['target_v']
    
        if robot_starts == []:
            robot_starts, robot_goals = create_random_starts_and_goals(env, len(robot_radii))
    
        # print(f"starts = {len(robot_starts)}")
    
        robots = initialize_robots(robot_starts, robot_goals, dynamics_models, robot_radii, target_v, env)
    
        # Load the libraries
    
    rachelmoan's avatar
    rachelmoan committed
        libs = initialize_libraries()
        # libs = [None, None, None]
    
        # Create the Guided MRMP policy
    
    rachelmoan's avatar
    rachelmoan committed
        T = settings['prediction_horizon']
        DT = settings['discretization_step']
    
        policy = GuidedMRMP(env, robots, dynamics_models, T, DT, libs, settings)
    
        # Create the simulator
    
        scaling_factor = settings['simulator']['scaling_factor']
        show_vis = True
        if show_vis:
            pygame.init()
            screen = pygame.display.set_mode((x_range[1]*scaling_factor, y_range[1]*scaling_factor)) 
    
        else: screen = None
    
    rachelmoan's avatar
    rachelmoan committed
        sim = Simulator(robots, dynamics_models, env, policy, settings)
    
        # Run the simulation
    
        start = time.time()
        sim.run(screen, show_vis)
        end = time.time()
        print(f"Simulation took {end-start} seconds")