Exemple #1
0
def setup_statemachine(robot):
    sm = smach.StateMachine(outcomes=['Done', 'Aborted'])

    with sm:
        # Start challenge via StartChallengeRobust
        smach.StateMachine.add("START_CHALLENGE_ROBUST",
                               states.StartChallengeRobust(
                                   robot, STARTING_POINT),
                               transitions={
                                   "Done": "GO_TO_INTERMEDIATE_WAYPOINT",
                                   "Aborted": "GO_TO_INTERMEDIATE_WAYPOINT",
                                   "Failed": "GO_TO_INTERMEDIATE_WAYPOINT"
                               })
        # There is no transition to Failed in StartChallengeRobust (28 May)

        smach.StateMachine.add('GO_TO_INTERMEDIATE_WAYPOINT',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(robot,
                                                        id=INTERMEDIATE_1),
                                   radius=0.5),
                               transitions={
                                   'arrived':
                                   'ASK_CONTINUE',
                                   'unreachable':
                                   'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1',
                                   'goal_not_defined':
                                   'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1'
                               })

        smach.StateMachine.add('GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(robot,
                                                        id=INTERMEDIATE_2),
                                   radius=0.5),
                               transitions={
                                   'arrived':
                                   'ASK_CONTINUE',
                                   'unreachable':
                                   'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP2',
                                   'goal_not_defined':
                                   'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP2'
                               })

        smach.StateMachine.add('GO_TO_INTERMEDIATE_WAYPOINT_BACKUP2',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(robot,
                                                        id=INTERMEDIATE_3),
                                   radius=0.5),
                               transitions={
                                   'arrived': 'ASK_CONTINUE',
                                   'unreachable': 'ASK_CONTINUE',
                                   'goal_not_defined': 'ASK_CONTINUE'
                               })

        smach.StateMachine.add("ASK_CONTINUE",
                               states.AskContinue(robot, 30),
                               transitions={
                                   'continue': 'SAY_CONTINUEING',
                                   'no_response': 'SAY_CONTINUEING'
                               })

        smach.StateMachine.add(
            'SAY_CONTINUEING',
            states.Say(robot, [
                "I heard continue, so I will move to the exit now. See you guys later!"
            ],
                       block=False),
            transitions={'spoken': 'GO_TO_EXIT'})

        # Amigo goes to the exit (waypoint stated in knowledge base)
        smach.StateMachine.add('GO_TO_EXIT',
                               states.NavigateToWaypoint(robot,
                                                         EntityByIdDesignator(
                                                             robot, id=EXIT_1),
                                                         radius=0.7),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'GO_TO_EXIT_2',
                                   'goal_not_defined': 'GO_TO_EXIT_2'
                               })

        smach.StateMachine.add('GO_TO_EXIT_2',
                               states.NavigateToWaypoint(robot,
                                                         EntityByIdDesignator(
                                                             robot, id=EXIT_2),
                                                         radius=0.5),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'GO_TO_EXIT_3',
                                   'goal_not_defined': 'GO_TO_EXIT_3'
                               })

        smach.StateMachine.add('GO_TO_EXIT_3',
                               states.NavigateToWaypoint(robot,
                                                         EntityByIdDesignator(
                                                             robot, id=EXIT_3),
                                                         radius=0.5),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'RESET_ED_TARGET',
                                   'goal_not_defined': 'AT_END'
                               })

        smach.StateMachine.add('RESET_ED_TARGET',
                               states.ResetED(robot),
                               transitions={'done': 'GO_TO_EXIT'})

        # Finally amigo will stop and says 'goodbye' to show that he's done.
        smach.StateMachine.add('AT_END',
                               states.Say(robot, "Goodbye"),
                               transitions={'spoken': 'Done'})

    analyse_designators(sm, "rips")
    return sm
Exemple #2
0
    def __init__(self, robot):
        """ Initialization method

        :param robot: robot api object
        """
        smach.StateMachine.__init__(
            self, outcomes=["succeeded", "failed", "aborted"])

        # Create designators
        trashbin_designator = ds.EdEntityDesignator(
            robot=robot,
            id=CHALLENGE_KNOWLEDGE.trashbin_id,
            name='trashbin_designator')

        # Look if there is a second trash bin present
        # trashbin_designator2 = None
        if hasattr(CHALLENGE_KNOWLEDGE, "trashbin_id2"):
            trashbin_designator2 = ds.EdEntityDesignator(
                robot=robot,
                id=CHALLENGE_KNOWLEDGE.trashbin_id2,
                name='trashbin_designator2')
            next_state = "HELPER_WAYPOINT"
            rospy.loginfo("There is a second trash bin")
        else:
            rospy.loginfo("There is no second trash bin")
            next_state = "ANNOUNCE_END"

        # drop_zone_designator = ds.EdEntityDesignator(robot=robot, id=CHALLENGE_KNOWLEDGE.drop_zone_id)
        helper_waypoint_designator = ds.EdEntityDesignator(
            robot=robot, id=CHALLENGE_KNOWLEDGE.helper_waypoint)
        end_waypoint_designator = ds.EdEntityDesignator(
            robot=robot, id=CHALLENGE_KNOWLEDGE.end_waypoint)
        arm_designator = self.empty_arm_designator = ds.UnoccupiedArmDesignator(
            robot, {}, name="empty_arm_designator")

        with self:
            smach.StateMachine.add("START_CHALLENGE_ROBUST",
                                   states.StartChallengeRobust(
                                       robot,
                                       CHALLENGE_KNOWLEDGE.starting_point),
                                   transitions={
                                       "Done": "SAY_START_CHALLENGE",
                                       "Aborted": "SAY_START_CHALLENGE",
                                       "Failed": "SAY_START_CHALLENGE"
                                   })

            smach.StateMachine.add("SAY_START_CHALLENGE",
                                   states.Say(
                                       robot,
                                       "I will start cleaning up the trash",
                                       block=True),
                                   transitions={'spoken': "PICK_UP_TRASH"})

            smach.StateMachine.add("PICK_UP_TRASH",
                                   PickUpTrash(
                                       robot=robot,
                                       trashbin_designator=trashbin_designator,
                                       arm_designator=arm_designator),
                                   transitions={
                                       "succeeded": "DROP_DOWN_TRASH",
                                       "failed": "HELPER_WAYPOINT",
                                       "aborted": "ANNOUNCE_END"
                                   })

            smach.StateMachine.add(
                "DROP_DOWN_TRASH",
                DropDownTrash(robot=robot,
                              drop_zone_id=CHALLENGE_KNOWLEDGE.drop_zone_id),
                transitions={
                    "succeeded": "ANNOUNCE_TASK",
                    "failed": "failed",
                    "aborted": "aborted"
                })

            smach.StateMachine.add(
                "ANNOUNCE_TASK",
                states.Say(robot,
                           "First bag has been dropped at the collection zone",
                           block=False),
                transitions={'spoken': next_state})

            if next_state == "HELPER_WAYPOINT":

                smach.StateMachine.add(
                    "HELPER_WAYPOINT",
                    states.NavigateToWaypoint(
                        robot=robot,
                        waypoint_designator=helper_waypoint_designator),
                    transitions={
                        "arrived": "PICK_UP_TRASH2",
                        "goal_not_defined": "PICK_UP_TRASH2",
                        "unreachable": "PICK_UP_TRASH2"
                    })

                smach.StateMachine.add(
                    "PICK_UP_TRASH2",
                    PickUpTrash(robot=robot,
                                trashbin_designator=trashbin_designator2,
                                arm_designator=arm_designator),
                    transitions={
                        "succeeded": "DROP_DOWN_TRASH2",
                        "failed": "ANNOUNCE_END",
                        "aborted": "ANNOUNCE_END"
                    })

                smach.StateMachine.add(
                    "DROP_DOWN_TRASH2",
                    DropDownTrash(
                        robot=robot,
                        drop_zone_id=CHALLENGE_KNOWLEDGE.drop_zone_id),
                    transitions={
                        "succeeded": "ANNOUNCE_TASK2",
                        "failed": "failed",
                        "aborted": "aborted"
                    })

                smach.StateMachine.add(
                    "ANNOUNCE_TASK2",
                    states.Say(
                        robot,
                        "Second bag has been dropped at the collection zone."
                        "All the thrash has been taken care of",
                        block=False),
                    transitions={'spoken': 'ANNOUNCE_END'})

            smach.StateMachine.add("ANNOUNCE_END",
                                   states.Say(
                                       robot,
                                       "I have finished taking out the trash.",
                                       block=False),
                                   transitions={'spoken': 'NAVIGATE_OUT'})

            smach.StateMachine.add(
                "NAVIGATE_OUT",
                states.NavigateToWaypoint(
                    robot=robot, waypoint_designator=end_waypoint_designator),
                transitions={
                    "arrived": "succeeded",
                    "goal_not_defined": "succeeded",
                    "unreachable": "succeeded"
                })
Exemple #3
0
    def __init__(self, robot):
        smach.StateMachine.__init__(self, outcomes=["Done", "Aborted"])

        hmi_result_des = ds.VariableDesignator(resolve_type=HMIResult)
        information_point_id_designator = ds.FuncDesignator(ds.AttrDesignator(
            hmi_result_des, "semantics", resolve_type=unicode),
                                                            str,
                                                            resolve_type=str)
        information_point_designator = ds.EdEntityDesignator(
            robot, id_designator=information_point_id_designator)

        with self:
            single_item = InformMachine(robot)

            if START_ROBUST:
                smach.StateMachine.add("START_CHALLENGE",
                                       states.StartChallengeRobust(
                                           robot, INITIAL_POSE_ID),
                                       transitions={
                                           "Done": "ASK_WHERE_TO_GO",
                                           "Aborted": "Aborted",
                                           "Failed": "Aborted"
                                       })

                smach.StateMachine.add(
                    "ASK_WHERE_TO_GO",
                    states.Say(
                        robot,
                        "Near which furniture object should I go to start guiding people?"
                    ),
                    transitions={"spoken": "WAIT_WHERE_TO_GO"})

                smach.StateMachine.add(
                    "WAIT_WHERE_TO_GO",
                    states.HearOptionsExtra(
                        robot=robot,
                        spec_designator=ds.Designator(
                            initial_value=START_GRAMMAR),
                        speech_result_designator=hmi_result_des.writeable),
                    transitions={
                        "heard": "ASK_CONFIRMATION",
                        "no_result": "ASK_WHERE_TO_GO"
                    })  # ToDo: add fallbacks #option: STORE_STARTING_POSE

                smach.StateMachine.add(
                    "ASK_CONFIRMATION",
                    states.Say(robot, [
                        "I hear that you would like me to start the tours at"
                        " the {place}, is this correct?"
                    ],
                               place=information_point_id_designator,
                               block=True),
                    transitions={"spoken": "CONFIRM_LOCATION"})

                smach.StateMachine.add("CONFIRM_LOCATION",
                                       states.HearOptions(
                                           robot=robot, options=["yes", "no"]),
                                       transitions={
                                           "yes": "MOVE_OUT_OF_MY_WAY",
                                           "no": "ASK_WHERE_TO_GO",
                                           "no_result": "ASK_WHERE_TO_GO"
                                       })

                smach.StateMachine.add(
                    "MOVE_OUT_OF_MY_WAY",
                    states.Say(robot,
                               "Please move your ass so I can get going!"),
                    transitions={"spoken": "TC_MOVE_TIME"})

                smach.StateMachine.add("TC_MOVE_TIME",
                                       states.WaitTime(robot=robot,
                                                       waittime=3),
                                       transitions={
                                           "waited": "NAV_TO_START",
                                           "preempted": "Aborted"
                                       })

                smach.StateMachine.add(
                    "NAV_TO_START",
                    states.NavigateToSymbolic(
                        robot=robot,
                        entity_designator_area_name_map={
                            information_point_designator: "in_front_of"
                        },
                        entity_lookat_designator=information_point_designator),
                    transitions={
                        "arrived": "TURN_AROUND",
                        "unreachable": "WAIT_NAV_BACKUP",
                        "goal_not_defined": "Aborted"
                    })  # If this happens: never mind

                smach.StateMachine.add("WAIT_NAV_BACKUP",
                                       states.WaitTime(robot, 3.0),
                                       transitions={
                                           "waited": "NAV_TO_START_BACKUP",
                                           "preempted": "Aborted"
                                       })

                smach.StateMachine.add(
                    "NAV_TO_START_BACKUP",
                    states.NavigateToSymbolic(
                        robot=robot,
                        entity_designator_area_name_map={
                            information_point_designator: "near"
                        },
                        entity_lookat_designator=information_point_designator),
                    transitions={
                        "arrived": "TURN_AROUND",
                        "unreachable":
                        "SAY_CANNOT_REACH_WAYPOINT",  # Current pose backup
                        "goal_not_defined": "Aborted"
                    })  # If this happens: never mind

                @smach.cb_interface(outcomes=["done"])
                def _turn_around(userdata=None):
                    """ Turns the robot approximately 180 degrees around """
                    v_th = 0.5
                    robot.base.force_drive(vx=0.0,
                                           vy=0.0,
                                           vth=v_th,
                                           timeout=math.pi / v_th)
                    return "done"

                smach.StateMachine.add(
                    "TURN_AROUND",
                    smach.CBState(_turn_around),
                    transitions={"done": "STORE_STARTING_POSE"})

                smach.StateMachine.add(
                    "SAY_CANNOT_REACH_WAYPOINT",
                    states.Say(
                        robot, "I am not able to reach the starting point."
                        "I'll use this as starting point"),
                    transitions={"spoken": "STORE_STARTING_POSE"})
            else:
                smach.StateMachine.add("INITIALIZE",
                                       states.Initialize(robot),
                                       transitions={
                                           "initialized":
                                           "STORE_STARTING_POSE",
                                           "abort": "Aborted"
                                       })

            ## This is purely for a back up scenario until the range iterator
            @smach.cb_interface(outcomes=["succeeded"])
            def store_pose(userdata=None):
                base_loc = robot.base.get_location()
                base_pose = base_loc.frame
                location_id = INFORMATION_POINT_ID
                robot.ed.update_entity(id=location_id,
                                       frame_stamped=FrameStamped(
                                           base_pose, "/map"),
                                       type="waypoint")

                return "succeeded"

            smach.StateMachine.add("STORE_STARTING_POSE",
                                   smach.CBState(store_pose),
                                   transitions={"succeeded": "RANGE_ITERATOR"})

            # Begin setup iterator
            # The exhausted argument should be set to the prefered state machine outcome
            range_iterator = smach.Iterator(
                outcomes=["succeeded",
                          "failed"],  # Outcomes of the iterator state
                input_keys=[],
                output_keys=[],
                it=lambda: range(1000),
                it_label="index",
                exhausted_outcome="succeeded")

            with range_iterator:
                smach.Iterator.set_contained_state(
                    "SINGLE_ITEM",
                    single_item,
                    loop_outcomes=["succeeded", "failed"])

            smach.StateMachine.add("RANGE_ITERATOR", range_iterator, {
                "succeeded": "AT_END",
                "failed": "Aborted"
            })
            # End setup iterator

            smach.StateMachine.add("AT_END",
                                   states.Say(robot, "Goodbye"),
                                   transitions={"spoken": "Done"})
    def __init__(self, robot):
        smach.StateMachine.__init__(self, outcomes=['Done', 'Aborted'])

        # Create designators
        grasp_designator1 = ds.EdEntityDesignator(robot, type="temp")
        grasp_designator2 = ds.EdEntityDesignator(robot, type="temp")
        grasp_designator3 = ds.EdEntityDesignator(robot, type="temp")

        start_pose = robot.base.get_location()
        start_x = start_pose.frame.p.x()
        start_y = start_pose.frame.p.y()
        start_rz = start_pose.frame.M.GetRPY()[2]

        with self:
            # Start challenge via StartChallengeRobust
            smach.StateMachine.add("START_CHALLENGE_ROBUST",
                                   states.StartChallengeRobust(robot, STARTING_POINT, use_entry_points=True),
                                   transitions={"Done": "GO_TO_INTERMEDIATE_WAYPOINT",
                                                "Aborted": "GO_TO_INTERMEDIATE_WAYPOINT",
                                                "Failed": "GO_TO_INTERMEDIATE_WAYPOINT"})
            # There is no transition to Failed in StartChallengeRobust (28 May)

            smach.StateMachine.add('GO_TO_INTERMEDIATE_WAYPOINT',
                                   states.NavigateToWaypoint(robot, EntityByIdDesignator(robot, id=INTERMEDIATE_1),
                                                             radius=0.5),
                                   transitions={'arrived': 'ANNOUNCEMENT',
                                                'unreachable': 'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1',
                                                'goal_not_defined': 'GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1'})
            smach.StateMachine.add('GO_TO_INTERMEDIATE_WAYPOINT_BACKUP1',
                                   states.NavigateToWaypoint(robot, EntityByIdDesignator(robot, id=INTERMEDIATE_1),
                                                             radius=0.7),
                                   transitions={'arrived': 'ANNOUNCEMENT',
                                                'unreachable': 'ANNOUNCEMENT',
                                                'goal_not_defined': 'ANNOUNCEMENT'})

            # Part I: Set a table
            smach.StateMachine.add('ANNOUNCEMENT',
                                   states.Say(robot, "Let's see if my master has a task for me! ", block=True),
                                   transitions={'spoken': 'FETCH_COMMAND_I'})

            smach.StateMachine.add('FETCH_COMMAND_I',  # Hear "set the table"
                                   HearFetchCommand(robot, 15.0, "set"),
                                   transitions={'done': 'ASK_FOR_MEAL'})

            smach.StateMachine.add('ASK_FOR_MEAL',
                                   states.Say(robot, "What should I serve, master?", block=True),
                                   transitions={'spoken': 'GET_ORDER'})

            smach.StateMachine.add('GET_ORDER',
                                   GetBreakfastOrder(robot, knowledge.options,
                                                     grasp_designator1,
                                                     grasp_designator2,
                                                     grasp_designator3,
                                                     timeout=15.0),
                                   transitions={'done': 'SET_THE_TABLE'})

            smach.StateMachine.add('SET_THE_TABLE',  # Take order and Set the table (bring the objects to the table)
                                   ManipulateMachine(robot=robot,
                                                     grasp_designator1=grasp_designator1,
                                                     grasp_designator2=grasp_designator2,
                                                     grasp_designator3=grasp_designator3,
                                                     grasp_furniture_id1=knowledge.grasp_furniture_id1,
                                                     grasp_furniture_id2=knowledge.grasp_furniture_id2,
                                                     place_furniture_id=knowledge.place_furniture_id),
                                   transitions={'succeeded': 'ANNOUNCE_TASK_COMPLETION',
                                                'failed': 'RETURN_TO_START_2'})

            smach.StateMachine.add('ANNOUNCE_TASK_COMPLETION',
                                   states.Say(robot, "The table is set! Moving to the meeting point for the next task.",
                                              block=False),
                                   transitions={'spoken': 'RETURN_TO_START_2'})

            # Part II: Clean the table
            smach.StateMachine.add('RETURN_TO_START_2',
                                   states.NavigateToPose(robot=robot, x=start_x, y=start_y, rz=start_rz, radius=0.3),
                                   transitions={'arrived': 'FETCH_COMMAND_II',
                                                'unreachable': 'FETCH_COMMAND_II',
                                                'goal_not_defined': 'FETCH_COMMAND_II'})

            smach.StateMachine.add('FETCH_COMMAND_II',  # Hear "clear up the table"
                                   HearFetchCommand(robot, 15.0, "clear"),
                                   transitions={'done': 'CLEAR_UP'})

            smach.StateMachine.add('CLEAR_UP',  # Clear the table
                                   ClearManipulateMachine(robot=robot, grasp_furniture_id=knowledge.place_furniture_id,
                                                          place_furniture_id1=knowledge.grasp_furniture_id1,
                                                          place_furniture_id2=knowledge.grasp_furniture_id2),
                                   transitions={'succeeded': 'END_CHALLENGE',
                                                'failed': 'END_CHALLENGE'})

            # End
            smach.StateMachine.add('END_CHALLENGE',
                                   states.Say(robot, "I am done here"),
                                   transitions={'spoken': 'Done'})

            ds.analyse_designators(self, "set_a_table")
def setup_statemachine(robot):

    sm = smach.StateMachine(outcomes=['Done', 'Aborted'])

    with sm:

        # Start challenge via StartChallengeRobust
        smach.StateMachine.add("START_CHALLENGE_ROBUST",
                               states.StartChallengeRobust(
                                   robot,
                                   challenge_knowledge.starting_point,
                                   use_entry_points=True),
                               transitions={
                                   "Done": "SAY_GOTO_TARGET2",
                                   "Aborted": "SAY_GOTO_TARGET2",
                                   "Failed": "SAY_GOTO_TARGET2"
                               })

        smach.StateMachine.add(
            'SAY_GOTO_TARGET1',
            states.Say(robot, [
                "I will go to target 1 now", "I will now go to target 1",
                "Lets go to target 1", "Going to target 1"
            ],
                       block=False),
            transitions={'spoken': 'GOTO_TARGET1'})

        ######################################################################################################################################################
        #
        #                                                       TARGET 1
        #
        ######################################################################################################################################################

        smach.StateMachine.add('GOTO_TARGET1',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target1),
                                   challenge_knowledge.target1_radius1),
                               transitions={
                                   'arrived': 'SAY_TARGET1_REACHED',
                                   'unreachable': 'RESET_ED_TARGET1',
                                   'goal_not_defined': 'RESET_ED_TARGET1'
                               })

        smach.StateMachine.add(
            'SAY_TARGET1_REACHED',
            states.Say(robot, [
                "Reached target 1", "I have arrived at target 1",
                "I am now at target 1"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_TARGET3'})

        smach.StateMachine.add('RESET_ED_TARGET1',
                               states.ResetED(robot),
                               transitions={'done': 'GOTO_TARGET1_BACKUP'})

        smach.StateMachine.add('GOTO_TARGET1_BACKUP',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target1),
                                   challenge_knowledge.target1_radius2),
                               transitions={
                                   'arrived': 'SAY_TARGET1_REACHED',
                                   'unreachable': 'TIMEOUT1',
                                   'goal_not_defined': 'TIMEOUT1'
                               })

        smach.StateMachine.add('TIMEOUT1',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds),
                               transitions={
                                   'not_yet': 'GOTO_TARGET1',
                                   'time_out': 'SAY_TARGET1_FAILED'
                               })

        # Should we mention that we failed???
        smach.StateMachine.add(
            'SAY_TARGET1_FAILED',
            states.Say(robot, [
                "I am not able to reach target 1", "I cannot reach target 1",
                "Target 1 is unreachable"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_TARGET3'})

        ######################################################################################################################################################
        #
        #                                                       TARGET 2
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'SAY_GOTO_TARGET2',
            states.Say(robot, [
                "I will go to target 2 now", "I will now go to target 2",
                "Lets go to target 2", "Going to target 2"
            ],
                       block=False),
            transitions={'spoken': 'GOTO_TARGET2_PRE'})

        smach.StateMachine.add(
            'GOTO_TARGET2_PRE',
            states.NavigateToWaypoint(
                robot,
                EntityByIdDesignator(robot,
                                     id=challenge_knowledge.target2_pre),
                challenge_knowledge.target2_pre_radius1,
                EntityByIdDesignator(robot, id=challenge_knowledge.target2)),
            transitions={
                'arrived': 'GOTO_TARGET2',
                'unreachable': 'TIMEOUT2',
                'goal_not_defined': 'TIMEOUT2'
            })

        smach.StateMachine.add('GOTO_TARGET2',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target2),
                                   challenge_knowledge.target2_radius1),
                               transitions={
                                   'arrived': 'SAY_TARGET2_REACHED',
                                   'unreachable': 'DETERMINE_OBJECT',
                                   'goal_not_defined': 'DETERMINE_OBJECT'
                               })

        smach.StateMachine.add(
            'DETERMINE_OBJECT',
            DetermineObject(robot, challenge_knowledge.target2,
                            challenge_knowledge.target2_obstacle_radius),
            transitions={
                'done': 'GOTO_TARGET2_AGAIN',
                'timeout': 'GOTO_TARGET2_AGAIN'
            })

        smach.StateMachine.add('GOTO_TARGET2_AGAIN',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target2),
                                   challenge_knowledge.target2_radius1),
                               transitions={
                                   'arrived': 'SAY_TARGET2_REACHED',
                                   'unreachable': 'RESET_ED_TARGET2',
                                   'goal_not_defined': 'RESET_ED_TARGET2'
                               })

        smach.StateMachine.add(
            'SAY_TARGET2_REACHED',
            states.Say(robot, [
                "Reached target 2", "I have arrived at target 2",
                "I am now at target 2"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_TARGET1'})

        smach.StateMachine.add('RESET_ED_TARGET2',
                               states.ResetED(robot),
                               transitions={'done': 'GOTO_TARGET2_BACKUP'})

        smach.StateMachine.add('GOTO_TARGET2_BACKUP',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target2),
                                   challenge_knowledge.target2_radius2),
                               transitions={
                                   'arrived': 'SAY_TARGET2_REACHED',
                                   'unreachable': 'TIMEOUT2',
                                   'goal_not_defined': 'TIMEOUT2'
                               })

        smach.StateMachine.add('TIMEOUT2',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds),
                               transitions={
                                   'not_yet': 'GOTO_TARGET2_PRE',
                                   'time_out': 'SAY_TARGET2_FAILED'
                               })

        smach.StateMachine.add(
            'SAY_TARGET2_FAILED',
            states.Say(robot, [
                "I am unable to reach target 2", "I cannot reach target 2",
                "Target 2 is unreachable"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_TARGET1'})

        ######################################################################################################################################################
        #
        #                                                       TARGET 3
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'SAY_GOTO_TARGET3',
            states.Say(robot, [
                "I will go to target 3 now", "I will now go to target 3",
                "Lets go to target 3", "Going to target 3"
            ],
                       block=False),
            transitions={'spoken': 'GOTO_TARGET3'})

        smach.StateMachine.add('GOTO_TARGET3',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target3),
                                   challenge_knowledge.target3_radius1),
                               transitions={
                                   'arrived': 'SAY_TARGET3_REACHED',
                                   'unreachable': 'RESET_ED_TARGET3',
                                   'goal_not_defined': 'RESET_ED_TARGET3'
                               })

        smach.StateMachine.add(
            'SAY_TARGET3_REACHED',
            states.Say(robot, [
                "Reached target 3", "I have arrived at target 3",
                "I am now at target 3"
            ],
                       block=True),
            transitions={'spoken': 'TURN'})

        smach.StateMachine.add('RESET_ED_TARGET3',
                               states.ResetED(robot),
                               transitions={'done': 'GOTO_TARGET3_BACKUP'})

        smach.StateMachine.add('GOTO_TARGET3_BACKUP',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target3),
                                   challenge_knowledge.target3_radius2),
                               transitions={
                                   'arrived': 'SAY_TARGET3_REACHED',
                                   'unreachable': 'TIMEOUT3',
                                   'goal_not_defined': 'TIMEOUT3'
                               })

        smach.StateMachine.add('TIMEOUT3',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds),
                               transitions={
                                   'not_yet': 'GOTO_TARGET3',
                                   'time_out': 'SAY_TARGET3_FAILED'
                               })

        # Should we mention that we failed???
        smach.StateMachine.add(
            'SAY_TARGET3_FAILED',
            states.Say(robot, [
                "I am unable to reach target 3", "I cannot reach target 3",
                "Target 3 is unreachable"
            ],
                       block=True),
            transitions={'spoken': 'TURN'})

        ######################################################################################################################################################
        #
        #                                                       Follow waiter
        #
        ######################################################################################################################################################

        smach.StateMachine.add('TURN',
                               Turn(robot, challenge_knowledge.rotation),
                               transitions={'turned': 'SAY_STAND_IN_FRONT'})
        smach.StateMachine.add(
            'SAY_STAND_IN_FRONT',
            states.Say(robot,
                       "Please stand in front of me!",
                       block=True,
                       look_at_standing_person=True),
            transitions={'spoken': 'FOLLOW_WITH_DOOR_CHECK'})

        # TODO: Fix concurrence
        door_id_designator = VariableDesignator(
            challenge_knowledge.target_door_1)
        open_door_wp1_des = VariableDesignator(resolve_type=str)
        open_door_wp2_des = VariableDesignator(resolve_type=str)

        cc = smach.Concurrence(
            ['stopped', 'no_operator', 'lost_operator'],
            default_outcome='no_operator',
            child_termination_cb=lambda so: True,
            outcome_map={
                'stopped': {
                    'FOLLOW_OPERATOR': 'stopped'
                },
                # 'stopped': {'FOLLOW_OPERATOR': 'stopped', 'DETERMINE_DOOR': 'door_found'},
                'no_operator': {
                    'FOLLOW_OPERATOR': 'no_operator'
                },
                # 'no_operator': {'FOLLOW_OPERATOR': 'no_operator', 'DETERMINE_DOOR': 'door_found'},
                # 'lost_operator': {'FOLLOW_OPERATOR': 'lost_operator', 'DETERMINE_DOOR': 'preempted'},
                'lost_operator': {
                    'FOLLOW_OPERATOR': 'lost_operator'
                }
            })
        with cc:
            smach.Concurrence.add('FOLLOW_OPERATOR',
                                  states.FollowOperator(robot, replan=True))
            smach.Concurrence.add('DETERMINE_DOOR',
                                  DetermineDoor(robot, door_id_designator))

        smach.StateMachine.add('FOLLOW_WITH_DOOR_CHECK',
                               cc,
                               transitions={
                                   'no_operator': 'FOLLOW_WITH_DOOR_CHECK',
                                   'stopped': 'SAY_SHOULD_I_RETURN',
                                   'lost_operator': 'SAY_SHOULD_I_RETURN'
                               })

        # smach.StateMachine.add( 'FOLLOW_OPERATOR', states.FollowOperator(robot, replan=True), transitions={ 'no_operator':'SAY_SHOULD_I_RETURN', 'stopped' : 'SAY_SHOULD_I_RETURN', 'lost_operator' : 'SAY_SHOULD_I_RETURN'})
        smach.StateMachine.add('SAY_SHOULD_I_RETURN',
                               states.Say(robot,
                                          "Should I return to target 3?",
                                          look_at_standing_person=True),
                               transitions={'spoken': 'HEAR_SHOULD_I_RETURN'})
        smach.StateMachine.add('HEAR_SHOULD_I_RETURN',
                               states.HearOptions(robot, ["yes", "no"]),
                               transitions={
                                   'no_result': 'SAY_STAND_IN_FRONT',
                                   "yes": "SELECT_WAYPOINTS",
                                   "no": "SAY_STAND_IN_FRONT"
                               })
        smach.StateMachine.add('SELECT_WAYPOINTS',
                               SelectWaypoints(door_id_designator,
                                               open_door_wp1_des,
                                               open_door_wp2_des),
                               transitions={'done': 'SAY_GOBACK_ARENA'})

        ######################################################################################################################################################
        #
        #                                                       RETURN TO ARENA DOOR
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'SAY_GOBACK_ARENA',
            states.Say(robot, [
                "I will go back to the arena", "I will return to the arena",
                "Lets return to the arena", "Going back to the arena",
                "Returning to the arena"
            ],
                       block=False),
            transitions={'spoken': 'GOTO_ARENA_DOOR'})

        smach.StateMachine.add(
            'GOTO_ARENA_DOOR',
            states.NavigateToWaypoint(
                robot,
                EdEntityDesignator(robot, id_designator=door_id_designator),
                challenge_knowledge.target_door_radius),
            transitions={
                'arrived': 'ARENA_DOOR_REACHED',
                'unreachable': 'RESET_ED_ARENA_DOOR',
                'goal_not_defined': 'RESET_ED_ARENA_DOOR'
            })

        smach.StateMachine.add('ARENA_DOOR_REACHED',
                               states.Say(robot, [
                                   "I am at the door of the arena",
                                   "I have arrived at the door of the arena",
                                   "I am now at the door of the arena"
                               ],
                                          block=True),
                               transitions={'spoken': 'SAY_OPEN_DOOR'})

        smach.StateMachine.add('RESET_ED_ARENA_DOOR',
                               states.ResetED(robot),
                               transitions={'done': 'GOTO_ARENA_DOOR_BACKUP'})

        smach.StateMachine.add(
            'GOTO_ARENA_DOOR_BACKUP',
            states.NavigateToWaypoint(
                robot,
                EdEntityDesignator(robot, id_designator=door_id_designator),
                challenge_knowledge.target_door_radius),
            transitions={
                'arrived': 'ARENA_DOOR_REACHED',
                'unreachable': 'TIMEOUT_ARENA_DOOR',
                'goal_not_defined': 'TIMEOUT_ARENA_DOOR'
            })

        smach.StateMachine.add('TIMEOUT_ARENA_DOOR',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds_door),
                               transitions={
                                   'not_yet': 'GOTO_ARENA_DOOR',
                                   'time_out': 'SAY_GOTO_ARENA_DOOR_FAILED'
                               })

        smach.StateMachine.add('SAY_GOTO_ARENA_DOOR_FAILED',
                               states.Say(robot, [
                                   "I am unable to reach the arena door",
                                   "I cannot reach the arena door",
                                   "The arena door is unreachable"
                               ],
                                          block=True),
                               transitions={'spoken': 'Done'})

        ######################################################################################################################################################
        #
        #                                                       Opening Door
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'OPEN_DOOR',
            states.OpenDoorByPushing(
                robot,
                EdEntityDesignator(robot, id_designator=open_door_wp1_des),
                EdEntityDesignator(robot, id_designator=open_door_wp2_des)),
            transitions={
                'succeeded': 'SAY_RETURN_TARGET3',
                'failed': 'TIMEOUT_ARENA_DOOR_OPENING'
            })

        smach.StateMachine.add(
            'SAY_OPEN_DOOR',
            states.Say(robot, [
                "I am going to open the door",
                "Going to open the door of the arena", "Door, open sesame"
            ],
                       block=True),
            transitions={'spoken': 'OPEN_DOOR'})

        smach.StateMachine.add(
            'SAY_OPEN_DOOR_AGAIN',
            states.Say(robot, [
                "I failed to open the door. I will try it again",
                "Let me try again to open the door"
            ],
                       block=True),
            transitions={'spoken': 'OPEN_DOOR'})

        smach.StateMachine.add('TIMEOUT_ARENA_DOOR_OPENING',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds),
                               transitions={
                                   'not_yet': 'SAY_OPEN_DOOR_AGAIN',
                                   'time_out': 'SAY_OPEN_DOOR_FAILED'
                               })

        smach.StateMachine.add(
            'SAY_OPEN_DOOR_FAILED',
            states.Say(robot, [
                "I was not able to open the door. I am done with this challange",
                "I was not able to open the door. I am done with this challange"
            ],
                       block=True),
            transitions={'spoken': 'Done'})

        ######################################################################################################################################################
        #
        #                                                       RETURN TO TARGET 3
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'SAY_RETURN_TARGET3',
            states.Say(robot, [
                "I will go back to target 3 now", "I will return to target 3",
                "Lets go to target 3 again", "Going to target 3, again"
            ],
                       block=False),
            transitions={'spoken': 'RETURN_TARGET3'})

        smach.StateMachine.add(
            'RETURN_TARGET3',
            states.NavigateToWaypoint(
                robot,
                EntityByIdDesignator(robot, id=challenge_knowledge.target4),
                challenge_knowledge.target4_radius1),
            transitions={
                'arrived': 'SAY_TARGET3_RETURN_REACHED',
                'unreachable': 'RESET_ED_RETURN_TARGET3',
                'goal_not_defined': 'RESET_ED_RETURN_TARGET3'
            })

        smach.StateMachine.add(
            'SAY_TARGET3_RETURN_REACHED',
            states.Say(robot, [
                "Reached target 3 again", "I have arrived at target 3 again",
                "I am now at target 3 again"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_EXIT'})

        smach.StateMachine.add(
            'RESET_ED_RETURN_TARGET3',
            states.ResetED(robot),
            transitions={'done': 'GOTO_RETURN_TARGET3_BACKUP'})

        smach.StateMachine.add('GOTO_RETURN_TARGET3_BACKUP',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.target4),
                                   challenge_knowledge.target4_radius2),
                               transitions={
                                   'arrived': 'SAY_TARGET3_RETURN_REACHED',
                                   'unreachable': 'TIMEOUT3_RETURN',
                                   'goal_not_defined': 'TIMEOUT3_RETURN'
                               })

        smach.StateMachine.add('TIMEOUT3_RETURN',
                               checkTimeOut(
                                   robot,
                                   challenge_knowledge.time_out_seconds),
                               transitions={
                                   'not_yet': 'RETURN_TARGET3',
                                   'time_out': 'SAY_RETURN_TARGET3_FAILED'
                               })

        # Should we mention that we failed???
        smach.StateMachine.add(
            'SAY_RETURN_TARGET3_FAILED',
            states.Say(robot, [
                "I am unable to reach target 3 again",
                "I cannot reach target 3 again", "Target 3 is unreachable"
            ],
                       block=True),
            transitions={'spoken': 'SAY_GOTO_EXIT'})

        ######################################################################################################################################################
        #
        #                                                       TARGET EXIT
        #
        ######################################################################################################################################################

        smach.StateMachine.add(
            'SAY_GOTO_EXIT',
            states.Say(robot, [
                "I will move to the exit now. See you guys later!",
                "I am done with this challenge. Going to the exit"
            ],
                       block=False),
            transitions={'spoken': 'GO_TO_EXIT'})

        # Amigo goes to the exit (waypoint stated in knowledge base)
        smach.StateMachine.add('GO_TO_EXIT',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.exit1),
                                   radius=0.6),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'RESET_ED_EXIT',
                                   'goal_not_defined': 'RESET_ED_EXIT'
                               })

        smach.StateMachine.add('RESET_ED_EXIT',
                               states.ResetED(robot),
                               transitions={'done': 'GO_TO_EXIT_BACKUP'})

        smach.StateMachine.add('GO_TO_EXIT_BACKUP',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.exit2),
                                   radius=0.6),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'RESET_ED_EXIT2',
                                   'goal_not_defined': 'RESET_ED_EXIT2'
                               })

        smach.StateMachine.add('RESET_ED_EXIT2',
                               states.ResetED(robot),
                               transitions={'done': 'GO_TO_EXIT_BACKUP2'})

        smach.StateMachine.add('GO_TO_EXIT_BACKUP2',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.exit3),
                                   radius=0.6),
                               transitions={
                                   'arrived': 'GO_TO_EXIT_BACKUP3',
                                   'unreachable': 'RESET_ED_EXIT3',
                                   'goal_not_defined': 'RESET_ED_EXIT3'
                               })

        smach.StateMachine.add('RESET_ED_EXIT3',
                               states.ResetED(robot),
                               transitions={'done': 'GO_TO_EXIT_BACKUP3'})

        smach.StateMachine.add('GO_TO_EXIT_BACKUP3',
                               states.NavigateToWaypoint(
                                   robot,
                                   EntityByIdDesignator(
                                       robot, id=challenge_knowledge.exit4),
                                   radius=0.6),
                               transitions={
                                   'arrived': 'AT_END',
                                   'unreachable': 'AT_END',
                                   'goal_not_defined': 'AT_END'
                               })

        smach.StateMachine.add('AT_END',
                               states.Say(robot, "Goodbye"),
                               transitions={'spoken': 'Done'})

    analyse_designators(sm, "navigation")
    return sm
Exemple #6
0
def setup_statemachine(robot):
    sm = smach.StateMachine(outcomes=['Done', 'Aborted'])
    robot.ed.reset()

    with sm:
        smach.StateMachine.add("INITIALIZE",
                               robot_smach_states.Initialize(robot),
                               transitions={
                                   "initialized": "SAY_WAITING_FOR_TRIGGER",
                                   "abort": "Aborted"
                               })

        # Start challenge via StartChallengeRobust, skipped atm
        smach.StateMachine.add("START_CHALLENGE_ROBUST",
                               robot_smach_states.StartChallengeRobust(
                                   robot,
                                   challenge_knowledge.starting_point,
                                   door=False),
                               transitions={
                                   "Done": "SAY_WAITING_FOR_TRIGGER",
                                   "Failed": "Aborted",
                                   "Aborted": "Aborted"
                               })

        smach.StateMachine.add(
            'SAY_WAITING_FOR_TRIGGER',
            robot_smach_states.Say(robot, [
                "Trigger me if you need me!", "Waiting for trigger",
                "Waiting for you to call me!"
            ],
                                   block=False),
            transitions={"spoken": "WAIT_FOR_TRIGGER"})

        smach.StateMachine.add('WAIT_FOR_TRIGGER',
                               robot_smach_states.WaitForTrigger(
                                   robot, ["gpsr"], "/amigo/trigger"),
                               transitions={
                                   "gpsr": "VERIFY",
                                   "preempted": "VERIFY"
                               })

        smach.StateMachine.add('VERIFY',
                               VerifyWorldModelInfo(robot),
                               transitions={
                                   "done": "NAVIGATE_TO_ASK_WAYPOINT",
                                   "failed": "SAY_KNOWLEDGE_NOT_COMPLETE"
                               })

        smach.StateMachine.add(
            'SAY_KNOWLEDGE_NOT_COMPLETE',
            robot_smach_states.Say(robot, [
                "My knowledge of the world is not complete!",
                "Please give me some more information!"
            ],
                                   block=False),
            transitions={"spoken": "SAY_WAITING_FOR_TRIGGER"})

        smach.StateMachine.add("NAVIGATE_TO_ASK_WAYPOINT",
                               robot_smach_states.NavigateToWaypoint(
                                   robot=robot,
                                   waypoint_designator=EntityByIdDesignator(
                                       robot=robot,
                                       id=challenge_knowledge.ask_waypoint),
                                   radius=0.3),
                               transitions={
                                   'arrived':
                                   'DETERMINE_WHAT_TO_CLEAN_INSPECT',
                                   'unreachable':
                                   'DETERMINE_WHAT_TO_CLEAN_INSPECT',
                                   'goal_not_defined':
                                   'DETERMINE_WHAT_TO_CLEAN_INSPECT'
                               })

        smach.StateMachine.add(
            "DETERMINE_WHAT_TO_CLEAN_INSPECT",
            DetermineWhatToCleanInspect(robot),
            transitions={
                place["entity_id"]: "CLEAN_INSPECT_%s" % place["entity_id"]
                for place in challenge_knowledge.inspection_places
            })

        for place in challenge_knowledge.inspection_places:
            smach.StateMachine.add(
                "CLEAN_INSPECT_%s" % place["entity_id"],
                CleanInspect(robot, place["entity_id"], place["room_id"],
                             place["navigate_area"], place["segment_areas"]),
                transitions={"done": "NAVIGATE_TO_ASK_WAYPOINT"})
    return sm
    def __init__(self, robot):
        smach.StateMachine.__init__(self, outcomes=['Done', 'Aborted'])

        with self:
            #Part I: Set a table
            smach.StateMachine.add(
                'ENTER_ROOM',  # Enter the room
                states.StartChallengeRobust(robot, knowledge.initial_pose),
                transitions={
                    'Done': 'ANNOUNCEMENT',
                    'Aborted': 'Aborted',
                    'Failed': 'Aborted'
                })

            smach.StateMachine.add(
                'ANNOUNCEMENT',
                states.Say(
                    robot,
                    "Let's see if my master has a task for me! Moving to the meeting point.",
                    block=True),
                transitions={'spoken': 'NAVIGATE_TO_WAYPOINT_I'})

            smach.StateMachine.add('NAVIGATE_TO_WAYPOINT_I',
                                   states.NavigateToWaypoint(
                                       robot,
                                       ds.EntityByIdDesignator(
                                           robot=robot,
                                           id=knowledge.starting_pose),
                                       radius=0.3),
                                   transitions={
                                       'arrived': 'FETCH_COMMAND_I',
                                       'unreachable': 'FETCH_COMMAND_I',
                                       'goal_not_defined': 'FETCH_COMMAND_I'
                                   })

            smach.StateMachine.add(
                'FETCH_COMMAND_I',  # Hear "set the table"
                HearFetchCommand(robot, 15.0),
                transitions={'heard': 'ASK_FOR_MEAL'})

            smach.StateMachine.add('ASK_FOR_MEAL',
                                   states.Say(robot,
                                              "What should I serve, master?",
                                              block=True),
                                   transitions={'spoken': 'SET_THE_TABLE'})

            smach.StateMachine.add(
                'SET_THE_TABLE',  # Take order and Set the table (bring the objects to the table)
                states.Initialize(robot),
                transitions={
                    'initialized': 'SERVE_MEAL',
                    'abort': 'Aborted'
                },
                remapping={'meal': 'meal'})

            smach.StateMachine.add(
                'SERVE_MEAL',  # Serve the meal (for example: pour milk into the bowl)
                states.Initialize(robot),
                transitions={
                    'initialized': 'CORRECT_OBJECT_POSITIONS',
                    'abort': 'Aborted'
                })

            smach.StateMachine.add(
                'CORRECT_OBJECT_POSITIONS',  # Inspect table and correct the moved objects
                states.Initialize(robot),
                transitions={
                    'initialized': 'ANNOUNCE_TASK_COMPLETION',
                    'abort': 'Aborted'
                })

            smach.StateMachine.add(
                'ANNOUNCE_TASK_COMPLETION',
                states.Say(
                    robot,
                    "The table is set! Moving to the meeting point for the next task.",
                    block=True),
                transitions={'spoken': 'NAVIGATE_TO_WAYPOINT_II'})

            #Part II: Clean the table
            smach.StateMachine.add('NAVIGATE_TO_WAYPOINT_II',
                                   states.NavigateToWaypoint(
                                       robot,
                                       ds.EntityByIdDesignator(
                                           robot=robot,
                                           id=knowledge.starting_pose),
                                       radius=0.3),
                                   transitions={
                                       'arrived': 'FETCH_COMMAND_II',
                                       'unreachable': 'FETCH_COMMAND_II',
                                       'goal_not_defined': 'FETCH_COMMAND_II'
                                   })

            smach.StateMachine.add(
                'FETCH_COMMAND_II',  # Hear "clear up the table"
                HearFetchCommand(robot, 15.0),
                transitions={'heard': 'CLEAR_UP'})

            smach.StateMachine.add(
                'CLEAR_UP',  # Clear up the table (bring the objects to their default location)
                states.Initialize(robot),
                transitions={
                    'initialized': 'CLEAN_THE_TABLE',
                    'abort': 'Aborted'
                })

            smach.StateMachine.add(
                'CLEAN_THE_TABLE',  # Inspect for spots and spills and clean them
                states.Initialize(robot),
                transitions={
                    'initialized': 'END_CHALLENGE',
                    'abort': 'Aborted'
                })

            # End
            smach.StateMachine.add('END_CHALLENGE',
                                   states.Say(robot, "I am finally free!"),
                                   transitions={'spoken': 'Done'})

            ds.analyse_designators(self, "set_a_table")
def setup_statemachine(robot):
    sm = smach.StateMachine(outcomes=['done', 'failed', 'aborted'])

    with sm:
        smach.StateMachine.add('START_CHALLENGE_ROBUST',
                               states.StartChallengeRobust(
                                   robot, STARTING_POINT),
                               transitions={
                                   'Done': 'GO_TO_SEARCH_POSE',
                                   'Aborted': 'aborted',
                                   'Failed': 'GO_TO_SEARCH_POSE'
                               })

        smach.StateMachine.add('SAY_START',
                               states.Say(robot,
                                          "Finding your mates, here we go!",
                                          block=False),
                               transitions={'spoken': 'GO_TO_SEARCH_POSE'})

        smach.StateMachine.add('GO_TO_SEARCH_POSE',
                               states.NavigateToWaypoint(
                                   robot,
                                   ds.EntityByIdDesignator(robot,
                                                           id=SEARCH_POINT),
                                   radius=0.375),
                               transitions={
                                   'arrived': 'RISE_FOR_THE_PEOPLE',
                                   'goal_not_defined': 'failed',
                                   'unreachable': 'WAIT_SEARCH_POSE'
                               })

        smach.StateMachine.add('WAIT_SEARCH_POSE',
                               states.WaitTime(robot, 5),
                               transitions={
                                   'preempted': 'aborted',
                                   'waited': 'GO_TO_SEARCH_POSE'
                               })

        # noinspection PyUnusedLocal
        @smach.cb_interface(outcomes=["done"])
        def _rise_for_the_people(userdata=None):
            """ Resets the location hmi attempt so that each operator gets three attempts """
            robot.arms.values()[0]._send_joint_trajectory(
                [[0.70, -1.9, 0.0, -1.57, 0.0]])
            robot.speech.speak(
                "Hi there. My Name is Hero. I'm looking for the mates of my operator",
                block=False)
            return "done"

        smach.StateMachine.add("RISE_FOR_THE_PEOPLE",
                               smach.CBState(_rise_for_the_people),
                               transitions={"done": "LOCATE_PEOPLE"})

        # locate all four people
        smach.StateMachine.add('LOCATE_PEOPLE',
                               LocatePeople(robot, room_id=ROOM_ID),
                               transitions={
                                   'done': 'RESET_FOR_DRIVING',
                               })

        # noinspection PyUnusedLocal
        @smach.cb_interface(outcomes=["done"])
        def _reset_for_driving(userdata=None):
            """ Resets the location hmi attempt so that each operator gets three attempts """
            robot.speech.speak("Thank you for your attention", block=False)
            robot.arms.values()[0]._send_joint_trajectory([
                [0.01, -1.9, 0.0, -1.57, 0.0],  # Inspect with q0 low
                [0.01, 0.0, -1.57, -1.57, 0.0]
            ])  # Reset
            return "done"

        smach.StateMachine.add("RESET_FOR_DRIVING",
                               smach.CBState(_reset_for_driving),
                               transitions={"done": "GO_BACK_TO_OPERATOR"})

        # drive back to the operator to describe the mates
        smach.StateMachine.add('GO_BACK_TO_OPERATOR',
                               states.NavigateToWaypoint(
                                   robot,
                                   ds.EntityByIdDesignator(robot,
                                                           id=OPERATOR_POINT),
                                   radius=0.7,
                                   look_at_designator=ds.EntityByIdDesignator(
                                       robot, id=OPERATOR_POINT)),
                               transitions={
                                   'arrived': 'REPORT_PEOPLE',
                                   'goal_not_defined': 'REPORT_PEOPLE',
                                   'unreachable': 'WAIT_GO_BACK'
                               })

        smach.StateMachine.add('WAIT_GO_BACK',
                               states.WaitTime(robot, 5),
                               transitions={
                                   'preempted': 'aborted',
                                   'waited': 'GO_BACK_TO_OPERATOR'
                               })

        # check how to uniquely define them  # ToDo: make this more interesting
        smach.StateMachine.add('REPORT_PEOPLE',
                               ReportPeople(robot),
                               transitions={'done': 'done'})

    return sm
Exemple #9
0
    def __init__(self, robot):
        """ Constructor
        :param robot: robot object
        """
        smach.StateMachine.__init__(self, outcomes=["Done", "Aborted"])

        # Designators
        furniture_move_designator = PointingDesignator(robot=robot)
        furniture_pick_designator = PointingDesignator(robot=robot)
        furniture_place_designator = PointingDesignator(robot=robot)

        with self:
            # Start challenge
            smach.StateMachine.add("START_CHALLENGE",
                                   states.StartChallengeRobust(
                                       robot=robot,
                                       initial_pose=knowledge.initial_pose),
                                   transitions={
                                       "Done": "NAVIGATE_TO_MEETING_POINT0",
                                       "Aborted": "Aborted",
                                       "Failed": "Aborted"
                                   })

            # Move to meeting point
            # ToDo: add challenge knowledge
            smach.StateMachine.add("NAVIGATE_TO_MEETING_POINT0",
                                   states.NavigateToWaypoint(
                                       robot=robot,
                                       waypoint_designator=EdEntityDesignator(
                                           robot=robot,
                                           id=knowledge.meeting_point),
                                       radius=0.15),
                                   transitions={
                                       "arrived": "DETECT_POINTING0",
                                       "unreachable": "DETECT_POINTING0",
                                       "goal_not_defined": "DETECT_POINTING0"
                                   })

            # Wait for the operator to appear and detect what he's pointing at
            smach.StateMachine.add("DETECT_POINTING0",
                                   PointingDetector(
                                       robot=robot,
                                       designator=furniture_move_designator,
                                       default_entity_id="couch_table",
                                       super_type="furniture"),
                                   transitions={
                                       "succeeded": "MOVE_TO_ITEM",
                                       "failed": "DETECT_POINTING0"
                                   })

            # Move to jury table
            smach.StateMachine.add("MOVE_TO_ITEM",
                                   states.NavigateToSymbolic(
                                       robot,
                                       {furniture_move_designator: "near"},
                                       furniture_move_designator),
                                   transitions={
                                       "arrived": "SAY_HI_TO_JURY",
                                       "unreachable": "SAY_HI_TO_JURY",
                                       "goal_not_defined": "SAY_HI_TO_JURY"
                                   })

            smach.StateMachine.add(
                "SAY_HI_TO_JURY",
                states.Say(robot, "Hi guys, I'm glad you're here", block=True),
                transitions={"spoken": "NAVIGATE_TO_MEETING_POINT1"})

            smach.StateMachine.add("NAVIGATE_TO_MEETING_POINT1",
                                   states.NavigateToWaypoint(
                                       robot=robot,
                                       waypoint_designator=EdEntityDesignator(
                                           robot=robot,
                                           id=knowledge.meeting_point),
                                       radius=0.15),
                                   transitions={
                                       "arrived": "DETECT_POINTING1",
                                       "unreachable": "DETECT_POINTING1",
                                       "goal_not_defined": "DETECT_POINTING1"
                                   })

            # Wait for the operator to appear and detect what he's pointing at
            smach.StateMachine.add("DETECT_POINTING1",
                                   PointingDetector(
                                       robot=robot,
                                       designator=furniture_pick_designator,
                                       default_entity_id="desk",
                                       super_type="furniture"),
                                   transitions={
                                       "succeeded": "PICKUP_ITEM",
                                       "failed": "DETECT_POINTING1"
                                   })

            # Inspect and pickup
            smach.StateMachine.add(
                "PICKUP_ITEM",
                PickupItem(robot=robot,
                           furniture_designator=furniture_pick_designator),
                transitions={
                    "succeeded": "NAVIGATE_TO_MEETING_POINT2",
                    "failed": "NAVIGATE_TO_MEETING_POINT2"
                })

            # Move back to meeting point
            # ToDo: add challenge knowledge
            smach.StateMachine.add("NAVIGATE_TO_MEETING_POINT2",
                                   states.NavigateToWaypoint(
                                       robot=robot,
                                       waypoint_designator=EdEntityDesignator(
                                           robot=robot,
                                           id=knowledge.meeting_point),
                                       radius=0.15),
                                   transitions={
                                       "arrived": "DETECT_POINTING2",
                                       "unreachable": "DETECT_POINTING2",
                                       "goal_not_defined": "DETECT_POINTING2"
                                   })

            # Wait for the operator to appear and detect what he's pointing at
            smach.StateMachine.add("DETECT_POINTING2",
                                   PointingDetector(
                                       robot=robot,
                                       designator=furniture_place_designator,
                                       default_entity_id="side_table",
                                       super_type="furniture"),
                                   transitions={
                                       "succeeded": "PLACE_ITEM",
                                       "failed": "DETECT_POINTING2"
                                   })

            # Place the object
            smach.StateMachine.add(
                "PLACE_ITEM",
                PlaceSingleItem(robot=robot,
                                place_designator=furniture_place_designator),
                transitions={
                    "succeeded": "SAY_DONE",
                    "failed": "SAY_DONE"
                })

            # Say that we're done
            smach.StateMachine.add(
                "SAY_DONE",
                states.Say(
                    robot,
                    "That's it for today, you can have a closer look at my"
                    "skills on the screen",
                    block=False),
                transitions={"spoken": "RESET_HEAD"})

            @smach.cb_interface(outcomes=["done"])
            def reset_head(userdata=None):
                """ Resets the head """
                print "Resetting head"
                robot.head.reset()
                rospy.sleep(rospy.Duration(1.0))
                return "done"

            smach.StateMachine.add("RESET_HEAD",
                                   smach.CBState(reset_head),
                                   transitions={"done": "Done"})
def setup_statemachine(robot):

    sm = smach.StateMachine(outcomes=['Done', 'Aborted'])
    robot.ed.reset()

    with sm:

        smach.StateMachine.add("INITIALIZE",
                               robot_smach_states.Initialize(robot),
                               transitions={
                                   "initialized": "SAY_WAITING_FOR_TRIGGER",
                                   "abort": "Aborted"
                               })

        # Start challenge via StartChallengeRobust, skipped atm
        smach.StateMachine.add("START_CHALLENGE_ROBUST",
                               robot_smach_states.StartChallengeRobust(
                                   robot,
                                   challenge_knowledge.starting_point,
                                   door=False),
                               transitions={
                                   "Done": "SAY_WAITING_FOR_TRIGGER",
                                   "Failed": "Aborted",
                                   "Aborted": "Aborted"
                               })

        smach.StateMachine.add(
            'SAY_WAITING_FOR_TRIGGER',
            robot_smach_states.Say(robot, [
                "Trigger me if you need me!", "Waiting for trigger",
                "Waiting for you to call me!"
            ],
                                   block=False),
            transitions={"spoken": "WAIT_FOR_TRIGGER"})

        smach.StateMachine.add('WAIT_FOR_TRIGGER',
                               robot_smach_states.WaitForTrigger(
                                   robot, ["gpsr"], "/amigo/trigger"),
                               transitions={
                                   "gpsr": "VERIFY",
                                   "preempted": "VERIFY"
                               })

        smach.StateMachine.add('VERIFY',
                               VerifyWorldModelInfo(robot),
                               transitions={
                                   "done": "SAY_START_CHALLENGE",
                                   "failed": "SAY_KNOWLEDGE_NOT_COMPLETE"
                               })

        smach.StateMachine.add(
            'SAY_KNOWLEDGE_NOT_COMPLETE',
            robot_smach_states.Say(robot, [
                "My knowledge of the world is not complete!",
                "Please give me some more information!"
            ],
                                   block=False),
            transitions={"spoken": "SAY_WAITING_FOR_TRIGGER"})

        smach.StateMachine.add(
            'SAY_START_CHALLENGE',
            robot_smach_states.Say(robot, [
                "Starting R5COP Cooperative cleaning demonstrator",
                "What a mess here, let's clean this room!",
                "Let's see if I can find some garbage here",
                "All I want to do is clean this mess up!"
            ],
                                   block=False),
            transitions={"spoken": "INSPECT_0"})

        for i, place in enumerate(challenge_knowledge.inspection_places):
            next_i = i + 1 if i + 1 < len(
                challenge_knowledge.inspection_places) else 0

            smach.StateMachine.add(
                "INSPECT_%d" % i,
                CleanInspect(robot, place["entity_id"], place["room_id"],
                             place["navigate_area"], place["segment_areas"],
                             challenge_knowledge.known_types),
                transitions={"done": "INSPECT_%d" % next_i})
    return sm
Exemple #11
0
def setup_statemachine(robot):
    sm = smach.StateMachine(outcomes=['Done', 'Aborted'])

    # Designators
    # Room to search through
    roomr = ds.VariableDesignator(resolve_type=str)
    roomw = roomr.writeable

    # Cleanup location as defined in local knowledge
    cleanup_locationsr = ds.VariableDesignator([{'1': '2', '3': '4'}])
    cleanup_locationsw = cleanup_locationsr.writeable
    location_des = ds.VariableDesignator(resolve_type=dict)

    with sm:
        smach.StateMachine.add("START_ROBUST",
                               robot_smach_states.StartChallengeRobust(
                                   robot, challenge_knowledge.starting_point),
                               transitions={
                                   "Done": "GO_TO_WAITING_POINT",
                                   "Aborted": "GO_TO_WAITING_POINT",
                                   "Failed": "GO_TO_WAITING_POINT"
                               })

        smach.StateMachine.add("GO_TO_WAITING_POINT",
                               robot_smach_states.NavigateToWaypoint(
                                   robot,
                                   ds.EntityByIdDesignator(
                                       robot,
                                       challenge_knowledge.waiting_point)),
                               transitions={
                                   "arrived": "INQUIRE_ROOM",
                                   "unreachable": "GO_TO_WAITING_POINT1",
                                   "goal_not_defined": "GO_TO_WAITING_POINT1"
                               })

        smach.StateMachine.add("GO_TO_WAITING_POINT1",
                               robot_smach_states.NavigateToWaypoint(
                                   robot,
                                   ds.EntityByIdDesignator(
                                       robot,
                                       challenge_knowledge.waiting_point),
                                   radius=0.3),
                               transitions={
                                   "arrived": "INQUIRE_ROOM",
                                   "unreachable": "INQUIRE_ROOM",
                                   "goal_not_defined": "INQUIRE_ROOM"
                               })

        smach.StateMachine.add("INQUIRE_ROOM",
                               AskWhichRoomToClean(
                                   robot,
                                   ds.Designator(challenge_knowledge.grammar),
                                   roomw, cleanup_locationsw),
                               transitions={"done": "VERIFY"})

        smach.StateMachine.add('VERIFY',
                               VerifyWorldModelInfo(robot),
                               transitions={
                                   "done": "SAY_START_CHALLENGE",
                                   "failed": "SAY_KNOWLEDGE_NOT_COMPLETE"
                               })

        smach.StateMachine.add(
            'SAY_KNOWLEDGE_NOT_COMPLETE',
            robot_smach_states.Say(robot, [
                "My knowledge of the world is not complete!",
                "Please give me some more information!"
            ],
                                   block=False),
            transitions={"spoken": "Aborted"})

        smach.StateMachine.add('SAY_START_CHALLENGE',
                               robot_smach_states.Say(robot, [
                                   "Starting the cleanup challenge",
                                   "What a mess here, let's clean this room!",
                                   "Let's see if I can find some garbage here",
                                   "All I want to do is clean this mess up!"
                               ],
                                                      block=False),
                               transitions={"spoken": "ITERATE_NEXT_LOC"})

        smach.StateMachine.add('ITERATE_NEXT_LOC',
                               robot_smach_states.IterateDesignator(
                                   cleanup_locationsr, location_des.writeable),
                               transitions={
                                   "next": "INSPECT",
                                   "stop_iteration": "RETURN_TO_OPERATOR"
                               })

        smach.StateMachine.add("INSPECT",
                               CleanInspect(robot, location_des),
                               transitions={"done": "ITERATE_NEXT_LOC"})

        smach.StateMachine.add("RETURN_TO_OPERATOR",
                               robot_smach_states.NavigateToWaypoint(
                                   robot=robot,
                                   waypoint_designator=ds.EntityByIdDesignator(
                                       robot=robot,
                                       id=challenge_knowledge.starting_point),
                                   radius=0.3),
                               transitions={
                                   "arrived": "SAY_CLEANED_ROOM",
                                   "unreachable": "SAY_CLEANED_ROOM",
                                   "goal_not_defined": "SAY_CLEANED_ROOM"
                               })

        smach.StateMachine.add(
            'SAY_CLEANED_ROOM',
            robot_smach_states.Say(robot, [
                "I successfully cleaned the {room}!",
                "All done in the {room}. Am I a good robot now?",
                "There, I cleaned up your mess in the {room}, are you happy now!"
            ],
                                   room=roomr,
                                   block=False),
            transitions={"spoken": "Done"})

    return sm