Ejemplo n.º 1
0
    def __init__(self, *args, **kwargs):

        super(PickFromPolygonRun, self).__init__(*args, **kwargs)

        obj_id = None
        try:
            obj_id = self.flags["SELECTED_OBJECT_ID"]
        except KeyError:
            self.logerr("SELECTED_OBJECT_ID flag not set")

        if obj_id is not None:
            self.ui.select_object(obj_id)

            obj = self.ui.get_object(obj_id)  # TODO notif - object type
            if obj is not None:
                self.ui.notif(
                    translate("PickFromPolygon", "Going to pick object ID ") +
                    obj_id + translate("PickFromPolygon", " of type ") +
                    obj.object_type.name +
                    translate("PickFromPolygon", " from polygon."))

        self.ui.add_polygon(translate("PickFromPolygon", "PICK POLYGON"),
                            poly_points=conversions.get_pick_polygon_points(
                                self.ui.ph.get_polygon(
                                    self.block_id, self.instruction_id)[0]),
                            fixed=True)
Ejemplo n.º 2
0
    def __init__(self, *args, **kwargs):

        super(PlaceToGridVis, self).__init__(*args, **kwargs)

        self.ui.select_object_type(self.ph.get_object(*self.cid)[0][0])

        polygons = self.ui.ph.get_polygon(*self.cid)[0]
        poses = self.ui.ph.get_pose(*self.cid)[0]
        object_type_name = self.ui.ph.get_object(*self.cid)[0][0]

        object_type = self.ui.art.get_object_type(object_type_name)

        self.ui.notif(
            translate("PlaceToGrid", "Going to place objects into grid"))
        self.ui.add_square(
            translate("PlaceToGrid", "PLACE SQUARE GRID"),
            self.ui.width / 2,
            self.ui.height / 2,
            0.1,
            0.075,
            object_type,
            poses,
            grid_points=conversions.get_pick_polygon_points(polygons),
            square_changed=self.ui.square_changed,
            fixed=True)
Ejemplo n.º 3
0
    def __init__(self, *args, **kwargs):

        super(PlaceToContainerLearn, self).__init__(*args, **kwargs)

        # TODO check if pick is set?

        if not self.ui.ph.is_object_set(*self.cid):

            if self.editable:
                self.ui.notif(
                    translate("PlaceToContainer", "Select container by tapping on its outline."))

            return

        object_type_name = self.ui.ph.get_object(*self.cid)[0][0]
        self.ui.select_object_type(object_type_name)

        if self.ui.ph.is_polygon_set(*self.cid):

            polygons = self.ui.ph.get_polygon(*self.cid)[0]

            self.ui.add_polygon(
                translate(
                    "PlaceToContainer",
                    "Containers"),
                poly_points=conversions.get_pick_polygon_points(polygons),
                polygon_changed=self.ui.polygon_changed,
                fixed=not self.editable)

            if self.editable:
                self.ui.notif(
                    translate("PlaceToContainer", "Adjust area with containers or select another object type."))
Ejemplo n.º 4
0
    def __init__(self, *args, **kwargs):

        super(PickFromPolygonLearn, self).__init__(*args, **kwargs)

        if not self.ui.ph.is_object_set(*self.cid):

            if self.editable:
                self.ui.notif(
                    translate(
                        "PickFromPolygon",
                        "Select object type to be picked up by tapping on its outline."
                    ))

        else:

            object_type_name = self.ui.ph.get_object(*self.cid)[0][0]
            self.ui.select_object_type(object_type_name)

        if self.ui.ph.is_polygon_set(*self.cid):

            polygons = self.ui.ph.get_polygon(*self.cid)[0]

            self.ui.add_polygon(
                translate("PickFromPolygon", "PICK AREA"),
                poly_points=conversions.get_pick_polygon_points(polygons),
                polygon_changed=self.ui.polygon_changed,
                fixed=not self.editable)

            if self.editable:
                self.ui.notif(
                    translate(
                        "PickFromPolygon",
                        "Adjust pick area or select another object type."))
Ejemplo n.º 5
0
    def __init__(self, *args, **kwargs):

        super(DrillPointsLearn, self).__init__(*args, **kwargs)

        self.drill_dialog = None
        self.drill_pose_idx = 0

        # TODO check if object is to be set here or somewhere else!
        if self.ui.ph.is_object_set(*self.cid):

            self.ui.select_object_type(self.ui.ph.get_object(*self.cid)[0][0])

            if self.editable:
                self.create_drill_dialog()

            if self.ui.ph.is_polygon_set(*self.cid):
                polygons = self.ui.ph.get_polygon(*self.cid)[0]

                self.ui.add_polygon(
                    translate("DrillPoints", "OBJECTS TO BE DRILLED"),
                    poly_points=conversions.get_pick_polygon_points(polygons),
                    polygon_changed=self.ui.polygon_changed,
                    fixed=not self.editable)

        else:

            # TODO pokud nema byt nastaveny v teto instrukci - rict kde je potreba ho nastavit
            # TODO pokud tam neni vybrany, ani nedovolit editaci - neni co editovat
            if self.editable:
                self.ui.notif(
                    translate("DrillPoints",
                              "Select object type to be drilled"))
Ejemplo n.º 6
0
    def __init__(self, *args, **kwargs):

        super(PickFromPolygonVis, self).__init__(*args, **kwargs)

        self.ui.select_object_type(self.ui.ph.get_object(*self.cid)[0][0])

        self.ui.add_polygon(translate("PickFromPolygon", "PICK POLYGON"),
                            poly_points=conversions.get_pick_polygon_points(
                                self.ui.ph.get_polygon(*self.cid)[0]),
                            fixed=True)
Ejemplo n.º 7
0
    def __init__(self, *args, **kwargs):

        super(DrillPointsVis, self).__init__(*args, **kwargs)

        self.ui.select_object_type(self.ui.ph.get_object(*self.cid)[0][0])

        polygons = self.ui.ph.get_polygon(*self.cid)[0]

        self.ui.add_polygon(
            translate("DrillPoints", "Objects to be drilled"),
            poly_points=conversions.get_pick_polygon_points(polygons),
            fixed=True)
Ejemplo n.º 8
0
    def __init__(self, *args, **kwargs):

        super(DrillPointsRun, self).__init__(*args, **kwargs)

        polygons = self.ui.ph.get_polygon(*self.cid)[0]
        poses = self.ui.ph.get_pose(*self.cid)[0]

        try:
            self.ui.select_object(self.flags["SELECTED_OBJECT_ID"])
            self.ui.notif(
                translate(
                    "DrillPoints",
                    "Going to drill hole %1 out of %2 into object %3.").arg(
                        self.flags["DRILLED_HOLE_NUMBER"]).arg(len(poses)).arg(
                            self.flags["SELECTED_OBJECT_ID"]))
        except KeyError as e:
            self.logerr("flag not set: " + str(e))

        self.ui.add_polygon(
            translate("DrillPoints", "Objects to be drilled"),
            poly_points=conversions.get_pick_polygon_points(polygons),
            fixed=True)
Ejemplo n.º 9
0
    def __init__(self, *args, **kwargs):

        super(PlaceToContainerRun, self).__init__(*args, **kwargs)

        obj_id = None
        try:
            obj_id = self.flags["SELECTED_OBJECT_ID"]
        except KeyError:
            self.logerr("SELECTED_OBJECT_ID flag not set")

        cont_id = None
        try:
            cont_id = self.flags["SELECTED_CONTAINER_ID"]
        except KeyError:
            self.logerr("SELECTED_CONTAINER_ID flag not set")

        if cont_id:
            self.ui.select_object(cont_id)

            if obj_id:
                self.ui.notif(translate("PlaceToContainer", "Placing %1 to %2...").arg(obj_id).arg(cont_id))
            else:
                self.ui.notif(translate("PlaceToContainer", "Placing to %1...").arg(cont_id))

        try:
            show_area = self.ui.ih["PlaceToContainer"].gui.params["show_area_run"]
        except KeyError:
            show_area = True

        if show_area:
            self.ui.add_polygon(
                translate(
                    "PlaceToContainer",
                    "Containers"),
                poly_points=conversions.get_pick_polygon_points(
                    self.ui.ph.get_polygon(*self.cid)[0]),
                fixed=True)
Ejemplo n.º 10
0
    def learning_vis(self, block_id, item_id, read_only):

        if not self.ph.item_requires_learning(block_id, item_id):
            self.notif(translate("UICoreRos", "Item has no parameters."))
            return

        self.program_vis.editing_item = not read_only

        # TODO Edit/Done button not visible when there is work in progress!
        if block_id != self.program_vis.block_id or item_id != self.program_vis.item_id:
            self.program_vis.set_active(block_id, item_id)

        msg = self.ph.get_item_msg(block_id, item_id)

        if self.ph.item_learned(block_id, item_id):

            self.notif(
                translate("UICoreRos", "This program item seems to be done"))

        else:

            if msg.type in [
                    ProgIt.PICK_FROM_POLYGON, ProgIt.PICK_FROM_FEEDER,
                    ProgIt.PICK_OBJECT_ID, ProgIt.PLACE_TO_POSE
            ]:
                self.notif(
                    translate("UICoreRos",
                              "Program current manipulation task"))

        if msg.type == ProgIt.PICK_FROM_POLYGON:

            if not self.ph.is_object_set(block_id, item_id):

                self.notif(translate("UICoreRos",
                                     "Select object type to be picked up"),
                           temp=True)

            else:

                self.select_object_type(msg.object[0])

            if self.ph.is_polygon_set(block_id, item_id):
                self.add_polygon(
                    translate("UICoreRos", "PICK POLYGON"),
                    poly_points=conversions.get_pick_polygon_points(msg),
                    polygon_changed=self.polygon_changed,
                    fixed=read_only)

        elif msg.type == ProgIt.PICK_FROM_FEEDER:

            if self.state_manager.state.edit_enabled and self.grasp_dialog is None:
                self.grasp_dialog = DialogItem(self.scene, self.width / 2, 0.1,
                                               "Save gripper pose",
                                               ["Right arm", "Left arm"],
                                               self.save_gripper_pose_cb)

            if self.ph.is_object_set(block_id, item_id):
                self.select_object_type(msg.object[0])
            else:
                self.notif(translate("UICoreRos",
                                     "Select object type to be picked up"),
                           temp=True)

                # TODO show pick pose somehow (arrow??)

        elif msg.type == ProgIt.PICK_OBJECT_ID:
            if self.ph.is_object_set(block_id, item_id):
                self.select_object(msg.object[0])
            else:
                self.notif(translate("UICoreRos",
                                     "Select object to be picked up"),
                           temp=True)

        elif msg.type == ProgIt.PLACE_TO_POSE:

            if not self.ph.is_object_set(block_id, msg.ref_id[0]):

                self.notif(
                    translate("UICoreRos",
                              "Select object to be picked up in ID=") +
                    str(msg.ref_id[0]))

            else:

                # TODO what to do with more than 1 reference?
                ref_msg = self.ph.get_item_msg(block_id, msg.ref_id[0])

                if ref_msg.type == ProgIt.PICK_OBJECT_ID:

                    obj = self.get_object(ref_msg.object[0])
                    object_type = obj.object_type
                    object_id = obj.object_id
                    self.select_object(ref_msg.object[0])

                else:

                    object_type = self.art.get_object_type(ref_msg.object[0])
                    object_id = None
                    self.select_object_type(ref_msg.object[0])

                if self.ph.is_object_set(block_id, msg.ref_id[0]):

                    if self.ph.is_pose_set(block_id, item_id):

                        if object_type is not None:
                            self.add_place(translate("UICoreRos",
                                                     "OBJECT PLACE POSE"),
                                           msg.pose[0],
                                           object_type,
                                           object_id,
                                           place_cb=self.place_pose_changed,
                                           fixed=read_only)
                    else:
                        self.notif(
                            translate("UICoreRos",
                                      "Set where to place picked object"))
                        self.add_place(translate("UICoreRos",
                                                 "OBJECT PLACE POSE"),
                                       self.get_def_pose(),
                                       object_type,
                                       object_id,
                                       place_cb=self.place_pose_changed,
                                       fixed=read_only)

        elif msg.type == ProgIt.PLACE_TO_GRID:

            ref_msg = self.program_vis.get_ref_item(
                msg.ref_id)  # obtaining reference instruction

            if ref_msg.type == ProgIt.PICK_OBJECT_ID:

                obj = self.get_object(ref_msg.object[0])
                object_type = obj.object_type
                self.program_vis.get_current_item().object[0] = obj.object_id

            else:

                object_type = self.art.get_object_type(ref_msg.object[0])
                self.program_vis.get_current_item(
                ).object[0] = ref_msg.object[0]
            self.notif(translate("UICoreRos", "Place grid"))
            self.add_square(
                translate("UICoreRos", "PLACE SQUARE GRID"),
                self.width / 2,
                self.height / 2,
                0.1,
                0.075,
                object_type,
                msg.pose,
                grid_points=conversions.get_pick_polygon_points(msg),
                square_changed=self.square_changed,
                fixed=read_only)
Ejemplo n.º 11
0
    def state_running(self, old_state, state, flags, system_state_changed):

        if system_state_changed:

            if not self.ph.load(self.art.load_program(state.program_id)):

                self.notif(
                    translate("UICoreRos",
                              "Failed to load program from database."))

                # TODO what to do?
                return

            stopped = state.system_state == InterfaceState.STATE_PROGRAM_STOPPED

            self.show_program_vis(readonly=True, stopped=stopped)

            if stopped:
                self.notif(translate("UICoreRos", "Program paused."),
                           temp=True)

            if not stopped and old_state.system_state == InterfaceState.STATE_PROGRAM_STOPPED:
                self.notif(translate("UICoreRos", "Program resumed."),
                           temp=True)

        # ignore not valid states
        if state.block_id == 0 or state.program_current_item.id == 0:
            rospy.logerr("Invalid state!")
            return

        # TODO if the item id is same - do rather update then clear + add everything?
        self.clear_all()

        self.program_vis.set_active(state.block_id,
                                    state.program_current_item.id)
        it = state.program_current_item

        if it.type == ProgIt.GET_READY:

            self.notif(translate("UICoreRos", "Robot is getting ready"))

        elif it.type == ProgIt.WAIT_FOR_USER:

            self.notif(translate("UICoreRos", "Waiting for user"))

        elif it.type == ProgIt.WAIT_UNTIL_USER_FINISHES:

            self.notif(translate("UICoreRos", "Waiting for user to finish"))

        elif it.type == ProgIt.PICK_FROM_POLYGON:

            obj_id = None
            try:
                obj_id = flags["SELECTED_OBJECT_ID"]
            except KeyError:
                rospy.logerr(
                    "PICK_FROM_POLYGON: SELECTED_OBJECT_ID flag not set")

            if obj_id is not None:
                self.select_object(obj_id)

                obj = self.get_object(obj_id)  # TODO notif - object type
                if obj is not None:
                    self.notif(
                        translate("UICoreRos", "Going to pick object ID ") +
                        obj_id + translate("UICoreRos", " of type ") +
                        obj.object_type.name +
                        translate("UICoreRos", " from polygon."))

            self.add_polygon(
                translate("UICoreRos", "PICK POLYGON"),
                poly_points=conversions.get_pick_polygon_points(it),
                fixed=True)

        elif it.type == ProgIt.PICK_FROM_FEEDER:

            # TODO PICK_FROM_FEEDER
            pass

        elif it.type == ProgIt.PICK_OBJECT_ID:

            self.notif(
                translate("UICoreRos", "Picking object with ID=") +
                it.object[0])
            self.select_object(it.object[0])

        elif it.type == ProgIt.PLACE_TO_POSE:

            try:
                obj_id = flags["SELECTED_OBJECT_ID"]
            except KeyError:
                rospy.logerr("PLACE_TO_POSE: SELECTED_OBJECT_ID flag not set")
                return

            obj = self.get_object(obj_id)

            if obj is not None:
                self.add_place(translate("UICoreRos", "OBJECT PLACE POSE"),
                               it.pose[0],
                               obj.object_type,
                               obj_id,
                               fixed=True)

        elif it.type == ProgIt.PLACE_TO_GRID:

            ref_msg = self.program_vis.get_ref_item(
                it.ref_id)  # obtaining reference instruction

            if ref_msg.type == ProgIt.PICK_OBJECT_ID:

                obj = self.get_object(ref_msg.object[0])
                object_type = obj.object_type
                self.program_vis.get_current_item().object[0] = obj.object_id

            else:

                object_type = self.art.get_object_type(ref_msg.object[0])
                self.program_vis.get_current_item(
                ).object[0] = ref_msg.object[0]
            self.notif(
                translate("UICoreRos", "Going to place object into grid"))
            self.add_square(
                translate("UICoreRos", "PLACE SQUARE GRID"),
                self.width / 2,
                self.height / 2,
                0.1,
                0.075,
                object_type,
                it.pose,
                grid_points=conversions.get_pick_polygon_points(it),
                square_changed=self.square_changed,
                fixed=True)
Ejemplo n.º 12
0
    def active_item_switched(self, block_id, item_id, read_only=True):

        rospy.logdebug("Program ID:" + str(self.ph.get_program_id()) +
                       ", active item ID: " + str((block_id, item_id)))

        self.clear_all()

        if item_id is None:
            # TODO hlaska
            return

        self.state_manager.update_program_item(
            self.ph.get_program_id(), block_id,
            self.ph.get_item_msg(block_id, item_id))

        if not self.ph.item_requires_learning(block_id, item_id):

            return

        msg = self.ph.get_item_msg(block_id, item_id)

        if self.ph.item_learned(block_id, item_id):

            self.notif(
                translate("UICoreRos", "This program item seems to be done"))

        else:

            if msg.type in [
                    ProgIt.PICK_FROM_POLYGON, ProgIt.PICK_FROM_FEEDER,
                    ProgIt.PICK_OBJECT_ID, ProgIt.PLACE_TO_POSE
            ]:

                self.notif(
                    translate("UICoreRos",
                              "Program current manipulation task"))

        if msg.type == ProgIt.PICK_FROM_POLYGON:

            if not self.ph.is_object_set(block_id, item_id):

                self.notif(translate("UICoreRos",
                                     "Select object type to be picked up"),
                           temp=True)

            else:

                self.select_object_type(msg.object[0])

            if self.ph.is_polygon_set(block_id, item_id):

                self.add_polygon(
                    translate("UICoreRos", "PICK POLYGON"),
                    poly_points=conversions.get_pick_polygon_points(msg),
                    polygon_changed=self.polygon_changed,
                    fixed=read_only)

        elif msg.type == ProgIt.PICK_FROM_FEEDER:

            if self.ph.is_object_set(block_id, item_id):
                self.select_object_type(msg.object[0])
            else:
                self.notif(translate("UICoreRos",
                                     "Select object type to be picked up"),
                           temp=True)

            # TODO show pick pose somehow (arrow??)

        elif msg.type == ProgIt.PICK_OBJECT_ID:
            if self.ph.is_object_set(block_id, item_id):
                self.select_object(msg.object[0])
            else:
                self.notif(translate("UICoreRos",
                                     "Select object to be picked up"),
                           temp=True)

        elif msg.type == ProgIt.PLACE_TO_POSE:

            if not self.ph.is_object_set(block_id, msg.ref_id[0]):

                self.notif(
                    translate("UICoreRos",
                              "Select object to be picked up in ID=") +
                    str(msg.ref_id[0]))

            else:

                # TODO what to do with more than 1 reference?
                ref_msg = self.ph.get_item_msg(block_id, msg.ref_id[0])

                if ref_msg.type == ProgIt.PICK_OBJECT_ID:

                    obj = self.get_object(ref_msg.object[0])
                    object_type = obj.object_type
                    object_id = obj.object_id
                    self.select_object(ref_msg.object[0])

                else:

                    object_type = self.art.get_object_type(ref_msg.object[0])
                    object_id = None
                    self.select_object_type(ref_msg.object[0])

                if self.ph.is_object_set(block_id, msg.ref_id[0]):

                    if self.ph.is_pose_set(block_id, item_id):

                        if object_type is not None:
                            self.add_place(translate("UICoreRos",
                                                     "OBJECT PLACE POSE"),
                                           msg.pose[0],
                                           object_type,
                                           object_id,
                                           place_cb=self.place_pose_changed,
                                           fixed=read_only)
                    else:
                        self.notif(
                            translate("UICoreRos",
                                      "Set where to place picked object"))
                        self.add_place(translate("UICoreRos",
                                                 "OBJECT PLACE POSE"),
                                       self.get_def_pose(),
                                       object_type,
                                       object_id,
                                       place_cb=self.place_pose_changed,
                                       fixed=read_only)
Ejemplo n.º 13
0
    def interface_state_evt(self, our_state, state, flags):

        # display info/warning/error if there is any - only once (on change)
        if state.error_severity != InterfaceState.NONE and our_state.error_severity != state.error_severity:

            # TODO translate error number to error message
            self.notif(translate("UICoreRos", "Error occured: ") +
                       error_strings.get_error_string(state.error_code),
                       temp=True)

        if state.system_state == InterfaceState.STATE_PROGRAM_FINISHED or state.system_state == InterfaceState.STATE_IDLE:

            self.clear_all()
            self.notif(translate("UICoreRos", "The program is done."),
                       temp=True)
            if state.system_state == InterfaceState.STATE_PROGRAM_FINISHED:
                self.fsm.tr_program_finished()

        elif state.system_state == InterfaceState.STATE_LEARNING:

            # TODO !!
            pass

        elif state.system_state == InterfaceState.STATE_PROGRAM_RUNNING:

            if state.error_severity == InterfaceState.WARNING and self.program_error_dialog is None:

                # TODO translate error number to error message
                self.program_error_dialog = DialogItem(
                    self.scene, self.width / 2, 0.1,
                    translate("UICoreRos", "Handle error: ") +
                    error_strings.get_error_string(state.error_code), [
                        translate("UICoreRos", "Try again"),
                        translate("UICoreRos", "Skip instruction"),
                        translate("UICoreRos", "Fail instruction"),
                        translate("UICoreRos", "End program")
                    ], self.program_error_dialog_cb)

            self.clear_all()

            if self.fsm.state != 'running':

                self.fsm.tr_running()

                # TODO handle this - display ProgramItem (if it's not already
                # displayed), load proper program (if not loaded) etc.

                return

            self.program_vis.set_active(state.block_id,
                                        state.program_current_item.id)
            it = state.program_current_item

            if it.type == ProgIt.GET_READY:

                self.notif(translate("UICoreRos", "Robot is getting ready"))

            elif it.type == ProgIt.WAIT_FOR_USER:

                self.notif(translate("UICoreRos", "Waiting for user"))

            elif it.type == ProgIt.WAIT_UNTIL_USER_FINISHES:

                self.notif(translate("UICoreRos",
                                     "Waiting for user to finish"))

            elif it.type == ProgIt.PICK_FROM_POLYGON:

                obj_id = None
                try:
                    obj_id = flags["SELECTED_OBJECT_ID"]
                except KeyError:
                    rospy.logerr(
                        "PICK_FROM_POLYGON: SELECTED_OBJECT_ID flag not set")

                if obj_id is not None:

                    self.select_object(obj_id)

                    obj = self.get_object(obj_id)  # TODO notif - object type
                    self.notif(
                        translate("UICoreRos", "Going to pick object ID ") +
                        obj_id + translate("UICoreRos", " of type ") +
                        obj.object_type.name +
                        translate("UICoreRos", " from polygon."))

                self.add_polygon(
                    translate("UICoreRos", "PICK POLYGON"),
                    poly_points=conversions.get_pick_polygon_points(it),
                    fixed=True)

            elif it.type == ProgIt.PICK_FROM_FEEDER:

                # TODO PICK_FROM_FEEDER
                pass

            elif it.type == ProgIt.PICK_OBJECT_ID:

                self.notif(
                    translate("UICoreRos", "Picking object with ID=") +
                    it.object[0])
                self.select_object(it.object[0])

            elif it.type == ProgIt.PLACE_TO_POSE:

                try:
                    obj_id = flags["SELECTED_OBJECT_ID"]
                except KeyError:
                    rospy.logerr(
                        "PLACE_TO_POSE: SELECTED_OBJECT_ID flag not set")
                    return

                obj = self.get_object(obj_id)

                if obj is not None:
                    self.add_place(translate("UICoreRos", "OBJECT PLACE POSE"),
                                   it.pose[0],
                                   obj.object_type,
                                   obj_id,
                                   fixed=True)
                else:
                    # TODO what to do if brain wants to manipulate with
                    # non-existent object?
                    pass