logging.info( "Vehicle voxel data loaded from preexisting file {}".format( vox_veh_file)) valid_litter_found = "litter" in assembly.voxel_data # Does cached geom incl litter? else: logging.info('Commencing voxelization of vehicle model') assembly.voxelate_geometry() # Voxelate Litter_Open model on a grid of same size x_pts, y_pts, z_pts = [ assembly.voxel_data[k] for k in ("x_grid", "y_grid", "z_grid") ] valid_litter_found = assembly.voxelate_litter(x_pts, y_pts, z_pts) data_io.save_multi_array(vox_veh_folder, vox_veh_file, assembly.voxel_data) logging.info("Vehicle successfully voxelated.") # All later operations act on pre-voxelated models. Create voxel objects with redundant info. vehicle = Vehicle(assembly.voxel_data, vehicle_csys=assembly.get_vehicle_csys()) # Find exit points (hatches + where rear doorway and floor intersect) # The door and floor may never intersect at all; instead, use the intersection between the # voxelated arrays, vehicle_interior w/ door. vox_veh_cabin = vehicle.get_vox_from_coord( assembly.get_manikin_positions(datum_name="SWRI_H_POINT", veh_role="troop")[0]) vehicle_interior = vehicle.get_labels(mask_from_voxel=vox_veh_cabin) # Run floor and ceil finding routines to prepare object for later scripts. Finding floor
def main(settings): """ Determine the best pose of the manikin for each position and orientation. """ basename = "{}_{}" # Get one matrix per pose, representing the best possible fit of that pose at a given point # in the vehicle walkability_by_pose_name = {manikin_name: load_fit_of_pose_in_vehicle( basename.format(settings["run_id"], manikin_name), settings) for manikin_name in settings["manikin_poses"]} # TODO: number of best pose may be superfluous. Can probably disable saving this info. best_pose_number_by_point = score_from_list(walkability_by_pose_name, settings["manikin_poses"], settings, score_key='num', orientation="overall") best_score_by_point = score_from_list(walkability_by_pose_name, settings["manikin_poses"], settings, score_key='score', orientation="overall") best_pose_for_orientation = {} best_score_for_orientation = {} for ang in settings["manikin_orientations"]: best_pose_for_orientation[str(ang)] = score_from_list(walkability_by_pose_name, settings["manikin_poses"], settings, score_key='num', orientation=ang) best_score_for_orientation[str(ang)] = score_from_list(walkability_by_pose_name, settings["manikin_poses"], settings, score_key='score', orientation=ang) # Save results result_folder = "results/{}/{}".format(settings["run_id"], settings["voxel_size"]) saved_file_basename = "{}_vox{}_best_scores".format( settings["run_id"], settings["voxel_size"]) save_results(best_score_by_point, result_folder, saved_file_basename, plot=settings["show_2d"], plot_options={"label": "Walkability scores", "tick_labels": sorted([v['score'] for k, v in settings["manikin_poses"].items()])}) saved_file_basename = "{}_vox{}_best_poses".format( settings["run_id"], settings["voxel_size"]) save_results(best_pose_number_by_point, result_folder, saved_file_basename, plot=settings["show_2d"], plot_options={"label": "Best pose at point", "tick_labels": sorted([v['num'] for k, v in settings["manikin_poses"].items()])}) # Also save the best scores per orientation data_io.save_multi_array(result_folder, "{}_vox{}_best_poses_by_orientation".format(settings["run_id"], settings["voxel_size"]), best_pose_for_orientation) data_io.save_multi_array(result_folder, "{}_vox{}_best_scores_by_orientation".format(settings["run_id"], settings["voxel_size"]), best_score_for_orientation) if settings["show_2d"]: # After saving score data to one big npz file, make the individual plots to match for ang in settings["manikin_orientations"]: saved_file_basename = "{}_vox{}_best_scores_ang{}".format(settings["run_id"], settings["voxel_size"], ang) render_results.save_heatmap(result_folder, saved_file_basename, best_score_for_orientation[str(ang)], label="Best score for orientation {}".format(ang), tick_labels=sorted([v['score'] for k, v in settings["manikin_poses"].items()]))
if SETTINGS["debug"] and os.path.exists(os.path.join(vox_veh_folder, vox_veh_file + '.npz')): # Load from pre-existing file if possible (if debugging option is on) assembly.voxel_data = data_io.load_array(vox_veh_folder, vox_veh_file, multi_array=True) logging.info("Vehicle voxel data loaded from preexisting file {}".format(vox_veh_file)) valid_litter_found = "litter" in assembly.voxel_data # Does cached geom incl litter? else: logging.info('Commencing voxelization of vehicle model') assembly.voxelate_geometry() # Voxelate Litter_Open model on a grid of same size x_pts, y_pts, z_pts = [assembly.voxel_data[k] for k in ("x_grid", "y_grid", "z_grid")] valid_litter_found = assembly.voxelate_litter(x_pts, y_pts, z_pts) data_io.save_multi_array(vox_veh_folder, vox_veh_file, assembly.voxel_data) logging.info("Vehicle successfully voxelated.") # All later operations act on pre-voxelated models. Create voxel objects with redundant info. vehicle = Vehicle(assembly.voxel_data, vehicle_csys=assembly.get_vehicle_csys()) # Find exit points (hatches + where rear doorway and floor intersect) # The door and floor may never intersect at all; instead, use the intersection between the # voxelated arrays, vehicle_interior w/ door. vox_veh_cabin = vehicle.get_vox_from_coord( assembly.get_manikin_positions(datum_name="SWRI_H_POINT", veh_role="troop")[0]) vehicle_interior = vehicle.get_labels(mask_from_voxel=vox_veh_cabin) # Run floor and ceil finding routines to prepare object for later scripts. Finding floor # automatically also gets ceiling. vehicle.get_floor(vox_veh_cabin)