# Get samples FSM # A general remark on this FSM: it is not its responsibility to put the bot in # front of the distributor, it the responsibility of the top FSM using the # move FSM. # For example, the top FSM will order the bot to move in front of the # distributor using the move FSM. Then, when it is arrived, it will the get # sample FSM that will ensure we well placed (in term of angle for example). get_samples Get samples from the distributor States: IDLE waiting for the beginning of the get samples FSM FACE_DISTRIBUTOR face the distributor OPEN_INPUT_HOLE move the arm to let the samples enter into the bot by the input hole APPROACH_DISTRIBUTOR make the bot move forward in order to be in contact with the distributor TAKE_SAMPLES take one or more samples MOVE_AWAY_FROM_DISTRIBUTOR move the bot away from the distributor by going backward CLOSE_INPUT_HOLE put the arm back in front of the input hole to prevent sample to enter MOVE_BACKWARD_FROM_DISTRIBUTOR move a little bit backward from the distributor WAIT_AND_TRY_AGAIN wait and try again Events: start initialize the FSM # For the moment, this event is currently not managed. # TODO: manage it bot_move_failed the bot movement failed (blocked by something for example) bot_move_succeed the bot has finished to moved and arrived at the desired position arm_move_succeed the arm has reached the desired position arm_pass_noted_position the arm has just passed the 'noted' position wait_finished we have wait the desired time IDLE: start -> FACE_DISTRIBUTOR do a goto angle to make the bot facing the distributor FACE_DISTRIBUTOR: bot_move_succeed -> OPEN_INPUT_HOLE move the arm to open the input hole OPEN_INPUT_HOLE: arm_move_succeed -> APPROACH_DISTRIBUTOR start approaching the distributor now APPROACH_DISTRIBUTOR: bot_move_succeed -> MOVE_BACKWARD_FROM_DISTRIBUTOR move a little bit backward from the distributor bot_move_failed -> . try to move again MOVE_BACKWARD_FROM_DISTRIBUTOR: bot_move_succeed -> TAKE_SAMPLES start taking some samples setup a timeout TAKE_SAMPLES: arm_pass_noted_position: more -> . prepare the classification of the taken sample take a new one reset the timeout arm_pass_noted_position: no_more -> MOVE_AWAY_FROM_DISTRIBUTOR store current position go backward wait_finished -> MOVE_AWAY_FROM_DISTRIBUTOR store current position timed out, give up go backward MOVE_AWAY_FROM_DISTRIBUTOR: bot_move_succeed -> CLOSE_INPUT_HOLE close input hole setup a close timeout bot_move_failed -> WAIT_AND_TRY_AGAIN ask to be wake up in a certain time arm_pass_noted_position -> . prepare the classification of the taken sample CLOSE_INPUT_HOLE: arm_move_succeed -> IDLE tell the top FSM we have finished wait_finished -> IDLE timed out, give up tell the top FSM we have finished arm_pass_noted_position -> . prepare the classification of the taken sample WAIT_AND_TRY_AGAIN: wait_finished -> MOVE_AWAY_FROM_DISTRIBUTOR compute remaining distance (protection agains 0 & 300) try to move away again