def get_table():
    '''   
    Uses tabletop detection to find a plane which corresponds to the cabinet door 
    
    @rtype: tabletop_object_detector/Table                                         
    @returns the detected cabinet door                                                                             
    '''
    ppm = PickAndPlaceManager()
    (things, table) = ppm.call_tabletop_detection(take_static_collision_map=1,
                                                  update_table=1)
    print table
    return table
    def __init__(self):
        self.place_viz_pub = rospy.Publisher('place_pose', PoseStamped)
        self.manager = PickAndPlaceManager()
        self.cursor_proxy = rospy.ServiceProxy('get_cursor_stats',
                                               GetCursorStats)
        #~ self.cursor_proxy.wait_for_service()
        rospy.loginfo("Waiting for polygon service")
        self.polygon_proxy = rospy.ServiceProxy('draw_polygon', DrawPolygon)
        self.polygon_proxy.wait_for_service()
        rospy.loginfo("Waiting for circle inhibit service")
        self.circle_inhibit_proxy = rospy.ServiceProxy('circle_inhibit',
                                                       CircleInhibit)
        self.circle_inhibit_proxy.wait_for_service()

        rospy.loginfo("Drawing trash/recycling")
        self.polygon_proxy('Recycling', True, RECYCLING)
        self.polygon_proxy('Garbage', True, TRASH)
 def __init__(self):
     self.place_viz_pub = rospy.Publisher('place_pose', PoseStamped)
     self.manager = PickAndPlaceManager()
     self.cursor_proxy = rospy.ServiceProxy('get_cursor_stats', GetCursorStats)
     #~ self.cursor_proxy.wait_for_service()
     rospy.loginfo("Waiting for polygon service")
     self.polygon_proxy = rospy.ServiceProxy('draw_polygon', DrawPolygon)
     self.polygon_proxy.wait_for_service()
     rospy.loginfo("Waiting for circle inhibit service")
     self.circle_inhibit_proxy = rospy.ServiceProxy('circle_inhibit', CircleInhibit)
     self.circle_inhibit_proxy.wait_for_service()
     
     rospy.loginfo("Drawing trash/recycling")
     self.polygon_proxy('Recycling', True, RECYCLING)
     self.polygon_proxy('Garbage', True, TRASH)
예제 #4
0
 def __init__(self, name):
     '''
     Begins the action to open the cupboard
     '''
     rospy.loginfo("IN ACTION")
     self._action_name = name
     self._as = actionlib.SimpleActionServer(
         self._action_name,
         opendoors_executive.msg.OpenCupboardAction,
         execute_cb=self.main1)
     self._as.start()
     self.ppm = PickAndPlaceManager()
     self.s = rospy.Service('table_status',
                            opendoors_executive.srv.table_status,
                            self.table_status)
     print "Ready to check table status"
     self.result = opendoors_executive.msg.OpenCupboardResult()
     '''
예제 #5
0
def dude():
    ppm = PickAndPlaceManager()
    (things, table) = ppm.call_tabletop_detection(take_static_collision_map=1,
                                                  update_table=1)
class Manipulator(object):
    state = NOTGRASPING
    point = None
    grasp_arm = -1
    INPROGRESS = False
    click_lock = RLock()
    def __init__(self):
        self.place_viz_pub = rospy.Publisher('place_pose', PoseStamped)
        self.manager = PickAndPlaceManager()
        self.cursor_proxy = rospy.ServiceProxy('get_cursor_stats', GetCursorStats)
        #~ self.cursor_proxy.wait_for_service()
        rospy.loginfo("Waiting for polygon service")
        self.polygon_proxy = rospy.ServiceProxy('draw_polygon', DrawPolygon)
        self.polygon_proxy.wait_for_service()
        rospy.loginfo("Waiting for circle inhibit service")
        self.circle_inhibit_proxy = rospy.ServiceProxy('circle_inhibit', CircleInhibit)
        self.circle_inhibit_proxy.wait_for_service()
        
        rospy.loginfo("Drawing trash/recycling")
        self.polygon_proxy('Recycling', True, RECYCLING)
        self.polygon_proxy('Garbage', True, TRASH)
        
    
    def click(self, msg):
        if self.click_lock.acquire(blocking=False):
            #~ self.circle_inhibit_proxy(True)
            rospy.logwarn('Calling tabletop detection')
            self.manager.call_tabletop_detection()
            # self.point = self.cursor_proxy().click_pos
            print 'STATE = ',self.state
            if self.state == NOTGRASPING:
                rospy.logwarn('About to grasp')
                self.grasp()
            elif self.state == GRASPING:
                rospy.logwarn('About to drop')
                self.drop()
            self.click_lock.release()
            #~ self.circle_inhibit_proxy(False)

    def point_cb(self, msg):
        #self.point = msg
        cloud = read_points_np(msg)
        point = PointStamped()
        point.header = msg.header
        if cloud.shape[1] == 0: return
        point.point.x, point.point.y, point.point.z = cloud[0][0]
        self.point = point
    

    def transformAtLatestCommonTime(self, target_frame, point):
        lct = self.manager.tf_listener.getLatestCommonTime(point.header.frame_id, target_frame)
        point_lct = deepcopy(point)
        point_lct.header.stamp = lct
        return self.manager.tf_listener.transformPoint(target_frame, point_lct)

    #TODO need to make sure we can't trigger grasp/drop multiple times concurrently
    def grasp(self):
        print self.state, self.point
        if (self.state == NOTGRASPING) and (self.point is not None):
            rospy.loginfo('===grasping')
            self.manager.move_arm_to_side(0)
            ptt = self.transformAtLatestCommonTime('base_link', self.point)
            status = self.manager.pick_up_object_near_point(ptt, 0)
            self.grasp_arm = 0
            # if not success:
            #     self.manager.move_arm_to_side(1)
            #     success = self.manager.pick_up_object_near_point(self.point, 1)
            #     self.grasp_arm = 1
            if status == ManipulationResult.SUCCESS:
                self.state = GRASPING
                rospy.logerr('SUCCESSFUL GRASP')
            else:
                rospy.logerr('FAILED TO GRASP')
        
    def drop(self):
        if self.state == GRASPING:
            #success = self.manager.put_down_object(self.grasp_arm, max_place_tries=25, use_place_override=1)
            place_pose = PoseStamped()
            ptt = self.transformAtLatestCommonTime('table', self.point)
            place_pose.header = ptt.header 
            place_pose.pose.position = ptt.point
            place_pose.pose.orientation = euler_to_quaternion(0,0,0)
            place_pose.pose.position.z = 0.03
            # see if it's in one of our predefined boxes
            
            pw,ph = 0.1,0.1
       
            #boxes = [('TRASH', TRASH), ('RECYCLING', RECYCLING)]
            boxes = []
            for name, polygon in boxes:
                pts_arr = np.array([[(p.x,p.y) for p in polygon.polygon.points]])
                print pts_arr
                if pnpoly(ptt.point.x, ptt.point.y, pts_arr.squeeze()):
                    # we're doing this from the top right corner (don't ask)
                    # place_pose.pose.position = polygon.polygon.points[0]
                    poly_center = pts_arr.squeeze().mean(0)
                    place_pose.pose.position.x = poly_center[0]
                    place_pose.pose.position.y = poly_center[1]
                    pw,ph = w,h
                    rospy.loginfo('Placing in box: %s' % name)
                    
            rospy.loginfo('Placing at %s' % place_pose)
            self.place_viz_pub.publish(place_pose)
            
            #import pdb; pdb.set_trace()

            self.manager.set_place_area(place_pose, (pw,ph))
            # status = self.manager.place_object(self.grasp_arm, place_pose, padding=0) 
            status = self.manager.put_down_object(self.grasp_arm, max_place_tries=25, use_place_override=1)
            if status == ManipulationResult.SUCCESS:
                self.state = NOTGRASPING
                self.grasp_arm = -1
예제 #7
0
def main():
    ppm = PickAndPlaceManager()

    move_to()
    grasp()
    open(ppm)
class Manipulator(object):
    state = NOTGRASPING
    point = None
    grasp_arm = -1
    INPROGRESS = False
    click_lock = RLock()

    def __init__(self):
        self.place_viz_pub = rospy.Publisher('place_pose', PoseStamped)
        self.manager = PickAndPlaceManager()
        self.cursor_proxy = rospy.ServiceProxy('get_cursor_stats',
                                               GetCursorStats)
        #~ self.cursor_proxy.wait_for_service()
        rospy.loginfo("Waiting for polygon service")
        self.polygon_proxy = rospy.ServiceProxy('draw_polygon', DrawPolygon)
        self.polygon_proxy.wait_for_service()
        rospy.loginfo("Waiting for circle inhibit service")
        self.circle_inhibit_proxy = rospy.ServiceProxy('circle_inhibit',
                                                       CircleInhibit)
        self.circle_inhibit_proxy.wait_for_service()

        rospy.loginfo("Drawing trash/recycling")
        self.polygon_proxy('Recycling', True, RECYCLING)
        self.polygon_proxy('Garbage', True, TRASH)

    def click(self, msg):
        if self.click_lock.acquire(blocking=False):
            #~ self.circle_inhibit_proxy(True)
            rospy.logwarn('Calling tabletop detection')
            self.manager.call_tabletop_detection()
            # self.point = self.cursor_proxy().click_pos
            print 'STATE = ', self.state
            if self.state == NOTGRASPING:
                rospy.logwarn('About to grasp')
                self.grasp()
            elif self.state == GRASPING:
                rospy.logwarn('About to drop')
                self.drop()
            self.click_lock.release()
            #~ self.circle_inhibit_proxy(False)

    def point_cb(self, msg):
        #self.point = msg
        cloud = read_points_np(msg)
        point = PointStamped()
        point.header = msg.header
        if cloud.shape[1] == 0: return
        point.point.x, point.point.y, point.point.z = cloud[0][0]
        self.point = point

    def transformAtLatestCommonTime(self, target_frame, point):
        lct = self.manager.tf_listener.getLatestCommonTime(
            point.header.frame_id, target_frame)
        point_lct = deepcopy(point)
        point_lct.header.stamp = lct
        return self.manager.tf_listener.transformPoint(target_frame, point_lct)

    #TODO need to make sure we can't trigger grasp/drop multiple times concurrently
    def grasp(self):
        print self.state, self.point
        if (self.state == NOTGRASPING) and (self.point is not None):
            rospy.loginfo('===grasping')
            self.manager.move_arm_to_side(0)
            ptt = self.transformAtLatestCommonTime('base_link', self.point)
            status = self.manager.pick_up_object_near_point(ptt, 0)
            self.grasp_arm = 0
            # if not success:
            #     self.manager.move_arm_to_side(1)
            #     success = self.manager.pick_up_object_near_point(self.point, 1)
            #     self.grasp_arm = 1
            if status == ManipulationResult.SUCCESS:
                self.state = GRASPING
                rospy.logerr('SUCCESSFUL GRASP')
            else:
                rospy.logerr('FAILED TO GRASP')

    def drop(self):
        if self.state == GRASPING:
            #success = self.manager.put_down_object(self.grasp_arm, max_place_tries=25, use_place_override=1)
            place_pose = PoseStamped()
            ptt = self.transformAtLatestCommonTime('table', self.point)
            place_pose.header = ptt.header
            place_pose.pose.position = ptt.point
            place_pose.pose.orientation = euler_to_quaternion(0, 0, 0)
            place_pose.pose.position.z = 0.03
            # see if it's in one of our predefined boxes

            pw, ph = 0.1, 0.1

            #boxes = [('TRASH', TRASH), ('RECYCLING', RECYCLING)]
            boxes = []
            for name, polygon in boxes:
                pts_arr = np.array([[(p.x, p.y)
                                     for p in polygon.polygon.points]])
                print pts_arr
                if pnpoly(ptt.point.x, ptt.point.y, pts_arr.squeeze()):
                    # we're doing this from the top right corner (don't ask)
                    # place_pose.pose.position = polygon.polygon.points[0]
                    poly_center = pts_arr.squeeze().mean(0)
                    place_pose.pose.position.x = poly_center[0]
                    place_pose.pose.position.y = poly_center[1]
                    pw, ph = w, h
                    rospy.loginfo('Placing in box: %s' % name)

            rospy.loginfo('Placing at %s' % place_pose)
            self.place_viz_pub.publish(place_pose)

            #import pdb; pdb.set_trace()

            self.manager.set_place_area(place_pose, (pw, ph))
            # status = self.manager.place_object(self.grasp_arm, place_pose, padding=0)
            status = self.manager.put_down_object(self.grasp_arm,
                                                  max_place_tries=25,
                                                  use_place_override=1)
            if status == ManipulationResult.SUCCESS:
                self.state = NOTGRASPING
                self.grasp_arm = -1