Commit e1472177 authored by Bryson Howell's avatar Bryson Howell

Got better search path data by reducing the path length cost. More progress on Gym.

parent 307fd299
File added
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -81,6 +81,7 @@ class RobotGP(torch.nn.Module): ...@@ -81,6 +81,7 @@ class RobotGP(torch.nn.Module):
self._init_riskcost_scaling = 1e7 # 1e7 self._init_riskcost_scaling = 1e7 # 1e7
self._init_lengthcost_scaling = 1e2 # 1e7 self._init_lengthcost_scaling = 1e2 # 1e7
self._init_lengthcost_scaling = 0.5e1
self.riskcost_scaling = self._init_riskcost_scaling self.riskcost_scaling = self._init_riskcost_scaling
self.lengthcost_scaling = self._init_lengthcost_scaling self.lengthcost_scaling = self._init_lengthcost_scaling
......
...@@ -227,7 +227,7 @@ class MonteCarlo(params.Default): ...@@ -227,7 +227,7 @@ class MonteCarlo(params.Default):
self.p[dist_mat <= self.params['ring_mobi'][2]] += 0.25 # outter ring self.p[dist_mat <= self.params['ring_mobi'][2]] += 0.25 # outter ring
self.p[dist_mat <= self.params['ring_mobi'][3]] += 0.20 # containment ring self.p[dist_mat <= self.params['ring_mobi'][3]] += 0.20 # containment ring
# print(self.p) # print(self.p)
self.p = ndimage.gaussian_filter(self.p, sigma=8) # to make betta heatmap self.p = ndimage.gaussian_filter(self.p, sigma=32) # to make betta heatmap (sigma needs to scale w/ env size)
#Makes heatmap favoring a corner #Makes heatmap favoring a corner
elif self.params['lp_model'] == 'trust': #test for trust elif self.params['lp_model'] == 'trust': #test for trust
self.p = np.zeros((self._x_shape, self._y_shape), dtype=float) self.p = np.zeros((self._x_shape, self._y_shape), dtype=float)
...@@ -253,16 +253,6 @@ class MonteCarlo(params.Default): ...@@ -253,16 +253,6 @@ class MonteCarlo(params.Default):
else: else:
self.p = np.zeros((self._x_shape, self._y_shape), dtype=float) self.p = np.zeros((self._x_shape, self._y_shape), dtype=float)
#Show LP Heatmap for testing
show = False
if(show):
print('Environment shape = %d x %d' % (self._x_shape,self._y_shape))
print(np.shape(self.p))
plt.imshow(self.p)
plt.title('Selected heatmap')
plt.show()
# generate lp from real model for comparison # generate lp from real model for comparison
fn = self.params['lp_filename'] fn = self.params['lp_filename']
self.comp_map, trash = load_heatmap(filename=fn, map_size=[self._x_shape, self._y_shape], self.comp_map, trash = load_heatmap(filename=fn, map_size=[self._x_shape, self._y_shape],
...@@ -275,6 +265,16 @@ class MonteCarlo(params.Default): ...@@ -275,6 +265,16 @@ class MonteCarlo(params.Default):
self.p = self.p - np.min(self.p) self.p = self.p - np.min(self.p)
self.p = self.p/np.max(self.p) self.p = self.p/np.max(self.p)
#Show LP Heatmap for testing
show = True
if(show):
print('Environment shape = %d x %d' % (self._x_shape,self._y_shape))
print(np.shape(self.p))
plt.imshow(self.p)
plt.title('Lost Person Model Search Probability')
plt.show()
#np.save('./deeprl_data/test_prob.npy',self.p)
self.searcher_class.go_forth(params=self.params) # sets sweep bounds and starting points self.searcher_class.go_forth(params=self.params) # sets sweep bounds and starting points
while True: while True:
self.searcher_class.step_all(dt=self.params['dt']) # and this makes each step? self.searcher_class.step_all(dt=self.params['dt']) # and this makes each step?
......
{"min_cost_bcls": 229324787010.07285, "curr_cost_bcls": 229331952345.00833, "curr_delta_bcls": 706270.9504394531, "init_cost_bcls": 229383725097.5324, "delta_cost_bcls": 58938087.45956421, "min_cost_old": 19723784479.009815, "min_risk_old": 19694467039.962288, "min_len_old": 29317439.047525816, "find_percentage_curr_old": 0.4735243055555556, "mean_find_ratio_curr_old": 1.0000026330236846, "find_percentage_total_old": 0.7873263888888888, "mean_find_ratio_total_old": 1.000321066544102, "search_advantage": 0.5028393388564546, "time_to_find": 1.464032943251904, "find_percentage": 0.0122, "comp_time": 58.967463970184326}
\ No newline at end of file
{"min_cost_bcls": 229358833649.8525, "curr_cost_bcls": 229361724182.93137, "curr_delta_bcls": 156292.30221557617, "init_cost_bcls": 229429554281.75354, "delta_cost_bcls": 70720631.9010315, "min_cost_old": 19132862516.1268, "min_risk_old": 19093197424.21231, "min_len_old": 39665091.91448985, "find_percentage_curr_old": 0.4266493055555556, "mean_find_ratio_curr_old": 1.0000005201494666, "find_percentage_total_old": 0.7278645833333334, "mean_find_ratio_total_old": 1.00039854639231, "search_advantage": 0.5029008485866513, "time_to_find": 1.3174273370176781, "find_percentage": 0.0036, "comp_time": 66.1751618385315}
\ No newline at end of file
{"min_cost_bcls": 229355020368.46344, "curr_cost_bcls": 229364796564.25848, "curr_delta_bcls": 188170.25454711914, "init_cost_bcls": 229477452286.45734, "delta_cost_bcls": 122431917.99389648, "min_cost_old": 18319135484.3424, "min_risk_old": 18291988972.036346, "min_len_old": 27146512.306052096, "find_percentage_curr_old": 0.5815972222222222, "mean_find_ratio_curr_old": 1.0000034116660632, "find_percentage_total_old": 0.81640625, "mean_find_ratio_total_old": 1.0004374318893912, "search_advantage": 0.5028688691555725, "time_to_find": 1.194480360490085, "find_percentage": 0.0088, "comp_time": 63.6818208694458}
\ No newline at end of file
{"min_cost_bcls": 229308445696.26715, "curr_cost_bcls": 229333075991.13364, "curr_delta_bcls": 2998649.391571045, "init_cost_bcls": 229432252223.6156, "delta_cost_bcls": 123806527.3484497, "min_cost_old": 20135309109.431248, "min_risk_old": 20104750120.32219, "min_len_old": 30558989.10905969, "find_percentage_curr_old": 0.5928819444444444, "mean_find_ratio_curr_old": 1.0000032227729585, "find_percentage_total_old": 0.7491319444444444, "mean_find_ratio_total_old": 1.000332915662093, "search_advantage": 0.5028471262599199, "time_to_find": 1.1829233991299126, "find_percentage": 0.0134, "comp_time": 71.85460257530212}
\ No newline at end of file
{"min_cost_bcls": 229702480649.12128, "curr_cost_bcls": 229690675835.78653, "curr_delta_bcls": 767685.6897277832, "init_cost_bcls": 229775338443.88544, "delta_cost_bcls": 72857794.76416016, "min_cost_old": 17520243739.85434, "min_risk_old": 17443262334.80884, "min_len_old": 76981405.04549891, "find_percentage_curr_old": 0.5542534722222222, "mean_find_ratio_curr_old": 0.9999996241499337, "find_percentage_total_old": 0.8020833333333334, "mean_find_ratio_total_old": 1.0000698613038908, "search_advantage": 0.5013633208922221, "time_to_find": 0.8105801820808669, "find_percentage": 0.0036, "comp_time": 52.671302318573}
\ No newline at end of file
{"min_cost_bcls": 229456906801.79526, "curr_cost_bcls": 229436688481.48495, "curr_delta_bcls": 5814080.936431885, "init_cost_bcls": 229631504913.25647, "delta_cost_bcls": 174598111.46121216, "min_cost_old": 17761789529.348713, "min_risk_old": 17634814539.1485, "min_len_old": 126974990.20021392, "find_percentage_curr_old": 0.5290798611111112, "mean_find_ratio_curr_old": 0.9999998813692506, "find_percentage_total_old": 0.8237847222222222, "mean_find_ratio_total_old": 1.0001555570439349, "search_advantage": 0.5016389803784571, "time_to_find": 0.9283722471565711, "find_percentage": 0.0072, "comp_time": 92.8504068851471}
\ No newline at end of file
...@@ -7,21 +7,33 @@ import numpy as np ...@@ -7,21 +7,33 @@ import numpy as np
class GridWorldSAR(gym.Env): class GridWorldSAR(gym.Env):
metadata = {"render_modes": ["human", "rgb_array"], "render_fps": 4} metadata = {"render_modes": ["human", "rgb_array"], "render_fps": 4}
def __init__(self, render_mode=None, size=5): def __init__(self, render_mode=None, map_size=48):
self.size = size # The size of the square grid #Gym parameters
self.size = map_size # The size of the square grid
self.window_size = 512 # The size of the PyGame window self.window_size = 512 # The size of the PyGame window
#Values the agent will need
self.pos_x = 0.0 #Current position, update w/ velocity
self.pos_y = 0.0
self.heatmap = np.load('./deeprl_data/lpm4prob.npy')
# Observations are dictionaries with the agent's and the target's location. # Observations are dictionaries with the agent's and the target's location.
# Each location is encoded as an element of {0, ..., `size`}^2, i.e. MultiDiscrete([size, size]). # Each location is encoded as an element of {0, ..., `size`}^2, i.e. MultiDiscrete([size, size]).
#Agent will observe their location, and the
#Pos = agent's current coordinates
#risk = search risk. Agent can see in a square area around themselves
#visited = which spaces have been surveyed. Will be needed to get paths for multiple drones
self.observation_space = spaces.Dict( self.observation_space = spaces.Dict(
{ {
"agent": spaces.Box(0, size - 1, shape=(2,), dtype=int), "pos": spaces.Box(0, size -1, shape=(2,),dtype=int),
"target": spaces.Box(0, size - 1, shape=(2,), dtype=int), "risk": spaces.Box(0, 1, shape=(map_size*map_size,), dtype=float),
"visited": spaces.Box(0, 1, shape=(map_size*map_size,), dtype=bool),
} }
) )
#Might need to take the risk/visited obs out. Let's see if it runs
#Need a continuous action space for path planning...? #Continuous velocity. Keep it at 1 so agent can't skip over cells to end episode early
self.action_space = spaces.Discrete(4) self.action_space = spaces.Box(low=-1.0, high=1.0, shape=(2,), dtype=float)
...@@ -37,3 +49,7 @@ class GridWorldSAR(gym.Env): ...@@ -37,3 +49,7 @@ class GridWorldSAR(gym.Env):
""" """
self.window = None self.window = None
self.clock = None self.clock = None
def _get_obs(self):
return {'pos': np.array([np.int32(self.pos_x),np.int32(self.pos_y)])}
...@@ -108,16 +108,6 @@ def objective_printer(rgp_object = None, comp_time = 0.0, iteration = 0, folder ...@@ -108,16 +108,6 @@ def objective_printer(rgp_object = None, comp_time = 0.0, iteration = 0, folder
return save_dict return save_dict
#Save paths from rgp as numpy array
def gym_paths(rgp):
#New format: x, y, z, robot,
#np.save(rgp.)
return
def main(iteration = 0, parameters = -1): def main(iteration = 0, parameters = -1):
# iteration = 1 # iteration = 1
...@@ -155,9 +145,6 @@ def main(iteration = 0, parameters = -1): ...@@ -155,9 +145,6 @@ def main(iteration = 0, parameters = -1):
print(np.shape(rgp.min_risk_paths)) print(np.shape(rgp.min_risk_paths))
print(rgp.min_risk_paths[0]) print(rgp.min_risk_paths[0])
#Save path info for RL environment
gym_paths(rgp)
#Save the waypoints from the optimized paths #Save the waypoints from the optimized paths
robot_paths_local = waypoint_maker.write_file(rgp_object = rgp, terrain_class = mc.terrain, filename = 'waypointsTest.json') # write waypoints to file robot_paths_local = waypoint_maker.write_file(rgp_object = rgp, terrain_class = mc.terrain, filename = 'waypointsTest.json') # write waypoints to file
...@@ -199,6 +186,7 @@ if __name__ == "__main__": ...@@ -199,6 +186,7 @@ if __name__ == "__main__":
#Relative filepaths (Assumes this and ags_grabber projects are in same parent directory) #Relative filepaths (Assumes this and ags_grabber projects are in same parent directory)
kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_kentland.csv' kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_kentland.csv'
kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t4.csv'
hmpark_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_hmpark.csv' hmpark_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_hmpark.csv'
kentland_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_kentland.mat' kentland_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_kentland.mat'
...@@ -218,7 +206,7 @@ if __name__ == "__main__": ...@@ -218,7 +206,7 @@ if __name__ == "__main__":
params = ({ params = ({
'lp_model': 'custom', #custom, ring, trust, stripes 'lp_model': 'custom', #custom, ring, trust, stripes
'opt_iterations': 100, 'opt_iterations': 1000,
'path_style': 'basic', 'path_style': 'basic',
'stats_name': 'kentland', 'stats_name': 'kentland',
'anchor_point': [37.197730, -80.585233], # kentland 'anchor_point': [37.197730, -80.585233], # kentland
...@@ -227,6 +215,7 @@ if __name__ == "__main__": ...@@ -227,6 +215,7 @@ if __name__ == "__main__":
'num_humans' : h_max, 'num_humans' : h_max,
'lp_filename': kentland_heatmap, 'lp_filename': kentland_heatmap,
'lin_feat_filename': kentland_linfeat, 'lin_feat_filename': kentland_linfeat,
'terrainType': 'loadNumPy',
'save_data': True 'save_data': True
}) })
params['save_folder'] = 'trust-planner/{}_n{}_s{}_{}'.format( params['save_folder'] = 'trust-planner/{}_n{}_s{}_{}'.format(
......
...@@ -24,7 +24,8 @@ import pdb ...@@ -24,7 +24,8 @@ import pdb
#Relative filepaths (Assumes this and ags_grabber projects are in same parent directory) #Relative filepaths (Assumes this and ags_grabber projects are in same parent directory)
kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_kentland.csv' kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_kentland.csv'
hmpark_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_hmpark.csv' #kentland_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t4.csv' #I like 4?
#hmpark_heatmap = './LP model/analysis/outputs/ic_1_con_hiker_t12_hmpark.csv'
kentland_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_kentland.mat' kentland_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_kentland.mat'
hmpark_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_hmpark.mat' hmpark_linfeat = '../ags_grabber/matlab_data/BW_LFandInac_Zelev_hmpark.mat'
...@@ -40,7 +41,7 @@ def create_data(): ...@@ -40,7 +41,7 @@ def create_data():
#Dictionary of parameters #Dictionary of parameters
params = ({ params = ({
'lp_model': 'ring', #custom, ring, trust, stripes 'lp_model': 'custom', #custom, ring, trust, stripes
'opt_iterations': 1000, 'opt_iterations': 1000,
'path_style': 'basic', 'path_style': 'basic',
'stats_name': 'kentland', 'stats_name': 'kentland',
...@@ -51,24 +52,24 @@ def create_data(): ...@@ -51,24 +52,24 @@ def create_data():
'lp_filename': kentland_heatmap, 'lp_filename': kentland_heatmap,
'lin_feat_filename': kentland_linfeat, 'lin_feat_filename': kentland_linfeat,
'res': 25, 'res': 25,
'save_data': True 'terrainType': 'real',
#'ring_mobi': [120.708, 363.315, 605.921, 848.528],
'save_terrain': False,
'save_data': False
}) })
params['save_folder'] = 'deeprl/{}_n{}_s{}_{}'.format( params['save_folder'] = 'deeprl/{}_n{}_s{}_{}'.format(
params['stats_name'],n_max,s_max,params['path_style']) params['stats_name'],n_max,s_max,params['path_style'])
params = Default(params).params params = Default(params).params
#MonteCarlo loads LPM, creates searchers (humans on ground) #MonteCarlo loads LPM, creates searchers (humans on ground)
mc = MC.MonteCarlo(params=params) # calls terrain builder mc = MC.MonteCarlo(params=params) # calls terrain builder
mc.run_experiment() mc.run_experiment()
#Put Ring search values and paths into one matrix for the gym Environment (have to fix for full res)
#Make ring search model at 1/1 resolution
gridsize_x = mc._x_shape*params['res'] gridsize_x = mc._x_shape*params['res']
gridsize_y = mc._y_shape*params['res'] gridsize_y = mc._y_shape*params['res']
sar_fullgrid = np.zeros((gridsize_x,gridsize_y),dtype=float)
[x_crds,y_crds] = np.meshgrid(np.linspace(params['xlims'][0], params['xlims'][1], gridsize_x), [x_crds,y_crds] = np.meshgrid(np.linspace(params['xlims'][0], params['xlims'][1], gridsize_x),
np.linspace(params['ylims'][0], params['ylims'][1], gridsize_y)) np.linspace(params['ylims'][0], params['ylims'][1], gridsize_y))
dist_mat = np.sqrt(x_crds**2 + y_crds**2) dist_mat = np.sqrt(x_crds**2 + y_crds**2)
#Find cutoff points for ring model #Find cutoff points for ring model
maxdist = np.max(dist_mat) maxdist = np.max(dist_mat)
...@@ -77,10 +78,9 @@ def create_data(): ...@@ -77,10 +78,9 @@ def create_data():
cutoff = np.linspace(mindist+adjust, maxdist, 4) cutoff = np.linspace(mindist+adjust, maxdist, 4)
print("New Ring boundaries = ") print("New Ring boundaries = ")
print(cutoff) print(cutoff)
#params['ring_mobi'] = 25*[0.6e3, 1.8e3, 3.2e3, 9.9e3]
params['ring_mobi'] = cutoff params['ring_mobi'] = cutoff
#Fill in the heatmap
sar_fullgrid = np.zeros((gridsize_x,gridsize_y),dtype=float)
sar_fullgrid[dist_mat <= params['ring_mobi'][0]] += 0.25 # center ring (95%) sar_fullgrid[dist_mat <= params['ring_mobi'][0]] += 0.25 # center ring (95%)
sar_fullgrid[dist_mat <= params['ring_mobi'][1]] += 0.25 # middle ring (70%) sar_fullgrid[dist_mat <= params['ring_mobi'][1]] += 0.25 # middle ring (70%)
sar_fullgrid[dist_mat <= params['ring_mobi'][2]] += 0.25 # outter ring (45%) sar_fullgrid[dist_mat <= params['ring_mobi'][2]] += 0.25 # outter ring (45%)
...@@ -95,24 +95,22 @@ def create_data(): ...@@ -95,24 +95,22 @@ def create_data():
saveprobs = False saveprobs = False
if(saveprobs): if(saveprobs):
plt.imshow(sar_fullgrid) plt.imshow(sar_fullgrid)
plt.title('Selected heatmap') plt.title('Ring Model Search Probability')
plt.show() plt.show()
np.save('./deeprl_data/ring_prob.npy',sar_fullgrid) np.save('./deeprl_data/ring_prob3.npy',sar_fullgrid)
#Run path planner (Set rgp to use the full resolution heatmap)
stime = time.time() stime = time.time()
planner = planning.Planning(params, on_terrain=mc.terrain, mode='TOTALDIST') # also calls terrain builder... planner = planning.Planning(params, on_terrain=mc.terrain, mode='TOTALDIST') # also calls terrain builder...
rgp = robotgp.RobotGP(mc, planner, _stime = stime, parameters = params) rgp = robotgp.RobotGP(mc, planner, _stime = stime, parameters = params)
rgp.collect_trainData() # sets out paths for each robot rgp.collect_trainData() # sets out paths for each robot
rgp.optimize_risk_cost_grad(_show_detail=True) #runs ADAM optimizer
rgp.optimize_risk_cost_grad(_show_detail=True)
#Show optimized waypoints on matrix #Save x/y waypoints from robot path
sar_paths = np.zeros((gridsize_x,gridsize_y),dtype=float)
robot_paths = []
start_idx = 0 start_idx = 0
robot_idx = 0 robot_idx = 0
save_way = True
for path_len in rgp.robot_path_len: for path_len in rgp.robot_path_len:
end_idx = start_idx + path_len end_idx = start_idx + path_len
rpath = rgp.min_risk_paths[start_idx:end_idx] rpath = rgp.min_risk_paths[start_idx:end_idx]
...@@ -124,30 +122,53 @@ def create_data(): ...@@ -124,30 +122,53 @@ def create_data():
for i in range(0,np.shape(rpath)[0]): for i in range(0,np.shape(rpath)[0]):
x = rpath[i][0] x = rpath[i][0]
y = rpath[i][1] y = rpath[i][1]
sar_paths[x+599][y+599] += 1
waypoints[i][0] = x + params['xlims'][1] waypoints[i][0] = x + params['xlims'][1]
waypoints[i][1] = y + params['ylims'][1] waypoints[i][1] = y + params['ylims'][1]
#Plot path to make sure we're right #Plot path to make sure we're right
plt.scatter(waypoints[:,0], waypoints[:,1]) lbl = 'robot ' + str(robot_idx)
plt.scatter(waypoints[:,0], waypoints[:,1], label=lbl)
plt.xlim((0,1200))
plt.ylim((0,1200))
#save numpy array #save numpy array
title = './deeprl_data/robot' + str(robot_idx) + '_waypoints.npy' if save_way:
np.save(title,waypoints) title = './deeprl_data/robot' + str(robot_idx) + '_waypoints_test3.npy'
np.save(title,waypoints)
#Indices #Indices
start_idx = end_idx start_idx = end_idx
robot_idx += 1 robot_idx += 1
#Show waypoints (should be overhead view) #Show waypoints (should be overhead view)
plt.title('Test Model Optimized Waypoints')
plt.legend()
plt.show() plt.show()
plt.imshow(sar_paths) #Make 3D plot
plt.title('Optimized Path Waypoints') #Save the waypoints from the optimized paths
plt.show() robot_paths_local = waypoint_maker.write_file(rgp_object = rgp, terrain_class = mc.terrain, filename = 'waypointsTest.json') # write waypoints to file
if rgp.params['plot_data']:
plot_all(parameters = params,
mc_object = mc,
robot_paths = robot_paths_local,
searcher_paths = mc.searcher_class.searchers_list,
smooth_paths = True,
show_heatmap = True,
show_contours = True,
cs_name = 'thermal'
)
rgp.garbage_cleanup()
del rgp, planner, mc
def main(): def main():
#Run this function to create data
create_data() create_data()
#Load robot paths from file
#Load robot paths from file
ring_prob = np.load('./deeprl_data/ring_prob.npy')
robot0_waypoints = np.load('./deeprl_data/robot0_waypoints.npy')
robot1_waypoints = np.load('./deeprl_data/robot1_waypoints.npy')
robot2_waypoints = np.load('./deeprl_data/robot2_waypoints.npy')
#Make Gym Environment #Make Gym Environment
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment