def iterative_touch(self, touching_pose):
        '''
        Warning: this function now works for only left_arm
        '''
        step_size = self.topGraspingTouchTolerance / self.topGraspingTouchSteps

        for i in range(1,self.topGraspingTouchSteps + 1):
            if self._exit:
                return False
            touching_pose.p[2] += step_size
            try:
                pr2_moveit_utils.go_tool_frame(self.left_arm, touching_pose, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                       wait=True, tool_x_offset=self._tool_size[0])
                return True
            except:
                pass
        return False
Example #2
0
def touchRowBottom(torso_group, left_arm_group, row, ft = False):

    base_frame_id = "/base_link"
    listener = tf.TransformListener()


    while not rospy.is_shutdown():
        try:
            torso_joint_pos_dict = rospy.get_param('/torso_joint_pos_dict')
            tool_size = rospy.get_param('/tool_size', [0.16, 0.02, 0.04])
            touch_shelf_test_dict = rospy.get_param('/touch_shelf_test_dict')
            break
        except:
            print 'here'
            rospy.sleep(random.uniform(0,1))
            continue


    reach_in = touch_shelf_test_dict['reach_in']
    pitch = touch_shelf_test_dict['pitch']
    roll = touch_shelf_test_dict['roll']
    preHeight = touch_shelf_test_dict['preHeight']
    preDistance = touch_shelf_test_dict['preDistance']
    trials = touch_shelf_test_dict['trials']
    bottomHeight = touch_shelf_test_dict['row_height'][row]

    if row == 'row_4':
        bin = "shelf_bin_J"
    elif row == 'row_3':
        bin = "shelf_bin_G"
    elif row == 'row_2':
        bin = 'shelf_bin_D'
    else:
        rospy.logerr('row number not recognized')
        return

        
    while not rospy.is_shutdown():
        try:
            binFrame = listener.lookupTransform('/base_link', "/" + bin, rospy.Time(0))
            break
        except:
            pass


    try:
        torso_group.set_joint_value_target(torso_joint_pos_dict['pregrasp'][row])
        torso_group.go()
    except:
        rospy.logerr('can not move torso to detecting height')
        return

    tool_frame_rotation = kdl.Rotation.RPY(math.radians(roll), math.radians(pitch), 0)
    
    '''
    pregrasp
    '''
    init_touching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector(binFrame[0][0] + preDistance, binFrame[0][1] + 0.14, binFrame[0][2] + preHeight))
    try:
        pr2_moveit_utils.go_tool_frame(left_arm_group, init_touching_pose, base_frame_id = base_frame_id, ft = ft,
                                                   wait=True, tool_x_offset = tool_size[0])
    except:
        rospy.logerr('failed to init top grasping pose')
        return

    '''
    reaching
    '''

    reaching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector(binFrame[0][0] + reach_in, binFrame[0][1] + 0.14, binFrame[0][2] + preHeight))
    try:
        pr2_moveit_utils.go_tool_frame(left_arm_group, reaching_pose, base_frame_id = base_frame_id, ft = ft,
                                                   wait=True, tool_x_offset = tool_size[0])
    except:
        rospy.logerr('failed to reach top grasping pose')
        return


    '''
    touching
    '''

    stepDistance = (binFrame[0][2] + preHeight - bottomHeight) / (trials - 1)
    for i in range(trials):
        height = binFrame[0][2] + preHeight - i * stepDistance
        touching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector(binFrame[0][0] + reach_in, binFrame[0][1] + 0.14, height))

        try:
            pr2_moveit_utils.go_tool_frame(left_arm_group, touching_pose, base_frame_id = base_frame_id, ft = ft,
                                                       wait=True, tool_x_offset = tool_size[0])
        except:
            rospy.logerr('best touch height found is (heigher than expected): %4f' % height)
            return

    rospy.logerr('best touch height found is: %4f' % height)
    return
    def sideGrasping(self):

        r = rospy.Rate(1.0)
        while not rospy.is_shutdown():

            if self._exit:
                return False
            try:
                tp = self.listener.lookupTransform('/base_link', "/" + self._item + "_detector", rospy.Time(0))
                binFrame = self.listener.lookupTransform("/" + "shelf_" + self._bin, "/" + self._item + "_detector", rospy.Time(0))
                liftShift = 0.15 - binFrame[0][1]
                rospy.loginfo('got new object pose')
                tpRPY = self.RPYFromQuaternion(tp[1])
                objBinRPY = self.RPYFromQuaternion(binFrame[1])
                planner_frame = '/' + self._item + "_detector"
                self.poseFromSimtrack = True
                break
            except:
                try:
                    tp = self.listener.lookupTransform('/base_link', "/" + self._item + "_detector_seg", rospy.Time(0))
                    binFrame = self.listener.lookupTransform("/" + "shelf_" + self._bin, "/" + self._item + "_detector_seg", rospy.Time(0))
                    planner_frame = '/' + self._item + "_detector_seg"
                    liftShift = 0.15 - binFrame[0][1]
                    rospy.loginfo('got new object pose')
                    tpRPY = self.RPYFromQuaternion(tp[1])
                    objBinRPY = self.RPYFromQuaternion(binFrame[1])
                    self.poseFromSimtrack = False
                    break
                except:
                    r.sleep()
                    continue

        self.open_left_gripper()
        row_height = self.grasping_param_dict['row_height'][self.get_row()]

        if self._item == 'laugh_out_loud_joke_book' or self._item == 'mark_twain_huckleberry_finn' or self._item == 'stanley_66_052' or self._item == 'sharpie_accent_tank_style_highlighters':
            if binFrame[0][1] > 0.14:
                bookX = self.sideGraspingBookX
                bookY = self.sideGraspingBookY
                bookZ = self.sideGraspingBookZ
            else:
                bookX = self.sideGraspingBookX
                bookY = -self.sideGraspingBookY
                bookZ = self.sideGraspingBookZ
        else:
            bookX = 0
            bookY = 0
            bookZ = 0

        if self._item == 'sharpie_accent_tank_style_highlighters':
            bookz = 0.03
            
        if tp[0][2] - row_height < 0.03:
            rospy.logerr('object center too low for sideGrasping')
            return False

        if abs(objBinRPY[1]) > 0.5:
            rospy.logerr('require pushing the object')
            return False

        angle_step = 0

        if objBinRPY[2] < 0:
            angle_step = -self.sideGraspingTolerance / (self.sideGraspingTrialAngles - 1.0)
        else:
            angle_step = self.sideGraspingTolerance / (self.sideGraspingTrialAngles - 1.0)


        for i in range(self.sideGraspingTrialAngles):

            if self._exit:
                return False

            yaw_now = math.radians(angle_step * i)
            x_shift_now = (self.pre_distance + self.xLength) * math.cos(yaw_now)
            y_shift_now = (self.pre_distance + self.xLength) * math.sin(yaw_now)
            rospy.loginfo('yaw_now: %4f, y_shift_now: %4f' % (yaw_now, y_shift_now))



            '''
            PRE-GRASPING
            '''
            rospy.loginfo('PRE-GRASPING')


            rospy.logerr(yaw_now)
            if self.get_row() == 'row_1':
                rospy.loginfo('row_1 grasping')
                pre_pose = kdl.Frame(kdl.Rotation.RPY(0, math.radians(self.sideGraspingRow1_pitch), yaw_now), kdl.Vector( x_shift_now, y_shift_now + bookY, bookZ))
            else:
                pre_pose = kdl.Frame(kdl.Rotation.RPY(0, 0, yaw_now), kdl.Vector( x_shift_now, y_shift_now + bookY, bookZ))

            pre_pose_robot = self.transformPoseToRobotFrame(pre_pose, planner_frame)

            if self._exit:
                return False

            try:
                pr2_moveit_utils.go_tool_frame(self.left_arm, pre_pose_robot.pose, base_frame_id = pre_pose_robot.header.frame_id, ft=self.ft_switch,
                                               wait=True, tool_x_offset=self._tool_size[0])
            except Exception, e:
                rospy.logerr('exception in PRE-GRASPING')
                continue

            '''
            REACHING
            '''
            # row_1_reach = 
            rospy.loginfo('REACHING')
            if self.poseFromSimtrack:
                if self.get_row == 'row_1':
                    reaching_pose = kdl.Frame(kdl.Rotation.RPY(math.radians(self.sideGraspingRow1_pitch), 0, yaw_now), kdl.Vector( bookX, bookY, bookZ))
                else:
                    reaching_pose = kdl.Frame(kdl.Rotation.RPY(0, 0, yaw_now), kdl.Vector( bookX, bookY, bookZ))
                reaching_pose_robot = self.transformPoseToRobotFrame(reaching_pose, planner_frame)
            else:
                if self.get_row() == 'row_1':
                    reaching_pose = kdl.Frame(kdl.Rotation.RPY(math.radians(self.sideGraspingRow1_pitch), 0, yaw_now), kdl.Vector( self.sideGraspingSegReach + bookX, bookY, bookZ))
                else:
                    reaching_pose = kdl.Frame(kdl.Rotation.RPY(0, 0, yaw_now), kdl.Vector( self.sideGraspingSegReach + bookX, bookY, 0))
                reaching_pose_robot = self.transformPoseToRobotFrame(reaching_pose, planner_frame)

            if self._exit:
                return False

            try:
                pr2_moveit_utils.go_tool_frame(self.left_arm, reaching_pose_robot.pose, base_frame_id = reaching_pose_robot.header.frame_id, ft=self.ft_switch,
                                               wait=True, tool_x_offset=self._tool_size[0])
            except:
                rospy.logerr('exception in REACHING')
                continue

            '''
            GRASPING
            '''
            rospy.loginfo('GRASPING')
            self.close_left_gripper()

            '''
            CHECKING THE GRIPPER ANGLE POS
            '''
            rospy.loginfo('[grasp_object]: Checking gripper angle pos')
            # action has failed... return false
            if not self.check_gripper_angle():
                rospy.logerr('[grasp_object]: grasping action failed')
                self.open_left_gripper()
                continue


            '''
            LIFTING
            '''

            rospy.loginfo('LIFTING')

            if self.get_row() == 'row_1':
                curr_joints = self.left_arm.get_current_joint_values()
                curr_joints[5] = self.sideGraspingRow1_liftAngle
                self.left_arm.set_joint_value_target(curr_joints)
                try:
                    self.left_arm.go()
                except:
                    self.open_left_gripper()
                    rospy.logerr('exception in LIFTING')
                    continue

            else:
                lifting_pose = kdl.Frame(kdl.Rotation.RPY(tpRPY[0], tpRPY[1], 0), kdl.Vector( tp[0][0], tp[0][1] + liftShift, tp[0][2] + self.lifting_height))

            
                try:
                    pr2_moveit_utils.go_tool_frame(self.left_arm, lifting_pose, base_frame_id = 'base_link', ft=self.ft_switch,
                                                   wait=True, tool_x_offset=self._tool_size[0])
                except:
                    self.open_left_gripper()
                    rospy.logerr('exception in LIFTING')
                    continue

            '''
            RETREATING
            '''
            rospy.loginfo('RETREATING')

            try:
                column = self.get_column()
                base_pos_goal = self.base_pos_dict[column]
                new_base_pose = copy.deepcopy(base_pos_goal)
                new_base_pose[0] -= abs(self.base_retreat_distance)
                self.go_base_pos_async(new_base_pose)
            except Exception, e:
                # rospy.logerr(e)
                self.flush()

                self.open_left_gripper()

                rospy.logerr('exception in RETREATING')
                continue
    def topGrasping(self):

        r = rospy.Rate(1.0)
        while not rospy.is_shutdown():

            if self._exit:
                return False
            try:
                tp = self.listener.lookupTransform('/base_link', "/" + self._item + "_detector", rospy.Time(0))
                binFrame = self.listener.lookupTransform("/" + "shelf_" + self._bin, "/" + self._item + "_detector", rospy.Time(0))
                liftShift = 0.15 - binFrame[0][1]
                rospy.loginfo('got new object pose')
                tpRPY = self.RPYFromQuaternion(tp[1])
                self.poseFromSimtrack = True
                break
            except:
                try:
                    tp = self.listener.lookupTransform('/base_link', "/" + self._item + "_detector_seg", rospy.Time(0))
                    binFrame = self.listener.lookupTransform("/" + "shelf_" + self._bin, "/" + self._item + "_detector_seg", rospy.Time(0))
                    liftShift = 0.13 - binFrame[0][1]
                    rospy.loginfo('got new object pose')
                    tpRPY = self.RPYFromQuaternion(tp[1])
                    self.poseFromSimtrack = False
                    break
                except:
                    r.sleep()
                    continue
        self.open_left_gripper()

        if self._exit:
            return False

        for i in range(self.topGraspingPitchTrials):

            if self._exit:
                return False

            tgp = self.topGraspingPitch - self.topGraspingPitchTolerance / (self.topGraspingPitchTrials - 1) * i
            rospy.loginfo('topGraspingPitch now: %4f' % tgp)

            for j in range(self.topGraspingYawTrials):
                if self._exit:
                    return False
                y_shift_step = 0.06 / (self.topGraspingYawTrials - 1.0)
                reach_Y_shift_step = self.topGraspingYshiftTolerance / (self.topGraspingYawTrials - 1.0)
                
                if binFrame[0][1] >= 0.13:
                    tgy = self.topGraspingYawTolerance / (self.topGraspingYawTrials - 1) * j
                    y_shift_now = - y_shift_step * j
                    reach_Y_shift = - reach_Y_shift_step * j
                else:
                    tgy = -self.topGraspingYawTolerance / (self.topGraspingYawTrials - 1) * j
                    y_shift_now = y_shift_step * j
                    reach_Y_shift = reach_Y_shift_step * j


                rospy.loginfo('topGraspingYaw now: %4f' % tgy)
                row_height = self.grasping_param_dict['row_height'][self.get_row()]
                tool_frame_rotation = kdl.Rotation.RPY(math.radians(self.topGraspingRoll), math.radians(tgp), math.radians(tgy))
                reachingHeight = min(self.topGraspingMaxReachingHeight + row_height, tp[0][2] + self.topGraspHeight)

                '''
                PRE-GRASPING
                '''

                pre_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0] + self.topGrasping_pre_distance, tp[0][1] + y_shift_now, reachingHeight))


                try:
                    pr2_moveit_utils.go_tool_frame(self.left_arm, pre_pose, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                   wait=True, tool_x_offset=self._tool_size[0])
                except:
                    rospy.logerr('exception in PRE-GRASPING')
                    continue


                '''
                REACHING
                '''
                if self.poseFromSimtrack:
                    reaching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] + reach_Y_shift, tp[0][2] + self.topGraspHeight))
                else:
                    reaching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0] + self.topGraspingReachSeg, tp[0][1] + reach_Y_shift, reachingHeight))
               
                try:
                    pr2_moveit_utils.go_tool_frame(self.left_arm, reaching_pose, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                   wait=True, tool_x_offset=self._tool_size[0])
                except:
                    rospy.logerr('exception in REACHING')
                    continue

                '''
                TOUCHING
                '''

                touching_height = max(tp[0][2], row_height)
                if self.poseFromSimtrack:
                    touching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] + reach_Y_shift, touching_height))
                else:
                    touching_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0] + self.topGraspingReachSeg, tp[0][1] + reach_Y_shift, touching_height))
                rospy.loginfo("touching_height: %4f" % touching_height)
                
                try:
                    pr2_moveit_utils.go_tool_frame(self.left_arm, touching_pose, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                   wait=True, tool_x_offset=self._tool_size[0])
                except:
                    if not self.iterative_touch(touching_pose):
                        rospy.logerr('exception in TOUCHING')
                        continue
                    else:
                        pass

                '''
                SMART-SHAKING
                '''

                if self.poseFromSimtrack:
                    shaking_pose1 = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] + 0.01, touching_height))
                    shaking_pose2 = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] - 0.01, touching_height))
                else:
                    shaking_pose1 = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0] + self.topGraspingReachSeg, tp[0][1] + reach_Y_shift + 0.02, touching_height))
                    shaking_pose2 = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0] + self.topGraspingReachSeg, tp[0][1] + reach_Y_shift - 0.02, touching_height))
                
                for i in range(self.topGraspingShakingNumber):
                    if self._exit:
                        return False
                    try:
                        pr2_moveit_utils.go_tool_frame(self.left_arm, shaking_pose1, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                       wait=True, tool_x_offset=self._tool_size[0])
                    except:
                        rospy.logerr('exception in SMART-SHAKING left, never mind')

                    try:
                        pr2_moveit_utils.go_tool_frame(self.left_arm, shaking_pose2, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                       wait=True, tool_x_offset=self._tool_size[0])
                    except:
                        rospy.logerr('exception in SMART-SHAKING right, never mind')


                '''
                GRASPING
                '''

                self.close_left_gripper()

                '''
                LIFTING
                '''
                if self._item == 'dr_browns_bottle_brush':
                    lifting_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] + liftShift, tp[0][2] + self.topGraspingLiftingHeight + 0.04))
                else:
                    lifting_pose = kdl.Frame(tool_frame_rotation, kdl.Vector( tp[0][0], tp[0][1] + liftShift, tp[0][2] + self.topGraspingLiftingHeight))

                


                try:
                    pr2_moveit_utils.go_tool_frame(self.left_arm, lifting_pose, base_frame_id = self.topGraspingFrame, ft=self.ft_switch,
                                                   wait=True, tool_x_offset=self._tool_size[0])
                except:
                    self.open_left_gripper()
                    rospy.logerr('exception in LIFTING')
                    continue

                '''
                RETREATING
                '''
                rospy.loginfo('RETREATING')



                try:
                    column = self.get_column()
                    base_pos_goal = self.base_pos_dict[column]
                    new_base_pose = copy.deepcopy(base_pos_goal)
                    new_base_pose[0] -= abs(self.base_retreat_distance)
                    self.go_base_pos_async(new_base_pose)
                except Exception, e:
                    self.open_left_gripper()

                    rospy.logerr('exception in RETREATING')
                    continue
                return True
Example #5
0
    while not rospy.is_shutdown():

        try:
            T_b_groovy_tf = listener.lookupTransform('/base_link', '/amazon_cheeze', rospy.Time(0))

            print "got new pose"
        except:
            continue
        curr_pose = left_arm.get_current_pose()
        
        target_pose = kdl.Frame(kdl.Rotation.RPY(0,0,0), tf2msg(T_b_groovy_tf,curr_pose))

        try:
            print 'going to tracked position'
            pr2_moveit_utils.go_tool_frame(left_arm, target_pose, base_frame_id ='base_link', ft=False, wait=True)
            print 'position reached'
        except:
            print "goal position not reachable"
            print ""
            print ''
            continue

        # left_arm.set_pose_target(tf2msg(T_b_groovy_tf,curr_pose))
        # left_arm.go()

        # r.sleep()



            T_b_groovy_tf = listener.lookupTransform('/base_link',
                                                     '/amazon_cheeze',
                                                     rospy.Time(0))

            print "got new pose"
        except:
            continue
        curr_pose = left_arm.get_current_pose()

        target_pose = kdl.Frame(kdl.Rotation.RPY(0, 0, 0),
                                tf2msg(T_b_groovy_tf, curr_pose))

        try:
            print 'going to tracked position'
            pr2_moveit_utils.go_tool_frame(left_arm,
                                           target_pose,
                                           base_frame_id='base_link',
                                           ft=False,
                                           wait=True)
            print 'position reached'
        except:
            print "goal position not reachable"
            print ""
            print ''
            continue

        # left_arm.set_pose_target(tf2msg(T_b_groovy_tf,curr_pose))
        # left_arm.go()

        # r.sleep()