Пример #1
0
    def transform_object(self, pose):
        T = roshelper.matrix_from_pose(pose)
        euler = tf.transformations.euler_from_matrix(T.transpose(), 'rxyz')
        #mesh library performs rotatin with DCM rather than R matrix
        trans = tf.transformations.translation_from_matrix(T)
        mesh_new = deepcopy(self.mesh)
        mesh_new.rotate([.5, 0.0,0.0], euler[0])
        mesh_new.rotate([0.0, .5 ,0.0], euler[1])
        mesh_new.rotate([0.0, 0.0, .5], euler[2])
        mesh_new.x += trans[0]
        mesh_new.y += trans[1]
        mesh_new.z += trans[2]
        vertices = list(np.array(deepcopy(self.trimesh.vertices)))
        vertices_transformed = []
        for vertex in vertices:
            point_transformed = helper.vector_transform(T, vertex)
            vertices_transformed.append(point_transformed)

        return mesh_new, vertices_transformed
Пример #2
0
    def eliminate_dual_placements(self):
        for place_id, placement in enumerate(self.stable_placement_list):
            for point_id, point in enumerate(self.projected_points):
                if np.linalg.norm(point - self.projected_points[place_id]) < 0.001 and self.stable_placement_list[place_id] and self.stable_placement_list[point_id] and point_id != place_id:
                    self.stable_placement_list[place_id] = False

        self.stable_placement_dict = {}
        self.stable_placement_dict['face'] = []
        self.stable_placement_dict['id'] = []
        self.stable_placement_dict['vector'] = []
        self.stable_placement_dict['T'] = []
        self.stable_placement_dict['T_rot'] = []
        self.stable_placement_dict['mesh'] = []
        self.stable_placement_dict['convex_face_planar'] = []
        self.stable_placement_dict['convex_face_3d'] = []
        self.stable_placement_dict['normal_face_3d'] = []
        self.stable_placement_dict['convex_face_stable_config'] = []
        self.stable_placement_dict['normal_stable_config'] = []
        self.stable_placement_dict['neighboors'] = []
        self.stable_placement_dict['common_points'] = []
        self.stable_placement_dict['polygon'] = []
        self.stable_placement_dict['sides'] = []
        place_id = 0
        vector_base = np.array([0,0,-1])

        for counter, placement in enumerate(self.stable_placement_list):
            if placement:
                face = counter
                id = place_id
                vector = self.projected_points[counter] - self.centroid
                T_rot = helper.rotation_matrix(vector_base, vector).transpose()
                trans = tf.transformations.translation_from_matrix(T_rot)
                quat  = tf.transformations.quaternion_from_matrix(T_rot)
                pose = roshelper.list2pose_stamped(np.concatenate((trans, quat)))
                mesh_rotated, trimesh_rotated = self.transform_object(pose)
                trans[2] -= mesh_rotated.min_[2]
                T = deepcopy(T_rot)
                T[2,3] = trans[2]
                pose_object = roshelper.list2pose_stamped(np.concatenate((trans, quat)))
                mesh, trimesh_transformed = self.transform_object(pose_object)
                convex_face_planar, convex_face_3d, normal_hull_3d = \
                    self.compute_convex_hulls(self.projected_points[counter],
                                              self.projected_points[counter] - self.centroid)
                polygon = self.define_polygon(convex_face_planar)

                side_list = []
                for counter, vertice in enumerate(polygon.vertices):
                    if counter<len(polygon.vertices)-1:
                        side_list.append([vertice, polygon.vertices[counter+1]])
                    else:
                        side_list.append([vertice, polygon.vertices[0]])

                perimeter_list = []
                for side in side_list:
                    side_dict = {}
                    side_dict['center_b'] = (side[1] + side[0]) / 2
                    side_dict['center_3d_b'] = np.array([side_dict['center_b'][0], side_dict['center_b'][1], 0])
                    side_dict['length'] = np.linalg.norm(side[1] - side[0])
                    axis = (side[1] - side[0]) / side_dict['length']
                    side_dict['contact_x_b'] = np.array([axis[0], axis[1], 0])
                    side_dict['contact_z_b'] = np.array([0,0,-1])
                    side_dict['contact_y_b'] = np.cross(side_dict['contact_z_b'], side_dict['contact_x_b'])
                    if np.dot(side_dict['center_3d_b'], side_dict['contact_y_b']) < 0:
                        side_dict['contact_x_b'] = -np.array([axis[0], axis[1], 0])
                        side_dict['contact_y_b'] = np.cross(side_dict['contact_z_b'], side_dict['contact_x_b'])
                    side_dict['edge_frame_b'] = [side_dict['contact_x_b'],
                                                 side_dict['contact_y_b'],
                                                 side_dict['contact_z_b']]
                    x_vec = (side_dict['center_b'] - polygon.obj_centroid) / (np.linalg.norm(side_dict['center_b'] - polygon.obj_centroid))
                    z_vec = np.array([0,0,1])
                    y_vec = np.cross(z_vec, x_vec)
                    side_dict['contact_frame_b'] = [x_vec, y_vec, z_vec]
                    side_dict['contact_angle'] = float(helper.unwrap([helper.angle_2d(x_vec)- np.pi], 0, 2*np.pi))
                    side_dict['Ccb'] = helper.C3_2d(side_dict['contact_angle'])
                    vertices_rotated_list = []
                    for vertex in list(polygon.vertices):
                        vertices_rotated_list.append(np.matmul(side_dict['Ccb'].transpose(), vertex))
                    polygon_rotated = self.define_polygon(np.array(vertices_rotated_list))
                    side_dict['polygon_rotated'] = polygon_rotated
                    perimeter_list.append(side_dict)
                perimeter_list.sort(key=util.sort_angle)
                self.stable_placement_dict['face'].append(face)
                self.stable_placement_dict['id'].append(id)
                self.stable_placement_dict['vector'].append(vector)
                self.stable_placement_dict['T_rot'].append(T_rot)
                self.stable_placement_dict['T'].append(T)
                self.stable_placement_dict['mesh'].append(mesh)
                self.stable_placement_dict['convex_face_planar'].append(convex_face_planar)
                self.stable_placement_dict['convex_face_3d'].append(convex_face_3d)
                self.stable_placement_dict['normal_face_3d'].append(normal_hull_3d)
                self.stable_placement_dict['polygon'].append(polygon)
                self.stable_placement_dict['sides'].append(perimeter_list)
            place_id += 1
        #~ find neighboors of each stable placements (levering primitive)
        for convex_face_id, convex_face in enumerate(self.stable_placement_dict['convex_face_3d']):
            neighboor_list, common_points_list = self.find_neighboor_faces(convex_face_id, self.stable_placement_dict['convex_face_3d'])
            self.stable_placement_dict['neighboors'].append(neighboor_list)
            self.stable_placement_dict['common_points'].append(common_points_list)
            T = self.stable_placement_dict['T'][convex_face_id]
            T_rot = self.stable_placement_dict['T_rot'][convex_face_id]
            face_rotated_list = []
            normal_rotated_list = []
            for convex_face_id_2, convex_face_2 in enumerate(self.stable_placement_dict['convex_face_3d']):
                face_stable_config = util.transform_point_list(convex_face_2, T)
                normal_stable_config = self.stable_placement_dict['vector'][convex_face_id_2]
                normal_new = helper.vector_transform(T_rot, normal_stable_config / np.linalg.norm(normal_stable_config))
                face_rotated_list.append(face_stable_config)
                normal_rotated_list.append(normal_new)
            self.stable_placement_dict['convex_face_stable_config'].append(face_rotated_list)
            self.stable_placement_dict['normal_stable_config'].append(normal_rotated_list)

        # frank hack: reorder placements such that [0] element is identity orientation
        for counter, T in enumerate(self.stable_placement_dict['T']):
            # frank hack: make sure that nominal placement has identity orientation
            if T[0, 0] == 1 and T[1, 1] == 1 and T[2, 2] == 1:
                nominal_placement = counter
                break

        for key in self.stable_placement_dict.keys():
            first_placement_tmp = self.stable_placement_dict[key][0]
            self.stable_placement_dict[key][0] = self.stable_placement_dict[key][nominal_placement]
            self.stable_placement_dict[key][nominal_placement] = first_placement_tmp
Пример #3
0
    def initialize_stable_placements(self):
        """convert samples taken in nominal pose to all stable placements poses"""
        #samples are expressed in proposals_base
        base_pose = self.sampler.base_initial
        # angle_list = list(np.linspace(np.pi / 4, np.pi / 4 + 2* np.pi, 4))
        angle_list = list(np.linspace(0, 2 * np.pi, 12))
        for placement_id in range(
                len(self.sampler.object.stable_placement_dict['convex_face_3d']
                    )):
            print('generating grasps for placement id: ', placement_id)
            grasp_id = 0
            #1. find transformation to stable placement from base (transformation includes rot + trans)
            T = self.sampler.object.stable_placement_dict['T'][placement_id]
            object_pose = roshelper.pose_from_matrix(T, frame_id="yumi_body")
            #2. rotate all grasp points, normals, grasp_poses
            grasp_id_list_new = []
            grasp_point_list_new = []
            grasp_normal_list_new = []
            grasp_gripper_pose_list_new = []
            grasp_width_list_new = []
            grasp_T_list_new = []
            grasp_T_pose_list_new = []
            grasp_base_pose_list_new = []
            grasp_object_pose_list_new = []
            grasp_collisions_list = []
            grasp_sample_id_list = []

            #iterate over sample points
            for point_list, normal_list, sample_id in zip(
                    self.dict_grasp['points'], self.dict_grasp['face_normals'],
                    self.dict_grasp['sample_ids']):
                point_list_new = []
                normal_list_new = []
                gripper_pose_list_new = []
                T_list_new = []
                T_pose_list_new = []
                for point, normal in zip(point_list, normal_list):
                    point_new = helper.vector_transform(T, point)
                    T_rot = deepcopy(T)
                    T_rot[:, 3] = [0, 0, 0, 1]
                    normal_new = helper.vector_transform(T_rot, normal)
                    point_list_new.append(point_new)
                    normal_list_new.append(normal_new)
                pose_list, grasp_width, T_gripper_body_list, is_flipped = grasp_from_proposal(
                    point_list, normal_list, T,
                    self.sampler.sampling_pose_initial)
                if is_flipped:
                    tmp = normal_list_new[0]
                    normal_list_new[0] = normal_list_new[1]
                    normal_list_new[1] = tmp
                T_list_new.append([T, T])
                T_pose_list_new.append(T_gripper_body_list)
                for angle in angle_list:
                    #publish gripper reference frame
                    # roshelper.handle_block_pose(pose_list[0], self.sampler.planner.br, 'proposals_base', 'gripper_left_blue')
                    # roshelper.handle_block_pose(pose_list[1], self.sampler.planner.br, 'proposals_base', 'gripper_right_blue')
                    #i. convert to gripper frame
                    gripper_left_gripper_left = roshelper.convert_reference_frame(
                        pose_list[0],
                        pose_list[0],
                        roshelper.unit_pose(),
                        frame_id="gripper_left")
                    gripper_right_gripper_left = roshelper.convert_reference_frame(
                        pose_list[1],
                        pose_list[0],
                        roshelper.unit_pose(),
                        frame_id="gripper_left")
                    #ii. rotate grippers by angle about y axis of gripper left frame
                    T_pose_rotation_gripper_left = tfm.euler_matrix(
                        0, angle, 0, 'rxyz')
                    pose_rotation_gripper_left = roshelper.pose_from_matrix(
                        T_pose_rotation_gripper_left, 'gripper_left')
                    gripper_left_rotated_gripper_left = roshelper.transform_pose(
                        gripper_left_gripper_left, pose_rotation_gripper_left)
                    gripper_right_rotated_gripper_left = roshelper.transform_pose(
                        gripper_right_gripper_left, pose_rotation_gripper_left)
                    #iii. convert back to proposals_base
                    gripper_left_rotated_proposals_base = roshelper.convert_reference_frame(
                        gripper_left_rotated_gripper_left,
                        roshelper.unit_pose(),
                        pose_list[0],
                        frame_id="proposals_base")
                    gripper_right_rotated_proposals_base = roshelper.convert_reference_frame(
                        gripper_right_rotated_gripper_left,
                        roshelper.unit_pose(),
                        pose_list[0],
                        frame_id="proposals_base")
                    #3. check collisions between grippers and table
                    gripper_pose_list_new = [
                        gripper_left_rotated_proposals_base,
                        gripper_right_rotated_proposals_base
                    ]
                    collision_list = self.check_collisions(
                        gripper_pose_list_new)
                    grasp_id_list_new.append(placement_id)
                    grasp_point_list_new.append(np.array(point_list_new))
                    grasp_normal_list_new.append(np.array(normal_list_new))
                    grasp_gripper_pose_list_new.append(
                        np.array(gripper_pose_list_new))
                    grasp_width_list_new.append(grasp_width)
                    grasp_T_list_new.append(np.array(T_list_new))
                    grasp_T_pose_list_new.append(np.array(T_pose_list_new))
                    grasp_base_pose_list_new.append(base_pose)
                    grasp_object_pose_list_new.append(object_pose)
                    grasp_collisions_list.append(collision_list)
                    grasp_sample_id_list.append(grasp_id)
                    grasp_id += 1
            self.samples_dict['placement_id'].append(grasp_id_list_new)
            self.samples_dict['points'].append(grasp_point_list_new)
            self.samples_dict['face_normals'].append(grasp_normal_list_new)
            self.samples_dict['gripper_poses'].append(
                grasp_gripper_pose_list_new)
            self.samples_dict['grasp_width'].append(grasp_width_list_new)
            self.samples_dict['T'].append(grasp_T_list_new)
            self.samples_dict['T_pose'].append(grasp_T_pose_list_new)
            self.samples_dict['base_pose'].append(grasp_base_pose_list_new)
            self.samples_dict['object_pose'].append(grasp_object_pose_list_new)
            self.samples_dict['collisions'].append(grasp_collisions_list)
            self.samples_dict['sample_ids'].append(grasp_sample_id_list)