From 758bfb345be449ef91fe4d2be6f62e7edf778213 Mon Sep 17 00:00:00 2001 From: rachelmoan <moanrachel516@gmail.com> Date: Wed, 16 Oct 2024 21:17:14 -0500 Subject: [PATCH] Improve the resolution of pygame window by adding scaling factor --- guided_mrmp/main.py | 31 +++++++++++---- guided_mrmp/simulator.py | 82 ++++++++++++++++++++++++++-------------- 2 files changed, 76 insertions(+), 37 deletions(-) diff --git a/guided_mrmp/main.py b/guided_mrmp/main.py index 6c06734..94b1b84 100644 --- a/guided_mrmp/main.py +++ b/guided_mrmp/main.py @@ -3,6 +3,7 @@ import os import random import numpy as np import pygame +import time 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 @@ -62,14 +63,14 @@ 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") + # 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} ") + # print(f"planning path for robot {i} from {start} to {goal} ") rrtpath = plan_decoupled_path(env, (start[0],start[1]), (goal[0],goal[1])) xs = [] ys = [] @@ -79,7 +80,10 @@ def initialize_robots(starts, goals, dynamics_models, radii, target_v, env): waypoints = [xs,ys] - print(f"waypoints = {waypoints}") + # print(f"waypoints = {waypoints}") + + start_heading = np.arctan2(goal[1] - start[1], goal[0] - start[0]) + start = [start[0], start[1], start_heading] r = Robot(i,color,radius,start,goal,dynamics_model,target_v,rrtpath,waypoints) robots.append(r) @@ -91,13 +95,16 @@ if __name__ == "__main__": # Load the settings settings = load_settings("settings.yaml") - set_python_seed(42) + set_python_seed(1123) + # set_python_seed(11235813) # Load and create the environment circle_obstacles = settings['environment']['circle_obstacles'] rectangle_obstacles = settings['environment']['rectangle_obstacles'] 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'] env = Env(x_range, y_range, circle_obstacles, rectangle_obstacles) # Load the dynamics models @@ -114,7 +121,7 @@ if __name__ == "__main__": 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)}") + # print(f"starts = {len(robot_starts)}") robots = initialize_robots(robot_starts, robot_goals, dynamics_models, robot_radii, target_v, env) @@ -124,10 +131,18 @@ if __name__ == "__main__": policy = GuidedMRMP(env, robots, dynamics_models, T, DT, settings) # Create the simulator - pygame.init() - screen = pygame.display.set_mode((x_range[1], y_range[1])) + 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 sim = Simulator(robots, dynamics_models, env, policy, settings) # Run the simulation - sim.run(screen) + start = time.time() + sim.run(screen, show_vis) + end = time.time() + print(f"Simulation took {end-start} seconds") diff --git a/guided_mrmp/simulator.py b/guided_mrmp/simulator.py index ae2171e..cf3728e 100644 --- a/guided_mrmp/simulator.py +++ b/guided_mrmp/simulator.py @@ -23,59 +23,83 @@ class Simulator: self.num_robots = len(robots) self.dynamics_models = dynamics_models self.time = 0 + self.scaling_factor = settings['simulator']['scaling_factor'] + + def all_robots_at_goal(self): + for r in self.robots: + if (np.sqrt((r.current_position[0] - r.goal[0]) ** 2 + (r.current_position[1] - r.goal[1]) ** 2) > 1): + return False + return True def advance(self, screen, dt): """ Advance the simulation by dt seconds """ - controls = self.policy.advance(screen,self.state, self.time, dt) - # print(controls) - for i in range(self.num_robots): - new_state = self.dynamics_models[i].next_state(self.state[i], controls[i], dt) - self.robots[i].current_position = new_state - self.state[i] = new_state - self.time += dt + conflict_detected, controls = self.policy.advance(screen,self.state, self.time, dt) + + if not conflict_detected: + for i in range(self.num_robots): + new_state = self.dynamics_models[i].next_state(self.state[i], controls[i], dt) + self.robots[i].current_position = new_state + self.state[i] = new_state + self.time += dt + + if conflict_detected: + print("Executing full trajectory") + for i in range(self.num_robots): + controls_list = controls[i] + for j in range(len(controls_list)): + next_control = [controls_list[0][j], controls_list[1][j]] + print(f"next control = {next_control}") + new_state = self.dynamics_models[i].next_state(self.state[i], next_control, dt) + self.robots[i].current_position = new_state + self.state[i] = new_state + self.time += dt def draw_environment(self, screen): screen.fill((255,255,255)) for obs in self.circ_obstacles: - pygame.draw.circle(screen, (0,0,0), obs[0:2], obs[2]) + pygame.draw.circle(screen, (0,0,0), obs[0:2]*self.scaling_factor, obs[2]*self.scaling_factor) for obs in self.rect_obstacles: pygame.draw.rect(screen, (0,0,0), obs) def draw_robots(self, screen): for robot in self.robots: x,y,yaw = robot.current_position - pygame.draw.circle(screen, robot.color, (x,y), robot.radius) + pygame.draw.circle(screen, robot.color, (x*self.scaling_factor,y*self.scaling_factor), robot.radius*self.scaling_factor) # Plot direction marker dx = robot.radius * np.cos(robot.current_position[2]) dy = robot.radius * np.sin(robot.current_position[2]) - pygame.draw.line(screen, (0,0,0), (x,y), (x+dx,y+dy), width=2) + pygame.draw.line(screen, (0,0,0), (x*self.scaling_factor,y*self.scaling_factor), (x*self.scaling_factor+dx*self.scaling_factor,y*self.scaling_factor+dy*self.scaling_factor), width=2) - def run(self, screen): + def run(self, screen, show_vis=False): clock = pygame.time.Clock() pause = False - while 1: + while not self.all_robots_at_goal(): clock.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return - if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: - return - if event.type == pygame.KEYDOWN and event.key == pygame.K_p: - pause = not pause - if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT and pause: + if show_vis: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return + if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: + return + if event.type == pygame.KEYDOWN and event.key == pygame.K_p: + pause = not pause + if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT and pause: + self.draw_environment(screen) + self.policy.add_vis_guide_paths(screen, self.scaling_factor) + self.draw_robots(screen) + + self.advance(screen,self.policy.DT) + if not pause: + if show_vis: self.draw_environment(screen) - self.policy.add_vis_guide_paths(screen) + self.policy.add_vis_guide_paths(screen, self.scaling_factor) self.draw_robots(screen) - - self.advance(screen,.5) - if not pause: - self.draw_environment(screen) - self.policy.add_vis_guide_paths(screen) - self.draw_robots(screen) - self.advance(screen,.5) + self.advance(screen,self.policy.DT) - pygame.display.flip() + if show_vis: + pygame.display.flip() + -- GitLab