Exemplo n.º 1
0
        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()]))
Exemplo n.º 3
0
    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)