def is_collision_and_region_constraints_satisfied(self, target_robot_region1, target_robot_region2,
                                                      target_obj_region):

        target_region_contains = target_robot_region1.contains(self.robot.ComputeAABB()) or \
                                 target_robot_region2.contains(self.robot.ComputeAABB())
        obj = self.robot.GetGrabbed()[0]
        if not target_region_contains:
            return False

        if not target_obj_region.contains(obj.ComputeAABB()):
            return False

        is_object_pose_infeasible = self.env.CheckCollision(obj)
        if is_object_pose_infeasible:
            return False

        is_base_pose_infeasible = self.env.CheckCollision(self.robot)

        if is_base_pose_infeasible:
            return False
        else:
            dof_vals = self.robot.GetDOFValues()
            utils.release_obj()
            utils.fold_arms()
            self.problem_env.set_robot_to_default_dof_values()
            is_base_pose_infeasible = self.env.CheckCollision(self.robot)
            self.robot.SetDOFValues(dof_vals)
            utils.grab_obj(obj)
            if is_base_pose_infeasible:
                return False

        return True
 def apply_pick_constraint(self,
                           obj_name,
                           pick_config,
                           pick_base_pose=None):
     # todo I think this function can be removed?
     obj = self.env.GetKinBody(obj_name)
     if pick_base_pose is not None:
         set_robot_config(pick_base_pose, self.robot)
     self.robot.SetDOFValues(pick_config)
     grab_obj(self.robot, obj)
 def restore(self, state_saver):
     curr_obj = state_saver.curr_obj
     which_operator = state_saver.which_operator
     if not which_operator == 'two_arm_pick':
         grab_obj(self.robot, curr_obj)
     else:
         if len(self.robot.GetGrabbed()) > 0:
             release_obj(self.robot, self.robot.GetGrabbed()[0])
     state_saver.Restore()
     self.robot.SetActiveDOFs([], DOFAffine.X | DOFAffine.Y
                              | DOFAffine.RotationAxis, [0, 0, 1])
 def compute_robot_base_pose_given_object_pose(obj, robot, obj_pose,
                                               T_r_wrt_o):
     original_robot_T = robot.GetTransform()
     release_obj(robot, obj)
     set_obj_xytheta(obj_pose, obj)
     new_T_robot = np.dot(obj.GetTransform(), T_r_wrt_o)
     robot.SetTransform(new_T_robot)
     robot.SetActiveDOFs([],
                         DOFAffine.X | DOFAffine.Y | DOFAffine.RotationAxis,
                         [0, 0, 1])
     robot_xytheta = robot.GetActiveDOFValues()
     grab_obj(robot, obj)
     robot.SetTransform(original_robot_T)
     return robot_xytheta
    def get_objects_in_collision_with_given_op_inst(self, op_inst):
        saver = CustomStateSaver(self.problem_env.env)
        if len(self.problem_env.robot.GetGrabbed()) > 0:
            held = self.problem_env.robot.GetGrabbed()[0]
            release_obj()
        else:
            held = None

        fold_arms()
        new_cols = self.problem_env.get_objs_in_collision(op_inst.low_level_motion, 'entire_region')

        saver.Restore()
        if held is not None:
            grab_obj(held)

        return new_cols
Example #6
0
    def is_swept_volume_cleared(self, obj):
        saver = CustomStateSaver(self.problem_env.env)

        if len(self.problem_env.robot.GetGrabbed()) > 0:
            held = self.problem_env.robot.GetGrabbed()[0]
            release_obj()
        else:
            held = None

        collision_occurred = self.pick_swept_volume.is_collision_in_all_volumes(obj) \
                             or self.place_swept_volume.is_collision_in_all_volumes(obj)

        saver.Restore()
        if held is not None:
            grab_obj(held)

        if collision_occurred:
            return False
        else:
            return True
    def get_placement(self, obj, target_obj_region, T_r_wrt_o):
        original_trans = self.robot.GetTransform()
        original_config = self.robot.GetDOFValues()
        self.robot.SetTransform(original_trans)
        self.robot.SetDOFValues(original_config)

        release_obj(self.robot, obj)
        with self.robot:
            # print target_obj_region
            obj_pose = randomly_place_in_region(
                self.env, obj, target_obj_region)  # randomly place obj
            obj_pose = obj_pose.squeeze()

            # compute the resulting robot transform
            new_T_robot = np.dot(obj.GetTransform(), T_r_wrt_o)
            self.robot.SetTransform(new_T_robot)
            self.robot.SetActiveDOFs([], DOFAffine.X | DOFAffine.Y
                                     | DOFAffine.RotationAxis, [0, 0, 1])
            robot_xytheta = self.robot.GetActiveDOFValues()
            set_robot_config(robot_xytheta, self.robot)
            grab_obj(self.robot, obj)
        return obj_pose, robot_xytheta
    def check_feasibility(self, operator_skeleton, place_parameters, swept_volume_to_avoid=None):
        obj = self.robot.GetGrabbed()[0]
        obj_original_pose = obj.GetTransform()
        obj_pose = place_parameters

        robot_original_xytheta = get_body_xytheta(self.robot)
        robot_original_config = self.robot.GetDOFValues()
        grasp_params = operator_skeleton.continuous_parameters['grasp_params']

        obj_region = operator_skeleton.discrete_parameters['region']
        if type(obj_region) == str:
            obj_region = self.problem_env.regions[obj_region]
        target_robot_region = self.problem_env.regions['home_region']
        target_obj_region = obj_region

        new_base_pose = self.place_object_and_robot_at_new_pose(obj, obj_pose, obj_region)

        is_object_pose_infeasible = self.env.CheckCollision(obj) or \
                                    (not target_obj_region.contains(obj.ComputeAABB()))

        if not is_object_pose_infeasible:
            if swept_volume_to_avoid is not None:
                is_object_pose_infeasible = not swept_volume_to_avoid.is_swept_volume_cleared(obj)

        if is_object_pose_infeasible:
            action = {'operator_name': 'one_arm_place', 'q_goal': None, 'base_pose': None, 'object_pose': None,
                      'action_parameters': obj_pose, 'grasp_params': grasp_params}
            set_robot_config(robot_original_xytheta)
            self.robot.SetDOFValues(robot_original_config)
            obj.SetTransform(obj_original_pose)
            grab_obj(obj)
            return action, 'InfeasibleBase'

        is_base_pose_infeasible = self.env.CheckCollision(self.robot) or \
                                  (not target_robot_region.contains(self.robot.ComputeAABB()))
        if is_base_pose_infeasible:
            for i in range(3):
                obj_pose[-1] += 90 * np.pi / 180.0
                new_base_pose = self.place_object_and_robot_at_new_pose(obj, obj_pose, obj_region)
                # is_object_pose_infeasible = self.env.CheckCollision(obj) or \
                #                            (not target_obj_region.contains(obj.ComputeAABB()))
                is_base_pose_infeasible = self.env.CheckCollision(self.robot) or \
                                          (not target_robot_region.contains(self.robot.ComputeAABB()))
                if not (is_base_pose_infeasible or is_object_pose_infeasible):
                    break

        if is_base_pose_infeasible or is_object_pose_infeasible:
            action = {'operator_name': 'one_arm_place', 'q_goal': None, 'base_pose': None, 'object_pose': None,
                      'action_parameters': obj_pose, 'grasp_params': grasp_params}
            set_robot_config(robot_original_xytheta)
            self.robot.SetDOFValues(robot_original_config)
            obj.SetTransform(obj_original_pose)
            grab_obj(obj)
            return action, 'InfeasibleBase'

        grasp_config = self.solve_ik_from_grasp_params(obj, grasp_params)

        #self.problem_env.enable_objects_in_region('entire_region')
        #[o.Enable(True) for o in self.problem_env.boxes]

        if grasp_config is None:
            action = {'operator_name': 'one_arm_place', 'base_pose': None, 'object_pose': None,
                      'q_goal': None, 'action_parameters': obj_pose, 'g_config': grasp_config,
                      'grasp_params': grasp_params}
            set_robot_config(robot_original_xytheta)
            self.robot.SetDOFValues(robot_original_config)
            obj.SetTransform(obj_original_pose)
            grab_obj(obj)
            return action, 'InfeasibleIK'
        else:
            grasp_config = grasp_config.squeeze()
            new_base_pose = new_base_pose.squeeze()
            action = {'operator_name': 'one_arm_place', 'q_goal': np.hstack([grasp_config, new_base_pose]),
                      'base_pose': new_base_pose, 'object_pose': place_parameters,
                      'action_parameters': obj_pose, 'g_config': grasp_config, 'grasp_params': grasp_params}
            set_robot_config(robot_original_xytheta)
            self.robot.SetDOFValues(robot_original_config)
            obj.SetTransform(obj_original_pose)
            grab_obj(obj)
            return action, 'HasSolution'
    def check_feasibility(self,
                          operator_skeleton,
                          place_parameters,
                          swept_volume_to_avoid=None):
        # Note:
        #    this function checks if the target region contains the robot when we place object at place_parameters
        #    and whether the robot will be in collision
        obj = self.robot.GetGrabbed()[0]
        obj_region = operator_skeleton.discrete_parameters['region']
        if type(obj_region) == str:
            obj_region = self.problem_env.regions[obj_region]
        obj_pose = place_parameters

        T_r_wrt_o = np.dot(np.linalg.inv(obj.GetTransform()),
                           self.robot.GetTransform())
        original_trans = self.robot.GetTransform()
        original_obj_trans = obj.GetTransform()

        target_robot_region1 = self.problem_env.regions['home_region']
        target_robot_region2 = self.problem_env.regions['loading_region']
        target_obj_region = obj_region  # for fetching, you want to move it around

        robot_xytheta = self.compute_robot_base_pose_given_object_pose(
            obj, self.robot, obj_pose, T_r_wrt_o)
        set_robot_config(robot_xytheta, self.robot)

        # why do I disable objects in region? Most likely this is for minimum constraint computation
        #self.problem_env.disable_objects_in_region('entire_region')
        target_region_contains = target_robot_region1.contains(self.robot.ComputeAABB()) or \
                                 target_robot_region2.contains(self.robot.ComputeAABB())
        is_base_pose_infeasible = self.env.CheckCollision(self.robot) or \
                                  (not target_region_contains)
        is_object_pose_infeasible = self.env.CheckCollision(obj) or \
                                    (not target_obj_region.contains(obj.ComputeAABB()))
        #self.problem_env.enable_objects_in_region('entire_region')

        if is_base_pose_infeasible or is_object_pose_infeasible:
            action = {
                'operator_name': 'two_arm_place',
                'base_pose': None,
                'object_pose': None,
                'action_parameters': place_parameters
            }
            self.robot.SetTransform(original_trans)
            obj.SetTransform(original_obj_trans)
            return action, 'NoSolution'
        else:
            release_obj(self.robot, obj)
            if swept_volume_to_avoid is not None:
                # release the object
                if not swept_volume_to_avoid.is_swept_volume_cleared(obj):
                    self.robot.SetTransform(original_trans)
                    obj.SetTransform(original_obj_trans)
                    grab_obj(self.robot, obj)
                    action = {
                        'operator_name': 'two_arm_place',
                        'base_pose': None,
                        'object_pose': None,
                        'action_parameters': place_parameters
                    }
                    return action, 'NoSolution'
                """
                for config in swept_volume_to_avoid:
                    set_robot_config(config, self.robot)
                    if self.env.CheckCollision(self.robot, obj):
                        self.robot.SetTransform(original_trans)
                        obj.SetTransform(original_obj_trans)
                        grab_obj(self.robot, obj)
                        action = {'operator_name': 'two_arm_place', 'base_pose': None, 'object_pose': None,
                                  'action_parameters': place_parameters}
                        return action, 'NoSolution'
                """

            self.robot.SetTransform(original_trans)
            obj.SetTransform(original_obj_trans)
            grab_obj(self.robot, obj)
            action = {
                'operator_name': 'two_arm_place',
                'base_pose': robot_xytheta,
                'object_pose': obj_pose,
                'action_parameters': place_parameters
            }
            return action, 'HasSolution'