예제 #1
0
    def __get_grasp(self, name):
        try:
            open_state = self.__get_state(name + "_open", "").state
            closed_state = self.__get_state(name + "_closed", "").state
        except Exception:
            rospy.logfatal("Couldn't get grasp pose from db.")
            return Grasp()

        try:
            self.__group.set_start_state_to_current_state()
            pre_pose = self.__group.plan(open_state.joint_state)
            self.__group.set_start_state(open_state)
            pose = self.__group.plan(closed_state.joint_state)
        except Exception:
            rospy.logfatal("Couldn't plan grasp trajectories.")
            return Grasp()

        grasp = Grasp()
        grasp.id = name
        grasp.pre_grasp_posture = pre_pose.joint_trajectory
        grasp.grasp_posture = pose.joint_trajectory

        grasp.pre_grasp_approach.desired_distance = 0.2
        grasp.pre_grasp_approach.min_distance = 0.1
        grasp.pre_grasp_approach.direction.vector.x = 0
        grasp.pre_grasp_approach.direction.vector.y = -1
        grasp.pre_grasp_approach.direction.vector.z = 0

        return grasp
예제 #2
0
    def make_grasps(self, initial_pose_stamped, allowed_touch_objects):
        # Initialize the grasp object
        g = Grasp()

        # Set the pre-grasp and grasp postures appropriately
        g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)
        g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)

        # Set the approach and retreat parameters as desired
        g.pre_grasp_approach = self.make_gripper_translation(0.01, 0.2, [0.0, 1.0, 0.0])
        g.post_grasp_retreat = self.make_gripper_translation(0.1, 0.2, [0.0, 0.0, 1.0])

        # Set the first grasp pose to the input pose
        g.grasp_pose = initial_pose_stamped

        # Pitch angles to try
        pitch_vals = [0, 0.1, -0.1, 0.2, -0.2, 0.3, -0.3]

        # Yaw angles to try
        yaw_vals = [0]

        # A list to hold the grasps
        grasps = []

        # Generate a grasp for each pitch and yaw angle
        for y in yaw_vals:
            for p in pitch_vals:
예제 #3
0
    def graspObj(self, x, y, z, phi, theta, psi):
        grasps = []
        g = Grasp()
        g.id = "test"
        grasp_pose = PoseStamped()
        grasp_pose.header.frame_id = "base_footprint"

        orientation_tuple = tf.transformations.quaternion_from_euler(
            phi, theta, psi)

        grasp_pose.orientation.x = orientation_tuple[0]
        grasp_pose.orientation.y = orientation_tuple[1]
        grasp_pose.orientation.z = orientation_tuple[2]
        grasp_pose.orientation.w = orientation_tuple[3]

        grasp_pose.position.x = x
        grasp_pose.position.y = y
        grasp_pose.position.z = z

        self.group.set_pose_target(grasp_pose)
        self.group.go()
        rospy.sleep(2)
        # set the grasp pose
        g.grasp_pose = grasp_pose
        self.group.pick("unit_box", g)
예제 #4
0
    def make_grasps(self, initial_pose_stamped, allowed_touch_objects, grasp_opening=[0]):
        # Initialize the grasp object
        g = Grasp()

        # Set the pre-grasp and grasp postures appropriately;
        # grasp_opening should be a bit smaller than target width
        g.pre_grasp_posture = self.make_gripper_posture(self.gripper_opened)
        g.grasp_posture = self.make_gripper_posture(grasp_opening)

        # Set the approach and retreat parameters as desired
        g.pre_grasp_approach = self.make_gripper_translation(0.01, 0.1, [1.0, 0.0, 0.0])
        g.post_grasp_retreat = self.make_gripper_translation(0.1, 0.15, [0.0, -1.0, 1.0])

        # Set the first grasp pose to the input pose
        g.grasp_pose = initial_pose_stamped

        # Pitch angles to try
        pitch_vals = [0, 0.1, -0.1, 0.2, -0.2, 0.4, -0.4]

        # Yaw angles to try; given the limited dofs of turtlebot_arm, we must calculate the heading
        # from arm base to the object to pick (first we must transform its pose to arm base frame)
        target_pose_arm_ref = self.tf_listener.transformPose(ARM_BASE_FRAME, initial_pose_stamped)
        x = target_pose_arm_ref.pose.position.x
        y = target_pose_arm_ref.pose.position.y

        self.pick_yaw = atan2(y, x)   # check in make_places method why we store the calculated yaw
        yaw_vals = [self.pick_yaw]

        # A list to hold the grasps
        grasps = []

        # Generate a grasp for each pitch and yaw angle
        for yaw in yaw_vals:
            for pitch in pitch_vals:
                # Create a quaternion from the Euler angles
                q = quaternion_from_euler(0, pitch, yaw)

                # Set the grasp pose orientation accordinglytb_return_pose.launch
                g.grasp_pose.pose.orientation.x = q[0]
                g.grasp_pose.pose.orientation.y = q[1]
                g.grasp_pose.pose.orientation.z = q[2]
                g.grasp_pose.pose.orientation.w = q[3]

                # Set and id for this grasp (simply needs to be unique)
                g.id = str(len(grasps))

                # Set the allowed touch objects to the input list
                g.allowed_touch_objects = allowed_touch_objects

                # Don't restrict contact force
                g.max_contact_force = 0

                # Degrade grasp quality for increasing pitch angles
                g.grasp_quality = 1.0 - abs(pitch)

                # Append the grasp to the list
                grasps.append(deepcopy(g))

        # Return the list
        return grasps
예제 #5
0
def pick(robot):
    # Construct the grasp
    p = PoseStamped()
    p.header.frame_id = robot.get_planning_frame()
    p.pose.position.x = 0.34
    p.pose.position.y = -0.7
    p.pose.position.z = 0.5
    p.pose.orientation.w = 1.0
    g = Grasp()
    g.grasp_pose = p

    # Construct pre-grasp
    g.pre_grasp_approach.direction.vector.x = 1.0
    g.pre_grasp_approach.direction.header.frame_id = "r_wrist_roll_link"
    g.pre_grasp_approach.min_distance = 0.2
    g.pre_grasp_approach.desired_distance = 0.4

    # Construct post-grasp
    g.post_grasp_retreat.direction.header.frame_id = robot.get_planning_frame()
    g.post_grasp_retreat.direction.vector.z = 1.0
    g.post_grasp_retreat.min_distance = 0.1
    g.post_grasp_retreat.desired_distance = 0.25

    g.pre_grasp_posture = open_gripper(g.pre_grasp_posture)
    g.grasp_posture = closed_gripper(g.grasp_posture)

    grasps = []
    grasps.append(g)

    group = robot.get_group("right_arm")
    group.set_support_surface_name("table")

    group.pick("part", grasps)
def publish_poses_grasps(grasps):
    rospy.loginfo("Publishing PoseArray on /grasp_pose_from_block_bla for grasp_pose")
    grasp_publisher = rospy.Publisher("grasp_pose_from_block_bla", PoseArray)
    graspmsg = Grasp()
    grasp_PA = PoseArray()
    header = Header()
    header.frame_id = "base_link"
    header.stamp = rospy.Time.now()
    grasp_PA.header = header
    for graspmsg in grasps:
        print graspmsg
        print type(graspmsg)
        p = Pose(graspmsg.grasp_pose.pose.position, graspmsg.grasp_pose.pose.orientation)
        grasp_PA.poses.append(p)
    grasp_publisher.publish(grasp_PA)
    rospy.loginfo("Press a to continue...")
    while True:
        choice = raw_input("> ")
    
        if choice == 'a' :
            print "Continuing, a pressed"
            break
        else:
            grasp_publisher.publish(grasp_PA)
            rospy.sleep(0.1)
예제 #7
0
def pickup(pickPlaceInterface, frame, graspPose_xyzrpy, objectName, supportName):
    moveit_grasp = Grasp()
    moveit_grasp.grasp_pose.header.frame_id = frame
    moveit_grasp.grasp_pose.pose.orientation = geometry_msgs.msg.Quaternion(
        *transformations.quaternion_from_euler(*graspPose_xyzrpy[3:])
    )
    moveit_grasp.grasp_pose.pose.position.x = graspPose_xyzrpy[0]
    moveit_grasp.grasp_pose.pose.position.y = graspPose_xyzrpy[1]
    moveit_grasp.grasp_pose.pose.position.z = graspPose_xyzrpy[2]

    moveit_grasp.pre_grasp_approach.direction.header.frame_id = frame
    moveit_grasp.pre_grasp_approach.direction.vector.x = 1.0
    moveit_grasp.pre_grasp_approach.min_distance = 0.04
    moveit_grasp.pre_grasp_approach.desired_distance = 0.08

    moveit_grasp.post_grasp_retreat.direction.header.frame_id = frame
    moveit_grasp.post_grasp_retreat.direction.vector.z = 1.0
    moveit_grasp.post_grasp_retreat.min_distance = 0.1
    moveit_grasp.post_grasp_retreat.desired_distance = 0.25

    openGripper(moveit_grasp.pre_grasp_posture)
    closeGripper(moveit_grasp.grasp_posture)

    for i in range(10):
        res = pickPlaceInterface.pickup(objectName, [moveit_grasp,], support_name=supportName)
        # print("{}: {}".format(i, res.error_code.val))
        if res.error_code.val == 1:
            return True
    return False
    def get_grasp(self, grasp_pose, id):
        grasp = Grasp()
        grasp.grasp_pose = grasp_pose
        grasp.grasp_pose.header.frame_id = self.frame_id
        joint_name = self.gripper + '_gripper_l_finger_joint'

        point = JointTrajectoryPoint()
        point.positions.append(0.095)
        grasp.pre_grasp_posture.joint_names.append(joint_name)
        grasp.pre_grasp_posture.points.append(point)

        point = JointTrajectoryPoint()
        point.positions.append(-0.0125)
        grasp.grasp_posture.joint_names.append(joint_name)

        grasp.grasp_posture.points.append(point)
        grasp.grasp_quality = 1.0
        grasp.id = str(id)

        grasp.post_place_retreat.desired_distance = 0.3
        grasp.post_place_retreat.min_distance = 0.05
        grasp.post_place_retreat.direction.header.frame_id = 'world'
        grasp.post_place_retreat.direction.vector.z = 1.0

        grasp.pre_grasp_approach.desired_distance = 0.3
        grasp.pre_grasp_approach.min_distance = 0.05
        grasp.pre_grasp_approach.direction.header.frame_id = self.gripper + "_gripper"
        grasp.pre_grasp_approach.direction.vector.y = 1.0

        grasp.post_grasp_retreat = grasp.post_place_retreat
        return grasp
def createGrasp(grasp_pose, allowed_touch_objects=[], pre_grasp_posture=None, grasp_posture=None, pre_grasp_approach=None, post_grasp_retreat=None, id_grasp="grasp_"):
    """Create a grasp for object in grasp_pose, allowing collisions with allowed_touch_objects list,
     with pre_grasp_posture and grasp_posture as positions of the hand. Also id name id_grasp."""
    grasp = Grasp()
    grasp.id = id_grasp
#     header = Header()
#     header.frame_id = "base_link"
#     header.stamp = rospy.Time.now()
#     grasp_pose_msg = PoseStamped(header, grasp_pose)
    grasp_pose_with_offset = add_offset_reem_hand(grasp_pose)
    grasp.grasp_pose = grasp_pose_with_offset
    
    if pre_grasp_posture == None:
        grasp.pre_grasp_posture = getPreGraspPosture
    else:
        grasp.pre_grasp_posture = pre_grasp_posture
    
    if grasp_posture == None:
        grasp.grasp_posture = getGraspPosture
    else:
        grasp.grasp_posture = grasp_posture
        
    grasp.allowed_touch_objects = allowed_touch_objects # ["table", "part"]
        
    if pre_grasp_approach != None:
        grasp.pre_grasp_approach = pre_grasp_approach
        
    if post_grasp_retreat != None:
        grasp.post_grasp_retreat = post_grasp_retreat


    grasp.max_contact_force = 0
    #grasp.grasp_quality = 0
    
    return grasp
예제 #10
0
    def make_grasps(self, pose_stamped, mega_angle=False):
        # setup defaults of grasp
        g = Grasp()
        g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)
        g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)
        g.pre_grasp_approach = self.make_gripper_translation(0.1, 0.15)
        g.post_grasp_retreat = self.make_gripper_translation(0.1, 0.15, -1.0)
        g.grasp_pose = pose_stamped

        pitch_vals = [0, 0.2, -0.2, 0.4, -0.4]
        if mega_angle:
            pitch_vals += [0.3, -0.3, 0.5, -0.5, 0.6, -0.6]

        # generate list of grasps
        grasps = []
        for y in [-1.57, -0.78, 0, 0.78, 1.57]:
            for p in pitch_vals:
                q = quaternion_from_euler(0, 1.57 - p, y)
                g.grasp_pose.pose.orientation.x = q[0]
                g.grasp_pose.pose.orientation.y = q[1]
                g.grasp_pose.pose.orientation.z = q[2]
                g.grasp_pose.pose.orientation.w = q[3]
                g.id = str(len(grasps))
                g.grasp_quality = 1.0 - abs(p / 2.0)
                grasps.append(copy.deepcopy(g))
        return grasps
    def make_grasps(self, initial_pose_stamped, allowed_touch_objects):
        # 初始化抓取姿态对象
        g = Grasp()

        # 创建夹爪张开、闭合的姿态
        g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)
        g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)

        # 设置期望的夹爪靠近、撤离目标的参数
        # g.pre_grasp_approach = self.make_gripper_translation(0.01, 0.05, [1.0, 0.0, 0.0])
        g.post_grasp_retreat = self.make_gripper_translation(
            0.01, 0.06, [0.0, 0.0, 1.0])
        g.pre_grasp_approach = self.make_gripper_translation(
            0.02, 0.05, self.direction_z)

        # 设置抓取姿态
        g.grasp_pose = initial_pose_stamped

        # 抓取姿态的列表
        grasps = []

        # 设置抓取的唯一id号
        g.id = str(len(grasps))

        # 设置允许接触的物体
        g.allowed_touch_objects = allowed_touch_objects

        # 将本次规划的抓取放入抓取列表中
        grasps.append(deepcopy(g))

        # 返回抓取列表
        return grasps
예제 #12
0
    def _create_grasp(self, x, y, z, roll, pitch, yaw):
        grasp = Grasp()

        # pre_grasp
        grasp.pre_grasp_posture = self._open_gripper()
        grasp.pre_grasp_approach.direction.header.frame_id = self.end_effector_link
        grasp.pre_grasp_approach.direction.vector.z = 1.0
        grasp.pre_grasp_approach.direction.vector.y = 0.0
        grasp.pre_grasp_approach.direction.vector.x = 0.0
        grasp.pre_grasp_approach.min_distance = 0.05
        grasp.pre_grasp_approach.desired_distance = 0.1

        # grasp
        grasp.grasp_posture = self._close_gripper()
        grasp.grasp_pose.pose.position.x = x
        grasp.grasp_pose.pose.position.y = y
        grasp.grasp_pose.pose.position.z = z
        q = quaternion_from_euler(roll, pitch, yaw)
        grasp.grasp_pose.pose.orientation.x = q[0]
        grasp.grasp_pose.pose.orientation.y = q[1]
        grasp.grasp_pose.pose.orientation.z = q[2]
        grasp.grasp_pose.pose.orientation.w = q[3]
        grasp.grasp_pose.header.frame_id = "m1n6s200_link_base"

        # post_grasp
        grasp.post_grasp_retreat.direction.header.frame_id = self.end_effector_link
        grasp.post_grasp_retreat.direction.vector.z = -1.0
        grasp.post_grasp_retreat.direction.vector.x = 0.0
        grasp.post_grasp_retreat.direction.vector.y = 0.0
        grasp.post_grasp_retreat.min_distance = 0.05
        grasp.post_grasp_retreat.desired_distance = 0.25

        return [grasp]
예제 #13
0
    def _pick_box(self):
        # Construct the grasp
        p = PoseStamped()
        p.header.frame_id = self.robot.get_planning_frame()
        # TODO: Clean this
        p.pose.position.x = self.box_x
        p.pose.position.y = self.box_y
        p.pose.position.z = self.box_z  # old value = 0.85
        p.pose.orientation.w = 1.0
        g = Grasp()
        g.grasp_pose = p

        # Construct pre-grasp
        g.pre_grasp_approach.direction.vector.x = 1.0
        g.pre_grasp_approach.direction.header.frame_id = "l_wrist_roll_link"
        g.pre_grasp_approach.min_distance = 0.2
        g.pre_grasp_approach.desired_distance = 0.4

        g.pre_grasp_posture = self._open_gripper(g.pre_grasp_posture)
        g.grasp_posture = self._closed_gripper(g.grasp_posture)

        grasps = []
        grasps.append(g)

        self.group.set_support_surface_name("table")
        self.group.set_planner_id("RRTkConfigDefault")

        print("EXECUTING PICK")
        self.group.pick("box", grasps)
        rospy.sleep(3)
        return True
예제 #14
0
  def make_grasps(self, pose_stamped, mega_angle=False):
      # setup defaults for the grasp
      g = Grasp()
      g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)
      g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)
      g.pre_grasp_approach = self.make_gripper_translation(0.05, 0.1)
      g.post_grasp_retreat = self.make_gripper_translation(0.05, 0.1, -1.0)
      g.grasp_pose = pose_stamped
 
      pitch_vals = [0,0.4, 0.9, 1.2, 1.57, 1.8, 2.2, 2.8, 3.14]
      #pitch_vals = [0]
     
      yaw_vals = [-0.2, -0.1, 0, 0.1, 0.2]
      #yaw_vals = [0]
     
      if mega_angle:
          pitch_vals += [1.57, -1.57, 0.3, -0.3, 0.5, -0.5, 0.6, -0.6]
 
      # generate list of grasps
      grasps = []
      #for y in [-1.57, -0.78, 0, 0.78, 1.57]:
      for y in yaw_vals:
          for p in pitch_vals:
              q = quaternion_from_euler(0, 1.57-p, y)
              g.grasp_pose.pose.orientation.x = q[0]
              g.grasp_pose.pose.orientation.y = q[1]
              g.grasp_pose.pose.orientation.z = q[2]
              g.grasp_pose.pose.orientation.w = q[3]
              g.id = str(len(grasps))
              g.allowed_touch_objects = ["part"]
              g.max_contact_force = 0
              #g.grasp_quality = 1.0 - abs(p/2.0)
              grasps.append(copy.deepcopy(g))
      return grasps
예제 #15
0
def make_grasp(arm,
               gripper,
               eef_grasp_pose,
               approach_distance=0.2,
               lift_distance=0.2):
    """Initialize the moveit_msgs/Grasp message.

    Arguments:
        arm {MoveGroupCommander} -- arm group
        gripper {MoveGroupCommander} -- gripper group
        eef_grasp_pose {PoseStamped} -- pose of the end effector in which it should attempt grasping

    Keyword Arguments:
        approach_distance {float} -- distance from which to approach the object (default: {0.2})
        lift_distance {float} -- distance to take after a grasp has been completed (default: {0.2})

    Returns:
        Grasp -- message
    """
    return Grasp(
        id='grasp',
        grasp_quality=1.0,
        grasp_pose=eef_grasp_pose,
        pre_grasp_posture=_make_posture(
            gripper.get_named_target_values('open')),
        grasp_posture=_make_posture(gripper.get_named_target_values('close')),
        pre_grasp_approach=_make_gripper_translation(
            arm.get_end_effector_link(), [0, 0, 1], approach_distance),
        post_grasp_retreat=_make_gripper_translation(arm.get_planning_frame(),
                                                     [0, 0, 1], lift_distance),
        post_place_retreat=_make_gripper_translation(
            arm.get_end_effector_link(), [0, 0, -1], approach_distance),
        max_contact_force=10.0,
        allowed_touch_objects=[])
예제 #16
0
def create_grasp(grasp_pose,
                 allowed_touch_objects=[],
                 pre_grasp_posture=None,
                 grasp_posture=None,
                 pre_grasp_approach=None,
                 post_grasp_retreat=None,
                 id_grasp="grasp_"):
    grasp = Grasp()
    grasp.id = id_grasp
    grasp.grasp_pose = grasp_pose
    if pre_grasp_posture is None:
        grasp.pre_grasp_posture = get_grasp_posture(True)
    else:
        grasp.pre_grasp_posture = pre_grasp_posture

    if grasp_posture is None:
        grasp.grasp_posture = get_grasp_posture(False)
    else:
        grasp.grasp_posture = grasp_posture

    grasp.allowed_touch_objects = allowed_touch_objects

    if pre_grasp_approach is not None:
        grasp.pre_grasp_approach = pre_grasp_approach

    if post_grasp_retreat is not None:
        grasp.post_grasp_retreat = post_grasp_retreat

    grasp.max_contact_force = 0

    return grasp
예제 #17
0
    def __init__(self):
        self.scene = PlanningSceneInterface("base_link")
        self.pickplace = PickPlaceInterface("arm", "gripper", verbose=True)
        self.move_group = MoveGroupInterface("arm", "base_link")

        grasp_topic = "fetch_grasp_planner_node/plan"
        rospy.loginfo("Waiting for %s..." % grasp_topic)
        self.grasp_planner_client = actionlib.SimpleActionClient(
            grasp_topic, GraspPlanningAction)
        wait = self.grasp_planner_client.wait_for_server(rospy.Duration(5))
        if (wait):
            print("successfully connected to grasp server")
        else:
            print("failed to connect to grasp server")

        rospy.Subscriber("fetch_fruit_harvest/apple_pose", Pose,
                         self.apple_pose_callback)
        self.pub = rospy.Publisher("fetch_fruit_harvest/grasp_msg",
                                   String,
                                   queue_size=10)
        self.object = Object()
        self.grasps = Grasp()
        self.ready_for_grasp = False
        self.pick_place_finished = False
        self.first_time_grasp = True
        self.scene.addBox("ground", 300, 300, 0.02, 0, 0, 0)
        self.tuck()
def pick(move_group):
    """Pick object.

    Parameters
    ----------
    Group : moveit_commander.RobotCommander
                    Moveit_commander move group.
    """

    ## - BEGIN_SUB_TUTORIAL pick1 - ##
    ## Create a vector of grasps to be attempted, currently only creating single grasp. ##
    # This is essentially useful when using a grasp generator to generate and test multiple grasps.
    grasps = [Grasp() for i in range(1)]

    ## Setting grasp pose ##
    # This is the pose of panda_link8. |br|
    # From panda_link8 to the palm of the eef the distance is 0.058, the cube starts 0.01 before 5.0 (half of the length
    # of the cube). |br|
    # Therefore, the position for panda_link8 = 5 - (length of cube/2 - distance b/w panda_link8 and palm of eef - some
    # extra padding)
    grasps[0].grasp_pose.header.frame_id = "panda_link0"
    orientation = quaternion_from_euler(-math.pi / 2, -math.pi / 4,
                                        -math.pi / 2)
    grasps[0].grasp_pose.pose.orientation.x = orientation[0]
    grasps[0].grasp_pose.pose.orientation.y = orientation[1]
    grasps[0].grasp_pose.pose.orientation.z = orientation[2]
    grasps[0].grasp_pose.pose.orientation.w = orientation[3]
    grasps[0].grasp_pose.pose.position.x = 0.415
    grasps[0].grasp_pose.pose.position.y = 0
    grasps[0].grasp_pose.pose.position.z = 0.5

    ## Setting pre-grasp approach ##
    # Defined with respect to frame_id
    grasps[0].pre_grasp_approach.direction.header.frame_id = "panda_link0"
    # Direction is set as positive x axis
    grasps[0].pre_grasp_approach.direction.vector.x = 1.0
    grasps[0].pre_grasp_approach.min_distance = 0.095
    grasps[0].pre_grasp_approach.desired_distance = 0.115

    ## Setting post-grasp retreat ##
    # Defined with respect to frame_id
    grasps[0].post_grasp_retreat.direction.header.frame_id = "panda_link0"
    # Direction is set as positive z axis
    grasps[0].post_grasp_retreat.direction.vector.z = 1.0
    grasps[0].post_grasp_retreat.min_distance = 0.1
    grasps[0].post_grasp_retreat.desired_distance = 0.25

    ## Setting posture of eef before grasp ##
    openGripper(grasps[0].pre_grasp_posture)
    ## - END_SUB_TUTORIAL - ##

    ## - BEGIN_SUB_TUTORIAL pick2 - ##
    ## Setting posture of eef during grasp ##
    closedGripper(grasps[0].grasp_posture)

    ## Set support surface as table1. ##
    move_group.set_support_surface_name("table1")

    # Call pick to pick up the object using the grasps given
    move_group.pick("object", grasps)
예제 #19
0
    def make_grasps(self, initial_pose_stamped, allowed_touch_objects):
        # Initialize the grasp object
        g = Grasp()
        
        # Set the pre-grasp and grasp postures appropriately
        g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)
        g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)
                
        # Set the approach and retreat parameters as desired
        g.pre_grasp_approach = self.make_gripper_translation(0.01, 0.065, [1.0, 0.0, 0.0])
        g.post_grasp_retreat = self.make_gripper_translation(0.01, 0.1, [0.0, 0.0, 1.0])
        
        # Set the first grasp pose to the input pose
        g.grasp_pose = initial_pose_stamped
    
        # Pitch angles to try
        pitch_vals = [0, 0.1, -0.1, 0.2, -0.2, 0.3, -0.3]
        
        # Yaw angles to try
        yaw_vals = [-1.57]

        # A list to hold the grasps
        grasps = []

        # Generate a grasp for each pitch and yaw angle
        for y in yaw_vals:
            # for p in pitch_vals:
            for i in range(0,3):
                p = (float)(i / 1000.0)
                print("pitch", p)
                # Create a quaternion from the Euler angles
                q = quaternion_from_euler(-1.57, p, y)
                # q = quaternion_from_euler(-1.5708, p, y)
                
                # Set the grasp pose orientation accordingly
                g.grasp_pose.pose.orientation.x = q[0]
                g.grasp_pose.pose.orientation.y = q[1]
                g.grasp_pose.pose.orientation.z = q[2]
                g.grasp_pose.pose.orientation.w = q[3]
                
                # Set and id for this grasp (simply needs to be unique)
                g.id = str(len(grasps))
                
                # Set the allowed touch objects to the input list
                g.allowed_touch_objects = allowed_touch_objects
                
                # Don't restrict contact force
                g.max_contact_force = 0
                
                # Degrade grasp quality for increasing pitch angles
                g.grasp_quality = 1.0 - abs(p)
                
                # Append the grasp to the list
                grasps.append(deepcopy(g))
                
                # print("grasp_pose_pose", g)
                
        # Return the list
        return grasps
예제 #20
0
    def generate_grasp_msgs(self, grasps):
        formatted_grasps = []
        for i in range(0, len(grasps)):  #dimitris, take out self. !
            g = Grasp()
            g.id = "dupa"
            gp = PoseStamped()
            gp.header.frame_id = "camera_color_optical_frame"

            quat = self.trans_matrix_to_quaternion(grasps[i])

            # Move grasp back for given offset
            gp.pose.position.x = grasps[
                i].surface.x + self.grasp_offset * grasps[i].approach.x
            gp.pose.position.y = grasps[
                i].surface.y + self.grasp_offset * grasps[i].approach.y
            gp.pose.position.z = grasps[
                i].surface.z + self.grasp_offset * grasps[i].approach.z

            gp.pose.orientation.x = float(quat.elements[1])
            gp.pose.orientation.y = float(quat.elements[2])
            gp.pose.orientation.z = float(quat.elements[3])
            gp.pose.orientation.w = float(quat.elements[0])

            g.grasp_pose = gp

            g.pre_grasp_approach.direction.header.frame_id = "hand_link"
            g.pre_grasp_approach.direction.vector.x = 0.0
            g.pre_grasp_approach.direction.vector.y = 0.0
            g.pre_grasp_approach.direction.vector.z = 1.0
            g.pre_grasp_approach.min_distance = 0.05
            g.pre_grasp_approach.desired_distance = 0.1

            #   g.pre_grasp_posture.joint_names = ["gripper_right_finger_joint", "gripper_left_finger_joint"]
            g.pre_grasp_posture.joint_names = ["joint_6"]
            g.pre_grasp_posture.header.frame_id = "hand_link"
            pos = JointTrajectoryPoint()
            pos.positions.append(0)
            #  pos.positions.append(0.1337)
            g.pre_grasp_posture.points.append(pos)

            #  g.grasp_posture.joint_names = ["gripper_right_finger_joint", "gripper_left_finger_joint"]
            #  g.grasp_posture.joint_names = ["joint_6"]
            #  pos = JointTrajectoryPoint()
            #  pos.positions.append(0.0)
            #  pos.positions.append(0.0)
            #  pos.accelerations.append(0.0)
            #  pos.accelerations.append(0.0)
            #  g.grasp_posture.points.append(pos)
            #  g.grasp_posture.header.frame_id = "hand_link"

            g.allowed_touch_objects = ["<octomap>", "obj"]
            g.max_contact_force = 0.0
            #g.grasp_quality = grasps[0].score.data  perche 0 e non i????
            g.grasp_quality = grasps[i].score.data

            formatted_grasps.append(g)
        return formatted_grasps
예제 #21
0
 def load_grasps(self, filename):
     f = open(filename)
     args = yaml.load(f)
     grasps = []
     for arg in args:
         grasp = Grasp()
         arg["id"] = str(arg["id"])
         genpy.message.fill_message_args(grasp, arg)
         grasps.append(grasp)
     return grasps
예제 #22
0
    def generate_grasps(self, name, pose):
        grasps = []

        now = rospy.Time.now()
        angle = 0
        grasp = Grasp()

        grasp.grasp_pose.header.stamp = now
        grasp.grasp_pose.header.frame_id = self.robot.get_planning_frame()
        grasp.grasp_pose.pose = copy.deepcopy(pose)

        # Setting pre-grasp approach
        grasp.pre_grasp_approach.direction.header.stamp = now
        grasp.pre_grasp_approach.direction.header.frame_id = self.robot.get_planning_frame(
        )
        grasp.pre_grasp_approach.direction.vector.z = -0.5
        grasp.pre_grasp_approach.min_distance = self.approach_retreat_min_dist
        grasp.pre_grasp_approach.desired_distance = self.approach_retreat_desired_dist

        # Setting post-grasp retreat
        grasp.post_grasp_retreat.direction.header.stamp = now
        grasp.post_grasp_retreat.direction.header.frame_id = self.robot.get_planning_frame(
        )
        grasp.post_grasp_retreat.direction.vector.z = 0.5
        grasp.post_grasp_retreat.min_distance = self.approach_retreat_min_dist
        grasp.post_grasp_retreat.desired_distance = self.approach_retreat_desired_dist

        q = quaternion_from_euler(0.0, numpy.deg2rad(90.0), angle)
        grasp.grasp_pose.pose.orientation = Quaternion(*q)

        grasp.max_contact_force = 1000

        grasp.pre_grasp_posture.joint_names.append("gripper_finger1_joint")
        traj = JointTrajectoryPoint()
        traj.positions.append(0.0)
        traj.time_from_start = rospy.Duration.from_sec(0.5)
        grasp.pre_grasp_posture.points.append(traj)

        grasp.grasp_posture.joint_names.append("gripper_finger1_joint")
        traj = JointTrajectoryPoint()
        if name == "box":
            traj.positions.append(0.4)
        elif name == "ball":
            traj.positions.append(0.3)
        elif name == "cylinder":
            traj.positions.append(0.3)

        #traj.velocities.append(0.2)
        #traj.effort.append(100)
        traj.time_from_start = rospy.Duration.from_sec(5.0)
        grasp.grasp_posture.points.append(traj)

        grasps.append(grasp)

        return grasps
예제 #23
0
def make_grasps(initial_pose_stamped, allowed_touch_objects, grasp_opening=[0]):
	# INicio el grasp
	g = Grasp()

	# Asigno las posiciones de pre-grasp y grasp postures;
	
	g.pre_grasp_posture = make_gripper_posture(GRIPPER_OPEN)
	g.grasp_posture = make_gripper_posture(grasp_opening)

	# Defino los parametros de aproximación y alejar deseados
	g.pre_grasp_approach = make_gripper_translation(0.01, 0.1, [1.0, 0.0, 0.0])
	g.post_grasp_retreat = make_gripper_translation(0.1, 0.15, [0.0, -1.0, 1.0])

	# Defino la primera grasp pose
	g.grasp_pose = initial_pose_stamped

	# Pitch angulos a probar: POR AHORA SOLO UNO
	pitch_vals = [0]

	# Yaw angles to try: POR AHORA SOLO UNO
	yaw_vals = [0]
	
	# A list to hold the grasps
	grasps = []

	# Genero un grasp para cada angulo pitch y yaw
	for y in yaw_vals:
	    for p in pitch_vals:
		# Creo un quaternion de Euler angles, con un roll de pi (cenital)
		q = quaternion_from_euler(pi, p, y)

		# asigno grasppose acorde al quaternio
		g.grasp_pose.pose.orientation.x = q[0]
		g.grasp_pose.pose.orientation.y = q[1]
		g.grasp_pose.pose.orientation.z = q[2]
		g.grasp_pose.pose.orientation.w = q[3]

		# EStablezco la id de este grasp 
		g.id = str(len(grasps))

		# Defino los objetos que se pueden tocar
		g.allowed_touch_objects = allowed_touch_objects
	
		# no elimino la fuerza de contacto
		g.max_contact_force = 0
 
	
		g.grasp_quality = 1.0 - abs(p)

		# Adjunto la lista de grasp
		grasps.append(deepcopy(g))
	
	#Me devuelve la lista
	return grasps
예제 #24
0
    def pick(self):
        ##-----------GRAPS---------------##
        #set all grasp poses
        #first create an array where all graps are going to be saved
        grasps = []

        #graps 1, box
        #create object grasp
        g = Grasp()
        g.id="box_grasp"

        #GRASP POSE: position of object in end efector seen from world
        grasp_pose = PoseStamped()
        grasp_pose.header.frame_id = "panda_link0"
        grasp_pose.pose.position.x = 0.4 #(box position- (half box lenght- distance distance b/w panda_link8 and palm of eef (0.058) - some extra padding)))
        grasp_pose.pose.position.y = 0
        grasp_pose.pose.position.z = 0.5
        #orientation in quaternion
        #orientation in quaternion
        q = quaternion_from_euler(-pi/2,-pi/4,-pi/2)
        grasp_pose.pose.orientation.x = q[0]
        grasp_pose.pose.orientation.y = q[1]
        grasp_pose.pose.orientation.z = q[2]
        grasp_pose.pose.orientation.w = q[3]
        g.grasp_pose = grasp_pose #set grasp pose

        #pre-grasp approach
        g.pre_grasp_approach.direction.header.frame_id = "panda_link0"
        g.pre_grasp_approach.direction.vector.x = 1.0
        g.pre_grasp_approach.min_distance = 0.095
        g.pre_grasp_approach.desired_distance = 0.115
        self.openGripperPose(g.pre_grasp_posture) #posture before grasp

        #posture during grasp
        self.closeGripperPose(g.grasp_posture,0.02)

        #post-grasp retreat
        g.post_grasp_retreat.direction.header.frame_id = "panda_link0"
        g.post_grasp_retreat.direction.vector.z = 1.0
        g.post_grasp_retreat.min_distance = 0.1
        g.post_grasp_retreat.desired_distance= 0.25
    
        #surface in contact with object
        #g.allowed_touch_objects = ["table1","box","table2"]
        self.move_group_arm.set_support_surface_name("table1")
        
    
        # append the grasp to the list of grasps
        grasps.append(g)
        rospy.sleep(2)
        
        
        # pick the object
        self.move_group_arm.pick("box", grasps)
예제 #25
0
    def make_grasps(self, initial_pose_stamped, allowed_touch_objects):
        # 初始化抓取姿态对象
        g = Grasp()

        # 创建夹爪张开、闭合的姿态
        g.pre_grasp_posture = self.make_gripper_posture(GRIPPER_OPEN)

        g.grasp_posture = self.make_gripper_posture(GRIPPER_CLOSED)

        # 设置期望的夹爪靠近、撤离目标的参数
        g.pre_grasp_approach = self.make_gripper_translation(
            0.05, 0.1, [0.0, 0.0, -1.0])
        g.post_grasp_retreat = self.make_gripper_translation(
            0.05, 0.1, [0.0, 0.0, 1.0])

        # 设置抓取姿态
        g.grasp_pose = initial_pose_stamped

        rot = (initial_pose_stamped.pose.orientation.x,
               initial_pose_stamped.pose.orientation.y,
               initial_pose_stamped.pose.orientation.z,
               initial_pose_stamped.pose.orientation.w)

        # 需要尝试改变姿态的数据列表
        yaw_vals = [0, 0.1, -0.1, 0.2, -0.2, 0.3, -0.3]
        p = euler_from_quaternion(rot)
        # 抓取姿态的列表
        grasps = []

        # 改变姿态,生成抓取动作
        for Y in yaw_vals:

            g.grasp_pose.pose.position.z += 0.18

            # 欧拉角到四元数的转换
            q = quaternion_from_euler(pi, 0, p[2] + Y)
            # 设置抓取的姿态
            g.grasp_pose.pose.orientation.x = q[0]
            g.grasp_pose.pose.orientation.y = q[1]
            g.grasp_pose.pose.orientation.z = q[2]
            g.grasp_pose.pose.orientation.w = q[3]

            # 设置抓取的唯一id号
            g.id = str(len(grasps))

            # 设置允许接触的物体
            g.allowed_touch_objects = allowed_touch_objects

            # 将本次规划的抓取放入抓取列表中
            grasps.append(deepcopy(g))

        # 返回抓取列表
        return grasps
예제 #26
0
def handle_graps(req):
    #this will create an element of type grasp
    object_name=req.object_name

    object_pose=Pose()
    object_pose=Query_object_Pose(object_name)

    object_dimensions=[0,0,0]
    #get object dimensions
    if object_name=="block":
        object_dimensions=[0.045, 0.045, 0.2]
    
    print object_dimensions

    #graps 1
    #create object grasp
    g = Grasp()
    g.id=object_name

    #GRASP POSE: position of object in end efector seen from world
    grasp_pose = PoseStamped()
    grasp_pose.header.frame_id = "panda_link0"
    grasp_pose.pose.position.x = object_pose.position.x -(object_dimensions[0]/2) -0.058-0.02 #(box position- (half box lenght- distance distance b/w panda_link8 and palm of eef (0.058) - some extra padding)))
    grasp_pose.pose.position.y = object_pose.position.y
    grasp_pose.pose.position.z = object_pose.position.z
    #orientation in quaternion
    q = quaternion_from_euler(-pi/2,-pi/4,-pi/2)
    grasp_pose.pose.orientation.x = q[0]
    grasp_pose.pose.orientation.y = q[1]
    grasp_pose.pose.orientation.z = q[2]
    grasp_pose.pose.orientation.w = q[3]
    g.grasp_pose = grasp_pose #set grasp pose

    #pre-grasp approach
    g.pre_grasp_approach.direction.header.frame_id = "panda_link0"
    g.pre_grasp_approach.direction.vector.x = 1.0
    g.pre_grasp_approach.min_distance = 0.095
    g.pre_grasp_approach.desired_distance = 0.115
    openGripperPose(g.pre_grasp_posture) #posture before grasp

    #posture during grasp
    closeGripperPose(g.grasp_posture,object_dimensions[0])

    #post-grasp retreat
    g.post_grasp_retreat.direction.header.frame_id = "panda_link0"
    g.post_grasp_retreat.direction.vector.z = 1.0
    g.post_grasp_retreat.min_distance = 0.1
    g.post_grasp_retreat.desired_distance= 0.25


    #print "Returning grasp [%s , %s , %s]"%(g.grasp_pose.pose.position.x, g.grasp_pose.pose.position.y, g.grasp_pose.pose.position.z)
    return g
예제 #27
0
    def generate_grasps(self, pose, width):
        grasps = []

        now = rospy.Time.now()
        for angle in numpy.arange(0.0, numpy.deg2rad(360.0),
                                  numpy.deg2rad(90.0)):
            # Create place location:
            grasp = Grasp()

            grasp.grasp_pose.header.stamp = now
            grasp.grasp_pose.header.frame_id = self.robot.get_planning_frame()
            grasp.grasp_pose.pose = copy.deepcopy(pose)
            q = quaternion_from_euler(0.0, numpy.deg2rad(90.0), angle)
            grasp.grasp_pose.pose.orientation = Quaternion(*q)

            # Setting pre-grasp approach
            grasp.pre_grasp_approach.direction.header.stamp = now
            grasp.pre_grasp_approach.direction.header.frame_id = self.robot.get_planning_frame(
            )
            grasp.pre_grasp_approach.direction.vector.z = -0.2
            grasp.pre_grasp_approach.min_distance = self.approach_retreat_min_dist
            grasp.pre_grasp_approach.desired_distance = self.approach_retreat_desired_dist

            # Setting post-grasp retreat
            grasp.post_grasp_retreat.direction.header.stamp = now
            grasp.post_grasp_retreat.direction.header.frame_id = self.robot.get_planning_frame(
            )
            grasp.post_grasp_retreat.direction.vector.z = 0.2
            grasp.post_grasp_retreat.min_distance = self.approach_retreat_min_dist
            grasp.post_grasp_retreat.desired_distance = self.approach_retreat_desired_dist

            grasp.max_contact_force = 100

            grasp.pre_grasp_posture.joint_names.append("gripper_finger1_joint")
            traj = JointTrajectoryPoint()
            traj.positions.append(0)
            traj.time_from_start = rospy.Duration.from_sec(0.5)
            grasp.pre_grasp_posture.points.append(traj)

            grasp.grasp_posture.joint_names.append("gripper_finger1_joint")
            traj = JointTrajectoryPoint()
            traj.positions.append(0.55)
            #traj.effort.append(100)
            traj.time_from_start = rospy.Duration.from_sec(1.0)
            grasp.grasp_posture.points.append(traj)

            grasps.append(grasp)

        return grasps
def createGrasp(grasp_pose):
    grasp = Grasp()
    grasp.id = "test"
    grasp.grasp_pose = grasp_pose

    #     grasp.pre_grasp_approach.direction.header.frame_id = "base_link"
    #     grasp.pre_grasp_approach.direction.header.stamp = rospy.Time.now()
    #     grasp.pre_grasp_approach.direction.vector.x = 1.0
    #     grasp.pre_grasp_approach.direction.vector.y = 0.0
    #     grasp.pre_grasp_approach.direction.vector.z = 0.0
    #     grasp.pre_grasp_approach.desired_distance = 0.05
    #     grasp.pre_grasp_approach.min_distance = 0.01

    grasp.pre_grasp_posture.header.frame_id = "base_link"  # what link do i need here?
    grasp.pre_grasp_posture.header.stamp = rospy.Time.now()
    grasp.pre_grasp_posture.joint_names = [
        "hand_right_thumb_joint", "hand_right_index_joint",
        "hand_right_middle_joint"
    ]
    pos = JointTrajectoryPoint()  # pre-grasp with thumb down and fingers open
    pos.positions.append(2.0)
    pos.positions.append(0.0)
    pos.positions.append(0.0)
    grasp.pre_grasp_posture.points.append(pos)

    grasp.grasp_posture.header.frame_id = "base_link"
    grasp.grasp_posture.header.stamp = rospy.Time.now()
    grasp.grasp_posture.joint_names = [
        "hand_right_thumb_joint", "hand_right_index_joint",
        "hand_right_middle_joint"
    ]
    pos = JointTrajectoryPoint()  # grasp with all closed
    pos.positions.append(2.0)
    pos.positions.append(2.0)
    pos.positions.append(2.0)
    grasp.grasp_posture.points.append(pos)

    #     grasp.post_grasp_retreat.direction.header.frame_id = "base_link"
    #     grasp.post_grasp_retreat.direction.header.stamp = rospy.Time.now()
    #     grasp.post_grasp_retreat.direction.vector.x = 0.0
    #     grasp.post_grasp_retreat.direction.vector.y = 0.0
    #     grasp.post_grasp_retreat.direction.vector.z = 1.0
    #     grasp.post_grasp_retreat.desired_distance = 0.1
    #     grasp.post_grasp_retreat.min_distance = 0.01
    #     grasp.allowed_touch_objects = ["table", "part"]

    grasp.max_contact_force = 0

    return grasp
예제 #29
0
def load_grasps(resourcepath):
    """
    load and fill a list of Grasp.msg from a yaml file 
    """
    grasp_yaml = yaml.load(open(resourcepath + 'grasps/grasps.yaml'))
    grasps = {}
    for g in grasp_yaml:
        grasp = Grasp()
        genpy.message.fill_message_args(grasp, g)

        if grasp.id is None or grasp.id == "":
            raise Exception("Grasp has no id")
        else:
            grasps[grasp.id] = grasp
    return grasps
예제 #30
0
def publish_grasps_as_poses(grasps):
    rospy.loginfo(
        "Publishing PoseArray on /grasp_pose_from_block_bla for grasp_pose")
    graspmsg = Grasp()
    grasp_PA = PoseArray()
    header = Header()
    header.frame_id = "base_link"
    header.stamp = rospy.Time.now()
    grasp_PA.header = header
    for graspmsg in grasps:
        p = Pose(graspmsg.grasp_pose.pose.position,
                 graspmsg.grasp_pose.pose.orientation)
        grasp_PA.poses.append(p)
    grasp_publisher.publish(grasp_PA)
    rospy.loginfo('Published ' + str(len(grasp_PA.poses)) + ' poses')
    rospy.sleep(2)