Example #1
0
    def setUp(self):

        self.tfl = tf.TransformListener()
        rospy.sleep(2.0)
        self.world_frame = "marker"
        self.object_id = "21"

        api = ArtApiHelper()
        api.wait_for_db_api()
        api.store_object_type(obj_type("fake_object_type", 0.046, 0.046, 0.154))
Example #2
0
    def __init__(self):

        self.ar_code_sub = rospy.Subscriber("ar_pose_marker", AlvarMarkers,
                                            self.ar_code_cb)
        self.detected_objects_pub = rospy.Publisher(
            "/art/object_detector/object", InstancesArray, queue_size=10)
        self.visualize_pub = rospy.Publisher(
            "art/object_detector/visualize_objects", Marker, queue_size=10)

        # TODO make a timer clearing this cache from time to time
        self.objects_cache = {}

        self.art = ArtApiHelper()
        self.art.wait_for_api()
Example #3
0
def main(args):

    global state_manager
    global ph
    global art
    global action_server
    global left_gripper_pub
    global right_gripper_pub
    global gripper_timer

    rospy.init_node('test_brain')

    state_manager = InterfaceStateManager(InterfaceState.BRAIN_ID, callback)
    ph = ProgramHelper()

    state_manager.set_system_state(InterfaceState.STATE_IDLE)

    rospy.Service('/art/brain/program/start', ProgramIdTrigger, start_program)
    rospy.Service('/art/brain/learning/start', ProgramIdTrigger,
                  learning_srv_cb)
    rospy.Service('/art/brain/learning/stop', Trigger, learning_srv_cb)
    # rospy.Service('/art/brain/program/stop',  stopProgram, stop_program)

    art = ArtApiHelper()

    action_server = actionlib.SimpleActionServer(
        '/art/brain/learning_request',
        LearningRequestAction,
        execute_cb=learning_request_cb,
        auto_start=False)
    action_server.start()

    left_gripper_pub = rospy.Publisher('/art/pr2/left_arm/gripper/pose',
                                       PoseStamped,
                                       queue_size=10)
    right_gripper_pub = rospy.Publisher('/art/pr2/right_arm/gripper/pose',
                                        PoseStamped,
                                        queue_size=10)

    gripper_timer = rospy.Timer(rospy.Duration(0.5), gripper_timer)

    rospy.spin()
Example #4
0
    def __init__(self, target_frame="marker"):

        self.target_frame = target_frame
        self.tfl = tf.TransformListener()
        self.lock = threading.Lock()
        self.detection_enabled = True
        self.use_forearm_cams = False
        self.table_size = array_from_param("/art/conf/table/size", float, 2, wait=True)
        self.ground_objects_on_table = rospy.get_param("~ground_objects_on_table", False)
        self.yaw_only_on_table = rospy.get_param("~yaw_only_on_table", False)
        self.ground_bb_axis = rospy.get_param("~ground_bb_axis", SolidPrimitive.BOX_Z)
        if self.ground_objects_on_table:
            rospy.loginfo("Objects on table will be grounded.")
        self.api = ArtApiHelper()
        self.api.wait_for_db_api()

        self.meas_max_age = rospy.Duration(5.0)
        self.prune_timer = rospy.Timer(rospy.Duration(1.0), self.prune_timer_cb)
        self.objects = {}
        self.br = tf.TransformBroadcaster()

        self.sub = rospy.Subscriber(
            "/art/object_detector/object", InstancesArray, self.cb, queue_size=1)
        self.pub = rospy.Publisher(
            "/art/object_detector/object_filtered", InstancesArray, queue_size=1, latch=True)
        self.timer = rospy.Timer(rospy.Duration(0.1), self.timer_cb)

        self.srv_set_flag = rospy.Service('/art/object_detector/flag/set', ObjectFlagSet, self.srv_set_flag_cb)
        self.srv_clear_flag = rospy.Service('/art/object_detector/flag/clear', ObjectFlagClear, self.srv_clear_flag_cb)
        self.srv_clear_all_flags = rospy.Service('/art/object_detector/flag/clear_all',
                                                 Empty, self.srv_clear_all_flags_cb)

        self.forearm_cams = ("/l_forearm_cam_optical_frame", "/r_forearm_cam_optical_frame")
        self.srv_enable_forearm = rospy.Service('/art/object_detector/forearm/enable',
                                                Empty, self.srv_enable_forearm_cb)
        self.srv_disable_forearm = rospy.Service('/art/object_detector/forearm/disable',
                                                 Empty, self.srv_disable_forearm_cb)
        self.srv_enable_detection = rospy.Service('/art/object_detector/all/enable', Empty,
                                                  self.srv_enable_detection_cb)
        self.srv_disable_detection = rospy.Service('/art/object_detector/all/disable', Empty,
                                                   self.srv_disable_detection_cb)
Example #5
0
    def __init__(self, setup, world_frame):

        assert setup != ""

        self.ready = False
        self.setup = setup
        self.world_frame = world_frame

        self.tf_listener = TransformListener()

        self.api = ArtApiHelper()
        rospy.loginfo("Waiting for DB API")
        self.api.wait_for_db_api()
        self.ignored_prefixes = array_from_param("~ignored_prefixes")

        rospy.loginfo("Will ignore following prefixes: " +
                      str(self.ignored_prefixes))

        self.lock = RLock()

        self.ps = PlanningSceneInterface()

        self._paused = False
        self.oh = ObjectHelper(self.object_cb)
        self.artificial_objects = {}

        self.collision_objects_pub = rospy.Publisher(self.NS + "artificial",
                                                     CollisionObjects,
                                                     latch=True,
                                                     queue_size=1)
        self.pub_artificial()

        self.timer = rospy.Timer(rospy.Duration(1.0), self.timer_cb)

        self.paused_pub = rospy.Publisher(self.NS + "paused",
                                          Bool,
                                          latch=True,
                                          queue_size=1)
        self.paused = False
Example #6
0
def main():

    rospy.init_node('simple_trolley_init_script', anonymous=True)

    art = ArtApiHelper()
    art.wait_for_api()

    art.store_object_type(obj_type("mala_desticka", 0.0125, 0.06, 0.06))
    art.store_object_type(
        obj_type("Modry_kontejner", 0.14, 0.195, 0.075, container=True))

    # delete all created programs
    ph = art.get_program_headers()
    if ph:
        for h in ph:

            art.program_clear_ro(h.id)
            art.delete_program(h.id)

    prog = Program()
    prog.header.id = 1
    prog.header.name = "Pick & Place"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Pick & Place"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(polygon_item(1))
    pb.items.append(place_item(2, ref_id=[1], on_success=3, on_failure=0))
    pb.items.append(item(3, "GetReady", on_success=4, on_failure=0))
    pb.items.append(polygon_item(4))
    pb.items.append(place_item(5, ref_id=[4], on_success=6, on_failure=0))
    pb.items.append(item(6, "GetReady", on_success=1, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)
Example #7
0
    def __init__(self):

        self.ih = InstructionsHelper()
        states = []
        transitions = []
        self.instruction_fsm = {}
        for instruction in self.ih.known_instructions():
            states += self.ih[instruction].brain.fsm.states
            transitions += self.ih[instruction].brain.fsm.transitions
        self.fsm = ArtBrainMachine(states, transitions)

        for instruction in self.ih.known_instructions():
            self.instruction_fsm[instruction] = self.ih[instruction].brain.fsm(
                self)

        for _, fsm in self.instruction_fsm.iteritems():

            for state_function in fsm.state_functions:
                setattr(self.fsm, state_function, getattr(fsm, state_function))

        self.fsm.check_robot_in = self.check_robot_in
        self.fsm.check_robot_out = self.check_robot_out
        self.fsm.is_everything_calibrated = self.is_everything_calibrated
        self.fsm.state_init_ros = self.state_init_ros
        self.fsm.state_waiting_for_action = self.state_waiting_for_action
        self.fsm.state_program_init = self.state_program_init
        self.fsm.state_program_run = self.state_program_run
        self.fsm.state_learning_init = self.state_learning_init
        self.fsm.state_learning_run = self.state_learning_run
        self.fsm.learning_load_block_id = self.learning_load_block_id
        self.fsm.state_program_error = self.state_program_error
        self.fsm.state_program_paused = self.state_program_paused
        self.fsm.state_program_finished = self.state_program_finished
        self.fsm.state_program_load_instruction = self.state_program_load_instruction
        self.fsm.state_learning_step_done = self.state_learning_step_done
        self.fsm.state_learning_step_error = self.state_learning_step_error
        self.fsm.state_learning_done = self.state_learning_done
        self.fsm.state_update_program_item = self.state_update_program_item
        self.fsm.visualize_load_block_id = self.visualize_load_block_id
        self.fsm.state_visualize_run = self.state_visualize_run
        self.fsm.state_visualize_done = self.state_visualize_done

        self.block_id = None
        self.user_id = 0
        self.objects = InstancesArray()
        self.executing_program = False
        self.program_paused = False
        self.program_pause_request = False
        self.learning = False
        self.instruction = None  # type: ProgramItem
        self.holding_object_left = None
        self.holding_object_right = None
        self.stop_server = False
        self.recalibrate = False
        self.table_calibrated = False
        self.table_calibrating = False
        self.cells_calibrated = False
        self.system_calibrated = False
        self.initialized = False
        self.projectors_calibrated = False
        self.last_drill_arm_id = None

        self.learning_block_id = None
        self.learning_item_id = None

        self.quit = False

        self.user_activity = None

        rospy.loginfo('Waiting for other nodes to come up...')

        self.program_resume_after_restart = rospy.get_param(
            "executing_program", False)
        self.learning_resume_after_restart = rospy.get_param(
            "learning_program", False)
        self.rh = None

        while not self.rh and not rospy.is_shutdown():
            try:
                self.rh = ArtRobotHelper()
            except UnknownRobot:
                ArtBrain.fatal("Unknown robot")
                return
            except RobotParametersNotOnParameterServer:
                rospy.logerr("Robot parameters not on parameter server yet...")
                rospy.sleep(1)

        try:
            p, m = rospy.get_param("robot_interface").rsplit('.', 1)
        except (KeyError, ValueError) as e:
            ArtBrain.fatal("Robot interface not set!")
            return
        try:
            mod = importlib.import_module(p)
            self.robot = getattr(mod, m)(self.rh)
        except (ImportError, AttributeError, TypeError) as e:
            ArtBrain.fatal("Failed to import robot interface: " + str(e))
            return

        if not isinstance(self.robot, ArtBrainRobotInterface):
            ArtBrain.fatal("Invalid robot interface.")
            return

        rospy.loginfo("Robot initialized")
        self.user_status_sub = rospy.Subscriber("/art/user/status", UserStatus,
                                                self.user_status_cb)
        self.user_activity_sub = rospy.Subscriber("/art/user/activity",
                                                  UserActivity,
                                                  self.user_activity_cb)
        self.table_calibrated_sub = rospy.Subscriber(
            "/art/interface/touchtable/calibrated", Bool,
            self.table_calibrated_cb)
        self.table_calibrating_sub = rospy.Subscriber(
            "/art/interface/touchtable/calibrating", Bool,
            self.table_calibrating_cb)
        self.system_calibrated_sub = rospy.Subscriber(
            "/art/system/calibrated", Bool, self.system_calibrated_cb)

        self.projectors_calibrated_sub = rospy.Subscriber(
            "/art/interface/projected_gui/projectors_calibrated", Bool,
            self.projectors_calibrated_cb)

        self.srv_program_start = rospy.Service('program/start',
                                               ProgramIdTrigger,
                                               self.program_start_cb)
        self.srv_program_stop = rospy.Service('program/stop', Trigger,
                                              self.program_stop_cb)

        self.srv_program_pause = rospy.Service('program/pause', Trigger,
                                               self.program_pause_cb)
        self.srv_program_resume = rospy.Service('program/resume', Trigger,
                                                self.program_resume_cb)

        self.srv_learning_start = rospy.Service('learning/start',
                                                ProgramIdTrigger,
                                                self.learning_start_cb)
        self.srv_learning_stop = rospy.Service('learning/stop', Trigger,
                                               self.learning_stop_cb)

        self.srv_learning_start = rospy.Service('/art/brain/visualize/start',
                                                ProgramIdTrigger,
                                                self.visualize_start_cb)
        self.srv_learning_stop = rospy.Service('/art/brain/visualize/stop',
                                               Trigger, self.visualize_stop_cb)

        self.srv_program_error_response = rospy.Service(
            'program/error_response', ProgramErrorResolve,
            self.program_error_response_cb)

        self.as_learning_request = actionlib.SimpleActionServer(
            "learning_request",
            LearningRequestAction,
            execute_cb=self.learning_request_cb,
            auto_start=True)

        self.state_manager = InterfaceStateManager(
            InterfaceState.BRAIN_ID,
            cb=self.interface_state_manager_cb)  # TODO callback?
        self.state_manager.set_system_state(InterfaceState.STATE_INITIALIZING)

        self.art = ArtApiHelper(brain=True)
        self.ph = ProgramHelper()

        self.objects_sub = rospy.Subscriber(
            "/art/object_detector/object_filtered", InstancesArray,
            self.objects_cb)

        # TODO use this topic instead of system_state in InterfaceState (duplication) ??
        # TODO move (pub/sub) to InterfaceStateManager?
        self.state_publisher = rospy.Publisher("system_state",
                                               SystemState,
                                               queue_size=1)

        self.tf_listener = TransformListener()
        self.art.wait_for_api()

        self.get_obj_type_srv_client = ArtBrainUtils.create_service_client(
            '/art/db/object_type/get', getObjectType)
        # self.select_arm_srv_client = ArtBrainUtils.create_service_client(
        #    '/art/fuzzy/select_arm', SelectArm)
        self.clear_all_object_flags_srv_client = ArtBrainUtils.create_service_client(
            '/art/object_detector/flag/clear_all', Empty)
        self.clear_object_flag_srv_client = ArtBrainUtils.create_service_client(
            '/art/object_detector/flag/clear', ObjectFlagClear)
        self.set_object_flag_srv_client = ArtBrainUtils.create_service_client(
            '/art/object_detector/flag/set', ObjectFlagSet)

        # TODO 'hack' for experiment
        self.forearm_enable_srv_client = ArtBrainUtils.create_service_client(
            '/art/object_detector/forearm/enable', Empty)
        self.forearm_disable_srv_client = ArtBrainUtils.create_service_client(
            '/art/object_detector/forearm/disable', Empty)

        self.forearm_disable_srv_client.call()

        r = rospy.Rate(1)
        if not self.system_calibrated or not self.projectors_calibrated:
            self.robot.prepare_for_calibration()
        while not self.system_calibrated:
            if rospy.is_shutdown():
                return
            rospy.loginfo("Waiting for system calibration")
            r.sleep()

        self.calibrate_projectors_srv_client = ArtBrainUtils.create_service_client(
            '/art/interface/projected_gui/calibrate_projectors', Trigger)

        if not self.projectors_calibrated:

            resp = self.calibrate_projectors_srv_client.call()

            if not resp.success:

                rospy.logerr("Failed to start projector calibration: " +
                             resp.message)
                # TODO what to do?

            rospy.loginfo("Waiting for projectors to calibrate...")
            while not self.projectors_calibrated:
                if rospy.is_shutdown():
                    return
                rospy.sleep(1)

        if not self.table_calibrated:
            rospy.loginfo(
                'Waiting for /art/interface/touchtable/calibrate service')
            rospy.wait_for_service('/art/interface/touchtable/calibrate')
            rospy.loginfo('Get /art/interface/touchtable/calibrate service')
            self.calibrate_table_srv_client = ArtBrainUtils.create_service_client(
                '/art/interface/touchtable/calibrate', Empty)

            attempt = 1
            rospy.sleep(1)
            while not self.table_calibrated:
                rospy.loginfo("Trying to calibrate table, attempt " +
                              str(attempt))
                self.calibrate_table_srv_client.call()
                rospy.sleep(1)
                attempt += 1
                while not self.table_calibrated and self.table_calibrating:
                    rospy.sleep(1)
        r = rospy.Rate(1)
        while self.robot.halted and not rospy.is_shutdown():
            rospy.logwarn("Robot halted! Please unhalt!")
            r.sleep()

        self.try_robot_arms_get_ready()
        rospy.loginfo("Brain init done")
        self.initialized = True
        self.fsm.init()
Example #8
0
    def __init__(self):

        origin = rospy.get_param("scene_origin")
        size = rospy.get_param("scene_size")
        rpm = rospy.get_param("rpm")
        port = rospy.get_param("scene_server_port")

        super(UICoreRos, self).__init__(origin[0], origin[1], size[0], size[1],
                                        rpm, port)

        QtCore.QObject.connect(self, QtCore.SIGNAL('objects'),
                               self.object_cb_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('user_status'),
                               self.user_status_cb_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('interface_state'),
                               self.interface_state_evt)

        QtCore.QObject.connect(self,
                               QtCore.SIGNAL('touch_calibration_points_evt'),
                               self.touch_calibration_points_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('touch_detected_evt'),
                               self.touch_detected_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('notify_user_evt'),
                               self.notify_user_evt)
        QtCore.QObject.connect(self,
                               QtCore.SIGNAL('learning_request_done_evt'),
                               self.learning_request_done_evt)

        self.user_state = None

        self.program_list = None
        self.program_vis = None
        self.template = False  # TODO this should be stored in program_vis?
        self.last_prog_pos = (0.2, self.height - 0.2)
        self.last_edited_prog_id = None

        self.ph = ProgramHelper()

        cursors = rospy.get_param("~cursors", [])
        for cur in cursors:
            PoseStampedCursorItem(self.scene, cur)

        TouchTableItem(
            self.scene, '/art/interface/touchtable/touch',
            list(self.get_scene_items_by_type(PoseStampedCursorItem)))

        self.stop_btn = ButtonItem(self.scene, 0, 0, "STOP", None,
                                   self.stop_btn_clicked, 2.0, QtCore.Qt.red)
        self.stop_btn.setPos(
            self.scene.width() - self.stop_btn.boundingRect().width() - 300,
            self.scene.height() - self.stop_btn.boundingRect().height() - 60)
        self.stop_btn.set_enabled(True)

        self.projectors = []

        projs = rospy.get_param("~projectors", [])
        for proj in projs:
            self.projectors.append(ProjectorHelper(proj))

        rospy.loginfo("Waiting for /art/brain/learning_request")
        self.learning_action_cl = actionlib.SimpleActionClient(
            '/art/brain/learning_request', LearningRequestAction)
        self.learning_action_cl.wait_for_server()

        self.art = ArtApiHelper()

        self.projectors_calibrated_pub = rospy.Publisher(
            "~projectors_calibrated", Bool, queue_size=1, latch=True)
        self.projectors_calibrated_pub.publish(False)

        self.start_learning_srv = rospy.ServiceProxy(
            '/art/brain/learning/start',
            startProgram)  # TODO wait for service? where?
        self.stop_learning_srv = rospy.ServiceProxy(
            '/art/brain/learning/stop',
            Trigger)  # TODO wait for service? where?

        self.program_pause_srv = rospy.ServiceProxy('/art/brain/program/pause',
                                                    Trigger)

        self.program_resume_srv = rospy.ServiceProxy(
            '/art/brain/program/resume', Trigger)

        self.program_stop_srv = rospy.ServiceProxy('/art/brain/program/stop',
                                                   Trigger)

        self.emergency_stop_srv = rospy.ServiceProxy(
            '/pr2_ethercat/halt_motors',
            EmptyService)  # TODO wait for service? where?

        self.emergency_stop_reset_srv = rospy.ServiceProxy(
            '/pr2_ethercat/reset_motors',
            EmptyService)  # TODO wait for service? where?

        self.program_error_resolve_srv = rospy.ServiceProxy(
            '/art/brain/program/error_response',
            ProgramErrorResolve)  # TODO wait for service? where?
        self.program_error_dialog = None

        self.grasp_dialog = None

        self.emergency_stopped = False

        rospy.loginfo("Waiting for ART services...")
        self.art.wait_for_api()

        rospy.loginfo("Ready! Starting state machine.")

        # TODO move this to ArtApiHelper ??
        self.obj_sub = rospy.Subscriber('/art/object_detector/object_filtered',
                                        InstancesArray,
                                        self.object_cb,
                                        queue_size=1)
        self.user_status_sub = rospy.Subscriber('/art/user/status',
                                                UserStatus,
                                                self.user_status_cb,
                                                queue_size=1)

        self.touch_points = None
        self.touch_calib_srv = rospy.Service(
            '/art/interface/projected_gui/touch_calibration',
            TouchCalibrationPoints, self.touch_calibration_points_cb)
        self.notify_user_srv = rospy.Service(
            '/art/interface/projected_gui/notify_user', NotifyUser,
            self.notify_user_srv_cb)

        proj_calib = True

        if len(self.projectors) > 0:
            rospy.loginfo("Waiting for projector nodes...")
            for proj in self.projectors:
                proj.wait_until_available()
                if not proj.is_calibrated():
                    proj_calib = False

        if proj_calib:

            rospy.loginfo('Projectors already calibrated.')
            self.projectors_calibrated_pub.publish(True)

        else:

            rospy.loginfo(
                'Projectors not calibrated yet - waiting for command...')

        self.projector_calib_srv = rospy.Service(
            '/art/interface/projected_gui/calibrate_projectors', Trigger,
            self.calibrate_projectors_cb)

        self.state_manager = InterfaceStateManager("PROJECTED UI",
                                                   cb=self.interface_state_cb)
Example #9
0
def main(args):

    if len(args) < 2:

        print "This script needs program id as argument."
        return

    rospy.init_node('plot_program', anonymous=True)

    art = ArtApiHelper()
    ph = ProgramHelper()

    prog = art.load_program(int(args[1]))

    if prog is None:

        print "Failed to load program"
        return

    if not ph.load(prog):

        print "Faulty program"
        return

    A = pgv.AGraph(label="<<B>Program ID: " + str(prog.header.id) + "<br/>" +
                   escape(prog.header.name) + "</B>>",
                   directed=True,
                   strict=False)
    A.graph_attr['outputorder'] = 'edgesfirst'

    A.add_node("start", label="Program start")
    A.add_node("b0i0", label="Program end")

    A.add_edge("start", get_node_name(*ph.get_first_item_id()))

    for block_id in ph.get_block_ids():

        block_msg = ph.get_block_msg(block_id)
        ids = []

        for item_id in ph.get_items_ids(block_id):

            nn = get_node_name(block_id, item_id)
            item_msg = ph.get_item_msg(block_id, item_id)

            osn = get_node_name(*ph.get_id_on_success(block_id, item_id))
            ofn = get_node_name(*ph.get_id_on_failure(block_id, item_id))

            A.add_edge(nn, osn, color="green", constraint=True)
            A.add_edge(nn, ofn, color="red", constraint=True)

            for ref in item_msg.ref_id:

                A.add_edge(get_node_name(block_id, ref),
                           nn,
                           color="gray",
                           style="dashed",
                           key="ref_" + nn + "_" +
                           get_node_name(block_id, ref))

            A.get_node(nn).attr['label'] = 'Item ID: ' + str(
                item_id) + '\n' + get_type_string(item_msg)
            A.get_node(nn).attr['shape'] = 'box'
            A.get_node(nn).attr['style'] = 'rounded'
            ids.append(nn)

        sg = A.subgraph(name="cluster_" + str(block_id),
                        label="<<b>Group ID: " + str(block_id) + "<br/>" +
                        escape(block_msg.name) + "</b>>",
                        color="gray")
        sg.add_nodes_from(ids)

    A.layout(prog='dot')
    A.draw('output.pdf')
Example #10
0
def main(args):

    global setup

    rospy.init_node('setup_init_script', anonymous=True)

    try:
        setup = os.environ["ARTABLE_SETUP"]
    except KeyError:
        rospy.logerr("ARTABLE_SETUP has to be set!")
        return

    api = ArtApiHelper()
    api.wait_for_db_api()

    rospy.loginfo("Refreshing collision environment...")
    api.clear_collision_primitives(setup)

    api.store_object_type(obj_type("desticka", 0.08, 0.08, 0.0125))
    api.store_object_type(
        obj_type("Modry_kontejner", 0.11, 0.165, 0.075, container=True))

    # delete all created programs
    ph = api.get_program_headers()
    if ph:
        for h in ph:
            api.program_clear_ro(h.id)
            api.delete_program(h.id)

    # TODO add parameters
    prog = Program()
    prog.header.id = 1
    prog.header.name = "MSV DEMO"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Pick and place"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pi = ProgramItem()
    pi.id = 1
    pi.on_success = 2
    pi.on_failure = 0
    pi.type = "PickFromPolygon"
    pi.object.append("")
    pi.polygon.append(PolygonStamped())
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 2
    pi.on_success = 1
    pi.on_failure = 0
    pi.type = "PlaceToContainer"
    pi.object.append("")
    pi.polygon.append(PolygonStamped())
    pi.ref_id.append(1)
    pb.items.append(pi)

    api.store_program(prog)

    rospy.loginfo("Done!")
Example #11
0
    def __init__(self):

        origin = rospy.get_param("scene_origin")
        size = rospy.get_param("scene_size")
        rpm = rospy.get_param("rpm")
        port = rospy.get_param("scene_server_port")

        super(UICoreRos, self).__init__(origin[0], origin[1], size[0], size[1],
                                        rpm, port)

        QtCore.QObject.connect(self, QtCore.SIGNAL('objects'),
                               self.object_cb_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('user_status'),
                               self.user_status_cb_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('interface_state'),
                               self.interface_state_evt)

        QtCore.QObject.connect(self,
                               QtCore.SIGNAL('touch_calibration_points_evt'),
                               self.touch_calibration_points_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('touch_detected_evt'),
                               self.touch_detected_evt)
        QtCore.QObject.connect(self, QtCore.SIGNAL('notify_user_evt'),
                               self.notify_user_evt)
        QtCore.QObject.connect(self,
                               QtCore.SIGNAL('learning_request_done_evt'),
                               self.learning_request_done_evt)

        self.user_status = None

        self.fsm = FSM()

        # TODO do this automatically??
        # map callbacks from FSM to this instance
        self.fsm.cb_start_calibration = self.cb_start_calibration
        self.fsm.cb_waiting_for_user = self.cb_waiting_for_user
        self.fsm.cb_program_selection = self.cb_program_selection
        self.fsm.cb_waiting_for_user_calibration = self.cb_waiting_for_user_calibration
        self.fsm.cb_learning = self.cb_learning
        self.fsm.cb_running = self.cb_running
        self.fsm.is_template = self.is_template

        self.program_vis = None
        self.template = False  # TODO this should be stored in program_vis?

        self.state_manager = InterfaceStateManager("PROJECTED UI",
                                                   cb=self.interface_state_cb)
        self.ph = ProgramHelper()

        cursors = rospy.get_param("~cursors", [])
        for cur in cursors:
            PoseStampedCursorItem(self.scene, cur)

        TouchTableItem(
            self.scene, '/art/interface/touchtable/touch',
            list(self.get_scene_items_by_type(PoseStampedCursorItem)))

        self.stop_btn = ButtonItem(self.scene, 0, 0, "STOP", None,
                                   self.stop_btn_clicked, 2.0, QtCore.Qt.red)
        self.stop_btn.setPos(
            self.scene.width() - self.stop_btn.boundingRect().width() - 300,
            self.scene.height() - self.stop_btn.boundingRect().height() - 60)
        self.stop_btn.set_enabled(True)

        self.projectors = []

        projs = rospy.get_param("~projectors", [])
        for proj in projs:
            self.add_projector(proj)

        rospy.loginfo("Waiting for /art/brain/learning_request")
        self.learning_action_cl = actionlib.SimpleActionClient(
            '/art/brain/learning_request', LearningRequestAction)
        self.learning_action_cl.wait_for_server()

        self.art = ArtApiHelper()

        self.projectors_calibrated_pub = rospy.Publisher(
            "~projectors_calibrated", Bool, queue_size=1, latch=True)
        self.projectors_calibrated_pub.publish(False)

        self.start_learning_srv = rospy.ServiceProxy(
            '/art/brain/learning/start',
            Trigger)  # TODO wait for service? where?
        self.stop_learning_srv = rospy.ServiceProxy(
            '/art/brain/learning/stop',
            Trigger)  # TODO wait for service? where?

        self.emergency_stop_srv = rospy.ServiceProxy(
            '/pr2_ethercat/halt_motors',
            EmptyService)  # TODO wait for service? where?

        self.emergency_stop_reset_srv = rospy.ServiceProxy(
            '/pr2_ethercat/reset_motors',
            EmptyService)  # TODO wait for service? where?

        self.program_error_resolve_srv = rospy.ServiceProxy(
            '/art/brain/program/error_response',
            ProgramErrorResolve)  # TODO wait for service? where?
        self.program_error_dialog = None

        self.grasp_dialog = None

        self.emergency_stoped = False
Example #12
0
def main(args):

    rospy.init_node('simple_trolley_init_script', anonymous=True)

    art = ArtApiHelper()
    # art.wait_for_api()

    # delete all created programs
    ph = art.get_program_headers()
    if ph:
        for h in ph:

            art.program_clear_ro(h.id)
            art.delete_program(h.id)

    # -------------------------------------------------------------------------------------------
    # Training program 1
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 1
    prog.header.name = "Trenink - oblast"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Zvedni ze stolu a poloz"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(polygon_item(1))
    pb.items.append(place_item(2, ref_id=[1], on_success=3, on_failure=0))
    pb.items.append(item(3, "GetReady", on_success=4, on_failure=0))
    pb.items.append(wait_item(4, ref_id=[2], on_success=1, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 2
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 2
    prog.header.name = "Trenink - podavac"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Zvedni z podavace a poloz"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(feeder_item(1))
    pb.items.append(place_item(2, ref_id=[1], on_success=3, on_failure=0))
    pb.items.append(feeder_item(3, ref_id=[1]))
    pb.items.append(place_item(4, ref_id=[3], on_success=5, on_failure=0))
    pb.items.append(item(5, "GetReady", on_success=6, on_failure=0))
    pb.items.append(wait_item(6, ref_id=[4], on_success=1, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 3
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 3
    prog.header.name = "Trenink - lepidlo"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Aplikace lepidla"
    pb.on_success = 0
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(drill_item(1, on_success=1, on_failure=2, obj_type=[""]))
    pb.items.append(item(2, "GetReady", on_success=3, on_failure=0))
    pb.items.append(drill_item(3, on_success=3, on_failure=4, obj_type=[""]))
    pb.items.append(item(4, "GetReady", on_success=0, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 4
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 4
    prog.header.name = "Trenink - inspekce"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Vizualni inspekce"
    pb.on_success = 0
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(polygon_item(1))
    pb.items.append(
        visual_inspection_item(2, ref_id=[1], on_success=3, on_failure=5))
    pb.items.append(
        visual_inspection_item(3, ref_id=[1], on_success=4, on_failure=5))
    pb.items.append(
        place_item(4, ref_id=[1], on_success=1, on_failure=0, name="OK parts"))
    pb.items.append(
        place_item(5, ref_id=[1], on_success=1, on_failure=0,
                   name="NOK parts"))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 5
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 5
    prog.header.name = "Trenink - krabice"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Polozeni do krabice"
    pb.on_success = 0
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(polygon_item(1))

    p = ProgramItem()
    p.id = 2
    p.type = "PlaceToContainer"
    p.polygon.append(PolygonStamped())
    p.object.append("")
    p.on_success = 1
    p.on_failure = 0
    p.ref_id.append(1)

    pb.items.append(p)

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Simplified trolley assembly: object types
    # -------------------------------------------------------------------------------------------

    art.store_object_type(obj_type("Spojka", 0.046, 0.046, 0.154))
    art.store_object_type(
        obj_type("Kratka_noha", 0.046, 0.046, 0.298, container=True))
    art.store_object_type(obj_type("Dlouha_noha", 0.046, 0.046, 0.398))
    art.store_object_type(
        obj_type("Modry_kontejner", 0.1, 0.14, 0.08, container=True))

    # -------------------------------------------------------------------------------------------
    # Simplified trolley assembly: program
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 20
    prog.header.name = "Montaz stolicky"

    # --- left side of the trolley ------------------------------------------------------
    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Bocnice 1"
    pb.on_success = 2
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(wait_item(2, on_failure=2))

    # each side consists of four profiles (of two types)
    pb.items.append(feeder_item(3, obj_type=""))
    pb.items.append(place_item(4, ref_id=[3], on_failure=4))

    pb.items.append(feeder_item(5, ref_id=[3]))
    pb.items.append(place_item(6, ref_id=[5], on_failure=6))

    pb.items.append(feeder_item(7, obj_type=""))
    pb.items.append(place_item(8, ref_id=[7], on_failure=8))

    pb.items.append(feeder_item(9, ref_id=[7]))
    pb.items.append(place_item(10, ref_id=[9], on_failure=10))

    # after p&p, let's drill holes
    pb.items.append(drill_item(11, on_success=11, on_failure=13,
                               obj_type=[""]))

    pb.items.append(item(13, "GetReady", on_success=0, on_failure=13))

    # --- right side of the trolley ------------------------------------------------------
    pb = deepcopy(pb)
    pb.id = 2
    pb.name = "Bocnice 2"
    pb.on_success = 3
    pb.on_failure = 0
    prog.blocks.append(pb)

    # --- connecting profiles ------------------------------------------------------------
    pb = ProgramBlock()
    pb.id = 3
    pb.name = "Spojovaci dily"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(wait_item(1, on_success=10, on_failure=1))

    pb.items.append(feeder_item(10, obj_type=""))
    pb.items.append(place_item(11, ref_id=[10], on_failure=11))

    pb.items.append(feeder_item(12, ref_id=[10]))
    pb.items.append(place_item(13, ref_id=[12], on_failure=13))

    pb.items.append(feeder_item(14, ref_id=[10]))
    pb.items.append(place_item(15, ref_id=[14], on_failure=15))

    pb.items.append(feeder_item(16, ref_id=[10]))
    pb.items.append(place_item(17, ref_id=[16], on_failure=17))

    pb.items.append(item(18, "GetReady", on_success=0, on_failure=18))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)
Example #13
0
def main(args):

    rospy.init_node('simple_trolley_init_script', anonymous=True)

    art = ArtApiHelper()
    # art.wait_for_api()

    # delete all created programs
    ph = art.get_program_headers()
    if ph:
        for h in ph:

            art.program_clear_ro(h.id)
            art.delete_program(h.id)

    # -------------------------------------------------------------------------------------------
    # Training program 1
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 1
    prog.header.name = "Training - polygon"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Pick from table and place"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(polygon_item(1))
    pb.items.append(place_item(2, ref_id=[1], on_success=3, on_failure=0))
    pb.items.append(item(3, "GetReady", on_success=4, on_failure=0))
    pb.items.append(wait_item(4, ref_id=[2], on_success=1, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 2
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 2
    prog.header.name = "Training - feeder"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Pick from feeder and place"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(feeder_item(1))
    pb.items.append(place_item(2, ref_id=[1], on_success=3, on_failure=0))
    pb.items.append(feeder_item(3, ref_id=[1]))
    pb.items.append(place_item(4, ref_id=[3], on_success=5, on_failure=0))
    pb.items.append(item(5, "GetReady", on_success=6, on_failure=0))
    pb.items.append(wait_item(6, ref_id=[4], on_success=1, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Training program 3
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 3
    prog.header.name = "Training - glue"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Glue application"
    pb.on_success = 0
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(drill_item(1, on_success=1, on_failure=2, obj_type=[""]))
    pb.items.append(item(2, "GetReady", on_success=3, on_failure=0))
    pb.items.append(drill_item(3, on_success=3, on_failure=4, obj_type=[""]))
    pb.items.append(item(4, "GetReady", on_success=0, on_failure=0))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)

    # -------------------------------------------------------------------------------------------
    # Simplified trolley assembly: object types
    # -------------------------------------------------------------------------------------------

    art.store_object_type(obj_type("Stretcher", 0.046, 0.046, 0.154))
    art.store_object_type(obj_type("ShortLeg", 0.046, 0.046, 0.298))
    art.store_object_type(obj_type("LongLeg", 0.046, 0.046, 0.398))

    # -------------------------------------------------------------------------------------------
    # Simplified trolley assembly: program
    # -------------------------------------------------------------------------------------------

    prog = Program()
    prog.header.id = 4
    prog.header.name = "Stool assembly"

    # --- left side of the trolley ------------------------------------------------------
    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Side 1"
    pb.on_success = 2
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(wait_item(2, on_failure=2))

    # each side consists of four profiles (of two types)
    pb.items.append(feeder_item(3, obj_type=""))
    pb.items.append(place_item(4, ref_id=[3], on_failure=4))

    pb.items.append(feeder_item(5, ref_id=[3]))
    pb.items.append(place_item(6, ref_id=[5], on_failure=6))

    pb.items.append(feeder_item(7, obj_type=""))
    pb.items.append(place_item(8, ref_id=[7], on_failure=8))

    pb.items.append(feeder_item(9, ref_id=[7]))
    pb.items.append(place_item(10, ref_id=[9], on_failure=10))

    # after p&p, let's drill holes
    pb.items.append(drill_item(11, on_success=11, on_failure=13,
                               obj_type=[""]))

    pb.items.append(item(13, "GetReady", on_success=0, on_failure=13))

    # --- right side of the trolley ------------------------------------------------------
    pb = deepcopy(pb)
    pb.id = 2
    pb.name = "Side 2"
    pb.on_success = 3
    pb.on_failure = 0
    prog.blocks.append(pb)

    # --- connecting profiles ------------------------------------------------------------
    pb = ProgramBlock()
    pb.id = 3
    pb.name = "Stretchers"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pb.items.append(wait_item(1, on_success=10, on_failure=1))

    pb.items.append(feeder_item(10, obj_type=""))
    pb.items.append(place_item(11, ref_id=[10], on_failure=11))

    pb.items.append(feeder_item(12, ref_id=[10]))
    pb.items.append(place_item(13, ref_id=[12], on_failure=13))

    pb.items.append(feeder_item(14, ref_id=[10]))
    pb.items.append(place_item(15, ref_id=[14], on_failure=15))

    pb.items.append(feeder_item(16, ref_id=[10]))
    pb.items.append(place_item(17, ref_id=[16], on_failure=17))

    pb.items.append(item(18, "GetReady", on_success=0, on_failure=18))

    art.store_program(prog)
    art.program_set_ro(prog.header.id)
Example #14
0
def main(args):

    global setup

    rospy.init_node('setup_init_script', anonymous=True)

    try:
        setup = os.environ["ARTABLE_SETUP"]
    except KeyError:
        rospy.logerr("ARTABLE_SETUP has to be set!")
        return

    api = ArtApiHelper()
    api.wait_for_db_api()

    rospy.loginfo("Refreshing collision environment...")
    api.clear_collision_primitives(setup)

    table_width = 1.5
    table_depth = 0.7
    api.add_collision_primitive(
        makePrimitive("table", [table_width, table_depth, 0.78], z=-0.78 / 2))

    feeder_depth = 0.35
    feeder_thickness = 0.001
    feeder_front_to_table = 0.15

    # left feeder (1)
    api.add_collision_primitive(
        makePrimitive("lf-front", [feeder_depth, feeder_thickness, 0.175],
                      x=-feeder_depth / 2 - feeder_front_to_table,
                      y=table_depth - 0.495))
    api.add_collision_primitive(
        makePrimitive("lf-middle", [feeder_depth, feeder_thickness, 0.35],
                      x=-feeder_depth / 2 - feeder_front_to_table,
                      y=table_depth - 0.18))
    api.add_collision_primitive(
        makePrimitive("lf-rear", [feeder_depth, feeder_thickness, 0.35],
                      x=-feeder_depth / 2 - feeder_front_to_table,
                      y=table_depth))

    # right feeder (2)
    api.add_collision_primitive(
        makePrimitive("rf-front", [feeder_depth, feeder_thickness, 0.175],
                      x=table_width + feeder_depth / 2 + feeder_front_to_table,
                      y=table_depth - 0.495))
    api.add_collision_primitive(
        makePrimitive("rf-middle", [feeder_depth, feeder_thickness, 0.35],
                      x=table_width + feeder_depth / 2 + feeder_front_to_table,
                      y=table_depth - 0.18))
    api.add_collision_primitive(
        makePrimitive("rf-rear", [feeder_depth, feeder_thickness, 0.35],
                      x=table_width + feeder_depth / 2 + feeder_front_to_table,
                      y=table_depth))

    api.add_collision_primitive(
        makePrimitive("kinect-n1", [0.3, 0.3, 0.3],
                      x=0,
                      y=0,
                      z=0,
                      frame_id="n1_kinect2_link"))
    api.add_collision_primitive(
        makePrimitive("kinect-n2", [0.3, 0.3, 0.3],
                      x=0,
                      y=0,
                      z=0,
                      frame_id="n2_kinect2_link"))

    api.store_object_type(obj_type("Stretcher", 0.046, 0.046, 0.154))
    api.store_object_type(obj_type("ShortLeg", 0.046, 0.046, 0.298))
    api.store_object_type(obj_type("LongLeg", 0.046, 0.046, 0.398))

    api.store_object_type(obj_type("Spojka", 0.046, 0.046, 0.154))
    api.store_object_type(obj_type("Kratka_noha", 0.046, 0.046, 0.298))
    api.store_object_type(obj_type("Dlouha_noha", 0.046, 0.046, 0.398))
    api.store_object_type(
        obj_type("Modry_kontejner", 0.11, 0.165, 0.075, container=True))
    api.store_object_type(
        obj_type("Bily_kontejner_velky", 0.245, 0.37, 0.15, container=True))
    api.store_object_type(
        obj_type("Bily_kontejner_maly", 0.18, 0.245, 0.15, container=True))

    # delete all created programs
    ph = api.get_program_headers()
    if ph:
        for h in ph:
            api.program_clear_ro(h.id)
            api.delete_program(h.id)

    # TODO add parameters
    prog = Program()
    prog.header.id = 1
    prog.header.name = "MSV DEMO"

    pb = ProgramBlock()
    pb.id = 1
    pb.name = "Pick and place"
    pb.on_success = 2
    pb.on_failure = 0
    prog.blocks.append(pb)

    pi = ProgramItem()
    pi.id = 1
    pi.on_success = 2
    pi.on_failure = 0
    pi.type = "PickFromFeeder"
    pi.object.append("")
    pi.pose.append(PoseStamped())
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 2
    pi.on_success = 3
    pi.on_failure = 0
    pi.type = "PlaceToPose"
    pi.pose.append(PoseStamped())
    pi.ref_id.append(1)
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 3
    pi.on_success = 0
    pi.on_failure = 0
    pi.type = "GetReady"
    pb.items.append(pi)

    pb = ProgramBlock()
    pb.id = 2
    pb.name = "Inspect and sort"
    pb.on_success = 1
    pb.on_failure = 0
    prog.blocks.append(pb)

    pi = ProgramItem()
    pi.id = 1
    pi.on_success = 2
    pi.on_failure = 0
    pi.type = "PickFromPolygon"
    pi.object.append("")
    pi.polygon.append(PolygonStamped())
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 2
    pi.on_success = 3
    pi.on_failure = 4
    pi.type = "VisualInspection"
    pi.pose.append(PoseStamped())
    pi.ref_id.append(1)
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 3
    pi.on_success = 5
    pi.on_failure = 0
    pi.type = "PlaceToContainer"
    pi.name = "OK"
    pi.object.append("")
    pi.polygon.append(PolygonStamped())
    pi.ref_id.append(1)
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 4
    pi.on_success = 5
    pi.on_failure = 0
    pi.type = "PlaceToContainer"
    pi.name = "NOK"
    pi.object.append("")
    pi.polygon.append(PolygonStamped())
    pi.ref_id.append(1)
    pb.items.append(pi)

    pi = ProgramItem()
    pi.id = 5
    pi.on_success = 0
    pi.on_failure = 0
    pi.type = "GetReady"
    pb.items.append(pi)

    api.store_program(prog)

    rospy.loginfo("Done!")
Example #15
0
 def __init__(self):
     self.art = ArtApiHelper()