示例#1
0
    def voxelize_point_cloud(self, pts):
        xyz_array = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(pts)
        occluding_xyz_array = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(
            pts)

        if len(xyz_array) != 0:
            self.origin = np.mean(xyz_array, axis=0) - np.array([
                self.scale * 32 - self.voxelgrid_forward_shift,
                self.scale * 32, self.scale * 32
            ])
        vg = conversions.pointcloud_to_voxelgrid(xyz_array,
                                                 scale=self.scale,
                                                 origin=self.origin,
                                                 add_trailing_dim=True,
                                                 add_leading_dim=False)

        occluding_vg = conversions.pointcloud_to_voxelgrid(
            occluding_xyz_array,
            scale=self.scale,
            origin=self.origin,
            add_trailing_dim=True,
            add_leading_dim=False)

        # vg = crop_vg(vg)
        # vg = np.swapaxes(vg, 1,2)
        elem = {'known_occ': vg}
        ko, kf = data_tools.simulate_2_5D_input(vg)
        _, kf = data_tools.simulate_2_5D_input(occluding_vg)

        # if "YCB" in trial:
        # if True:
        # ko, kf = data_tools.simulate_slit_occlusion(ko, kf, x_bounds[0], x_bounds[1])
        # nz = np.nonzero(ko)
        # try:
        #     lb = min(nz[1])
        #     ub = max(nz[1]) - 1
        # except ValueError:
        #     lb = 0
        #     ub = 63
        # kf[:, 0:lb, :, 0] = 0
        # kf[:, ub:, :, 0] = 0

        elem['known_occ'] = ko
        elem['known_free'] = kf
        return elem
示例#2
0
 def test_voxelgrid_to_pointcloud_on_large_data(self):
     d = load_test_files()
     for i, vg_orig in enumerate(d):
         pt_cloud = voxelgrid_to_pointcloud(vg_orig)
         vg_new = pointcloud_to_voxelgrid(pt_cloud,
                                          add_leading_dim=True,
                                          add_trailing_dim=True)
         self.assertTrue((vg_orig == vg_new).all(),
                         "Failed on point cloud {}".format(i))
示例#3
0
 def test_voxelgrid_to_pointcloud_on_simple(self):
     vg_orig = np.zeros([3, 3, 3])
     vg_orig[(1, 2), (0, 2), (1, 0)] = 1.0
     pt_cloud = voxelgrid_to_pointcloud(vg_orig)
     vg_new = pointcloud_to_voxelgrid(pt_cloud,
                                      add_leading_dim=False,
                                      add_trailing_dim=False,
                                      shape=[3, 3, 3])
     self.assertTrue((vg_orig == vg_new).all())
示例#4
0
 def test_voxelgrid_to_pointcloud_with_scaling(self):
     vg_orig = load_test_files()[0]
     for scale in [0.01, 1.0, 10., 10000.]:
         pt_cloud = voxelgrid_to_pointcloud(vg_orig, scale=scale)
         vg_new = pointcloud_to_voxelgrid(pt_cloud,
                                          scale=scale,
                                          add_leading_dim=True,
                                          add_trailing_dim=True,
                                          shape=(64, 64, 64))
         self.assertTrue((vg_orig == vg_new).all(),
                         "Failed on scaling {}".format(scale))
示例#5
0
 def test_voxelgrid_to_pointcloud_with_scaling_on_simple(self):
     vg_orig = np.zeros([3, 3, 3])
     vg_orig[(1, 2), (0, 2), (1, 0)] = 1.0
     for scale in [0.02, 1.0, 10., 10000.]:
         pt_cloud = voxelgrid_to_pointcloud(vg_orig, scale=scale)
         vg_new = pointcloud_to_voxelgrid(pt_cloud,
                                          scale=scale,
                                          add_leading_dim=False,
                                          add_trailing_dim=False,
                                          shape=[3, 3, 3])
         self.assertTrue((vg_orig == vg_new).all())
 def transform_from_gpuvoxels(view, pt_msg: PointCloud2):
     transformed_cloud = view.transform_pts_to_target(pt_msg)
     xyz_array = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(
         transformed_cloud)
     # TODO: visual_conversions produces the wrong result cause the transforms are calculated differently.
     #  Look into this
     vg = conversions.pointcloud_to_voxelgrid(
         xyz_array,
         scale=view.scale,
         origin=view.origin,
         add_trailing_dim=True,
         add_leading_dim=False,
     )
     return vg
示例#7
0
def voxelize_point_cloud(pts):
    xyz_array = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(pts)
    vg = conversions.pointcloud_to_voxelgrid(xyz_array, scale=scale, origin=origin, add_trailing_dim=True,
                                             add_leading_dim=False)
    vg = crop_vg(vg)
    # vg = np.swapaxes(vg, 1,2)
    elem = {'known_occ': vg}
    ko, kf = data_tools.simulate_2_5D_input(vg)

    if "YCB" in trial:
        # ko, kf = data_tools.simulate_slit_occlusion(ko, kf, x_bounds[0], x_bounds[1])
        kf[:, 0:x_bounds[0], :, 0] = 0
        kf[:, x_bounds[1]:, :, 0] = 0

    elem['known_occ'] = ko
    elem['known_free'] = kf
    return elem
def main():
    # cloth setting
    # origin = (-0.5, -0.5, 1.0) # "left most" point
    # scale = 1.0/64.0 # how large the grid is

    #rope setting
    origin = (-0.7, -0.7, 2.0)
    scale = 1.4 / 64.0

    shape = (64, 64, 64)  # how many grids there
    shape_inp = (1, 64, 64, 64, 1)
    rospy.init_node("cdcpd_shape_completion")
    pub_incomp = rospy.Publisher('incomp', VoxelgridStamped, queue_size=1)
    pub_comp = rospy.Publisher('comp', VoxelgridStamped, queue_size=1)
    if not is_online:
        in_rosbag_name = "/home/deformtrack/catkin_ws/src/cdcpd_test_blender/dataset/rope_winding_cylinder_5.bag"
        out_rosbag_name = "/home/deformtrack/catkin_ws/src/cdcpd_test_blender/dataset/rope_winding_cylinder_5_comp.bag"
        read_bagfile(in_rosbag_name)
        mask_list = color_segmentation()
        pc = imgs2pc(rgb_list[0], depth_list[0], camera_info_list[0],
                     mask_list[0])
        voxelgrid = pointcloud_to_voxelgrid(pc,
                                            scale=scale,
                                            origin=origin,
                                            shape=shape)
        known_occ = np.zeros(voxelgrid.shape)
        for x in range(64):
            for y in range(64):
                for z in range(64):
                    if voxelgrid[x, y, z] == 1:
                        known_occ[z, y, x] = 1
        # known_occ = voxelgrid
        voxel_inp = np.zeros(shape_inp)
        free_inp = np.zeros(shape_inp)
        known_free = 1.0 - known_occ
        voxel_inp[0, :, :, :, 0] = known_occ
        free_inp[0, :, :, :, 0] = known_free
        inp = {
            'known_occ': voxel_inp,
            'known_free': free_inp,
        }
        completion = model_runner.model(inp)
        # print("completion vg:")
        comp_np_flip = (completion['predicted_occ'].numpy())[0, :, :, :, 0]
        comp_np_flip[comp_np_flip < 0.5] = 0
        comp_np_flip[comp_np_flip >= 0.5] = 1
        comp_np = np.zeros(comp_np_flip.shape)
        for x in range(64):
            for y in range(64):
                for z in range(64):
                    if comp_np_flip[x, y, z] == 1:
                        comp_np[z, y, x] = 1

        # print(comp_np.shape)
        # print(comp_np.sum())
        # print(comp_np)

        pub_incomp.publish(
            conversions.vox_to_voxelgrid_stamped(
                voxelgrid,  # Numpy or Tensorflow
                scale=scale,  # Each voxel is a 1cm cube
                frame_id='world',  # In frame "world", same as rviz fixed frame
                origin=origin))  # Bottom left corner
        pub_comp.publish(
            conversions.vox_to_voxelgrid_stamped(
                comp_np,  # Numpy or Tensorflow
                scale=scale,  # Each voxel is a 1cm cube
                frame_id='world',  # In frame "world", same as rviz fixed frame
                origin=origin))  # Bottom left corner

        verts, faces, normals, values = measure.marching_cubes_lewiner(
            comp_np, 0)
        verts = verts * scale + origin
        verts_msg = numpy2multiarray(np.transpose(verts))
        faces_msg = numpy2multiarray(np.transpose(faces))
        normals_msg = numpy2multiarray(np.transpose(normals))
        app_msgs = [verts_msg, faces_msg, normals_msg]
        append_bagfile(in_rosbag_name, out_rosbag_name, app_msgs)
        print("completion finished")
    else:
        read_live()