]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
robofsm: working on homologation, almost ready
authorFilip Jares <filipjares@post.cz>
Sat, 11 Apr 2009 16:32:27 +0000 (18:32 +0200)
committerFilip Jares <filipjares@post.cz>
Sat, 11 Apr 2009 16:32:27 +0000 (18:32 +0200)
src/robofsm/fsmact.c
src/robofsm/fsmmain.c
src/robofsm/roboevent.py

index b46b7ca4e20ee8304faf24a9f839aebb360e15af..d942d9ee638bfbf8fc0c9b75954bef7a4a80f27f 100644 (file)
@@ -9,30 +9,63 @@
  * ***********************************************************/
 
 FSM_STATE_DECL(wait_for_command);
+
 FSM_STATE_DECL(reactive_demo);
+FSM_STATE_DECL(look_for_puck);
 FSM_STATE_DECL(dummy_action);
-FSM_STATE_DECL(suck_the_puck);
 
+FSM_STATE_DECL(grasp_the_puck);
+
+FSM_STATE_DECL(suck_the_puck);
 /* ***********************************************************
  *  STATE DEFINITIONS
  * ***********************************************************/
 
-FSM_STATE(wait_for_command) {
+FSM_STATE(wait_for_command)
+{
        switch (FSM_EVENT) {
        case EV_ENTRY:
                act_belts(BELTS_OFF, BELTS_OFF);
                act_chelae(CHELA_OPEN, CHELA_OPEN);
-               FSM_TRANSITION(reactive_demo);
                // TODO
                // put all actuators to defined initial positions
                break;
-       case EV_PICK_UP_PUCK:
+       case EV_LOAD_THE_PUCK:
                //FSM_TRANSITION(dummy_action);
                break;
+       case EV_LOOK_FOR_PUCK:
+               FSM_TRANSITION(look_for_puck);
+               break;
+       case EV_GRASP_THE_PUCK:
+               FSM_TRANSITION(grasp_the_puck);
+               break;
+       case EV_PUCK_REACHABLE: //
+       case EV_PUCK_INSIDE:    // we do not want react unless MAIN FSM tell us to
+               break;
        case EV_RETURN:
        case EV_TIMER:
+               DBG_PRINT_EVENT("unhandled event");
+               break;
+       case EV_EXIT:
+               break;
+       }
+}
+
+FSM_STATE(look_for_puck)
+{
+       switch (FSM_EVENT) {
+       case EV_ENTRY:
+               break;
        case EV_PUCK_REACHABLE:
-       case EV_PUCK_INSIDE:
+               FSM_SIGNAL(MAIN, EV_PUCK_REACHABLE, NULL);
+               FSM_TRANSITION(wait_for_command);
+               break;
+       case EV_LOAD_THE_PUCK:
+       case EV_GRASP_THE_PUCK:
+       case EV_LOOK_FOR_PUCK:
+       case EV_RETURN:
+       case EV_TIMER:
+       case EV_PUCK_INSIDE:    // FIXME: handle this? the same way like EV_PUCK_REACHABLE? or differently?
                DBG_PRINT_EVENT("unhandled event");
                break;
        case EV_EXIT:
@@ -40,18 +73,53 @@ FSM_STATE(wait_for_command) {
        }
 }
 
-FSM_STATE(reactive_demo) {
+FSM_STATE(reactive_demo)
+{
        switch (FSM_EVENT) {
        case EV_ENTRY:
                break;
        case EV_PUCK_REACHABLE:
+               FSM_SIGNAL(MAIN, EV_PUCK_REACHABLE, NULL);
                FSM_TRANSITION(suck_the_puck);
                break;
        case EV_PUCK_INSIDE:
                break;
        case EV_RETURN:
        case EV_TIMER:
-       case EV_PICK_UP_PUCK:
+       case EV_LOAD_THE_PUCK:
+       case EV_LOOK_FOR_PUCK:
+       case EV_GRASP_THE_PUCK:
+               DBG_PRINT_EVENT("unhandled event");
+               break;
+       case EV_EXIT:
+               break;
+       }
+}
+
+FSM_STATE(grasp_the_puck)
+{
+       switch (FSM_EVENT) {
+       case EV_ENTRY:
+               act_belts(BELTS_IN, BELTS_IN);
+               act_chelae(CHELA_TIGHT, CHELA_TIGHT);
+               break;
+       case EV_PUCK_REACHABLE:
+               break;
+       case EV_PUCK_INSIDE:
+               act_belts(BELTS_OFF, BELTS_OFF);
+               FSM_SIGNAL(MAIN, EV_PUCK_LOADED_UP, NULL);
+               break;
+       case EV_RETURN:
+       case EV_LOAD_THE_PUCK:
+       case EV_UNLOAD_THE_PUCK:
+               FSM_TIMER(800);
+       case EV_TIMER:
+               act_belts(BELTS_OFF, BELTS_OFF);
+               act_chelae(CHELA_LOOSE, CHELA_LOOSE);
+               FSM_TRANSITION(wait_for_command);
+               break;
+       case EV_LOOK_FOR_PUCK:
+       case EV_GRASP_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
        case EV_EXIT:
@@ -59,7 +127,8 @@ FSM_STATE(reactive_demo) {
        }
 }
 
-FSM_STATE(suck_the_puck) {
+FSM_STATE(suck_the_puck)
+{
        switch (FSM_EVENT) {
        case EV_ENTRY:
                FSM_TIMER(1000);
@@ -68,13 +137,16 @@ FSM_STATE(suck_the_puck) {
                break;
        case EV_PUCK_INSIDE:
                act_belts(BELTS_OFF, BELTS_OFF);
-               FSM_TRANSITION(reactive_demo);
+               FSM_SIGNAL(MAIN, EV_PUCK_LOADED_UP, NULL);
+               FSM_TRANSITION(wait_for_command);
                break;
        case EV_RETURN:
        case EV_TIMER:
-               FSM_TRANSITION(reactive_demo);
+               FSM_TRANSITION(wait_for_command);
                break;
-       case EV_PICK_UP_PUCK:
+       case EV_LOAD_THE_PUCK:
+       case EV_GRASP_THE_PUCK:
+       case EV_LOOK_FOR_PUCK:
        case EV_PUCK_REACHABLE:
                DBG_PRINT_EVENT("unhandled event");
                break;
@@ -85,7 +157,8 @@ FSM_STATE(suck_the_puck) {
        }
 }
 
-FSM_STATE(dummy_action) {
+FSM_STATE(dummy_action)
+{
        switch (FSM_EVENT) {
        case EV_ENTRY:
                FSM_TIMER(2000);
@@ -95,7 +168,9 @@ FSM_STATE(dummy_action) {
                FSM_TRANSITION(wait_for_command);
                break;
        case EV_RETURN:
-       case EV_PICK_UP_PUCK:
+       case EV_LOAD_THE_PUCK:
+       case EV_GRASP_THE_PUCK:
+       case EV_LOOK_FOR_PUCK:
        case EV_PUCK_REACHABLE:
        case EV_PUCK_INSIDE:
                DBG_PRINT_EVENT("unhandled event");
index dbd779ff89f8810410af84de06d90baa5b9597f7..581b289432015b36fa1548fea4dd2156ede8a9a9 100644 (file)
@@ -124,6 +124,11 @@ void robot_go_backward_to_point(struct ref_pos_type des_pos)
        robot_trajectory_new_backward(&tc);
        robot_trajectory_add_final_point_notrans(des_pos.x, des_pos.y, NO_TURN());
 }
+/************************************************************************
+ * Trajectory constraints used, are initialized in the init state
+ ************************************************************************/
+
+struct TrajectoryConstraints tcFast, tcSlow;
 
 /************************************************************************
  * FSM STATES DECLARATION
@@ -133,6 +138,8 @@ void robot_go_backward_to_point(struct ref_pos_type des_pos)
 FSM_STATE_DECL(init);
 FSM_STATE_DECL(wait_for_start);
 /* movement states */
+FSM_STATE_DECL(approach_first_puck);
+FSM_STATE_DECL(simple_construction_zone_approach);
 FSM_STATE_DECL(approach_our_static_dispenser);
 FSM_STATE_DECL(approach_opponents_static_dispenser);
 
@@ -143,12 +150,15 @@ FSM_STATE_DECL(approach_opponents_static_dispenser);
 FSM_STATE(init) 
 {
        switch (FSM_EVENT) {
-               case EV_ENTRY:
-                       //act..
-                       FSM_TRANSITION(wait_for_start);
-                       break;
-               default:
-                       break;
+       case EV_ENTRY:
+               tcFast = trajectoryConstraintsDefault;
+               tcFast.maxv = 1.5;
+               tcSlow = trajectoryConstraintsDefault;
+               tcSlow.maxv = 0.3;
+               FSM_TRANSITION(wait_for_start);
+               break;
+       default:
+               break;
        }
 }
 
@@ -169,15 +179,14 @@ FSM_STATE(wait_for_start)
 #else
                case EV_ENTRY:
 #endif
-                       robot_set_est_pos_trans(ROBOT_WIDTH_M,
-                                               PLAYGROUND_HEIGHT_M - ROBOT_AXIS_TO_BACK_M - 0.1,
+                       robot_set_est_pos_trans(0.16,
+                                               PLAYGROUND_HEIGHT_M - 0.16,
                                                DEG2RAD(-45));
                        /* start to do something */
                        ROBOT_LOCK(state);
                        robot.state = COMPETITION_STARTED;
                        ROBOT_UNLOCK(state);
-                       //FSM_TRANSITION(approach_our_static_dispenser);
-                       //FSM_TRANSITION(approach_opponents_static_dispenser);
+                       FSM_TRANSITION(approach_first_puck);
                        break;
                case EV_RETURN:
                case EV_TIMER:
@@ -187,7 +196,10 @@ FSM_STATE(wait_for_start)
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
+               case EV_PUCK_REACHABLE:
                case EV_PUCK_LOADED_UP:
+               case EV_ACT_ERROR:
+               case EV_ACT_FATAL_ERROR:
                case EV_MOTION_DONE:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -201,6 +213,68 @@ FSM_STATE(wait_for_start)
  * MOVEMENT STATES
  ************************************************************************/
 
+FSM_STATE(approach_first_puck)
+{
+       switch (FSM_EVENT) {
+               case EV_ENTRY:
+                       robot_move_by(0.42, NO_TURN(), &tcSlow);
+                       break;
+               case EV_MOTION_DONE:
+                       FSM_SIGNAL(ACT, EV_LOOK_FOR_PUCK, NULL);
+                       break;
+               case EV_PUCK_REACHABLE:
+                       FSM_SIGNAL(ACT, EV_GRASP_THE_PUCK, NULL);
+                       break;
+               case EV_PUCK_LOADED_UP:
+                       FSM_TRANSITION(simple_construction_zone_approach);
+                       break;
+               case EV_RETURN:
+               case EV_TIMER:
+               case EV_OBSTRUCTION_AHEAD:
+               case EV_LASER_POWER:
+               case EV_GOAL_NOT_REACHABLE:
+               case EV_SHORT_TIME_TO_END:
+               case EV_ENEMY_AHEAD:
+               case EV_STACK_FULL:
+               case EV_ACT_ERROR:
+               case EV_ACT_FATAL_ERROR:
+                       DBG_PRINT_EVENT("unhandled event");
+                       break;
+               case EV_EXIT:
+                       break;
+       }
+}
+
+FSM_STATE(simple_construction_zone_approach)
+{
+       switch (FSM_EVENT) {
+               case EV_ENTRY:
+                       robot_trajectory_new(&tcFast);
+                       robot_trajectory_add_point_trans(0.9, 1);
+                       robot_trajectory_add_final_point_trans(0.9, ROBOT_AXIS_TO_FRONT_M + 0.05, NO_TURN());
+                       break;
+               case EV_MOTION_DONE:
+                       FSM_SIGNAL(ACT, EV_UNLOAD_THE_PUCK, NULL);
+                       break;
+               case EV_PUCK_REACHABLE:
+               case EV_PUCK_LOADED_UP:
+               case EV_RETURN:
+               case EV_TIMER:
+               case EV_OBSTRUCTION_AHEAD:
+               case EV_LASER_POWER:
+               case EV_GOAL_NOT_REACHABLE:
+               case EV_SHORT_TIME_TO_END:
+               case EV_ENEMY_AHEAD:
+               case EV_STACK_FULL:
+               case EV_ACT_ERROR:
+               case EV_ACT_FATAL_ERROR:
+                       DBG_PRINT_EVENT("unhandled event");
+                       break;
+               case EV_EXIT:
+                       break;
+       }
+}
+
 FSM_STATE(approach_our_static_dispenser)
 {
        switch (FSM_EVENT) {
@@ -217,7 +291,7 @@ FSM_STATE(approach_our_static_dispenser)
                        }
                        break;
                case EV_MOTION_DONE:
-                       FSM_SIGNAL(ACT, EV_PICK_UP_PUCK, NULL);
+                       FSM_SIGNAL(ACT, EV_LOAD_THE_PUCK, NULL);
                        printf("Arrived to the static dispenser\n");
                        break;
                case EV_PUCK_LOADED_UP:
@@ -230,7 +304,10 @@ FSM_STATE(approach_our_static_dispenser)
                case EV_GOAL_NOT_REACHABLE:
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
+               case EV_PUCK_REACHABLE: // FIXME: handle this
                case EV_STACK_FULL:
+               case EV_ACT_ERROR:
+               case EV_ACT_FATAL_ERROR:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -255,7 +332,7 @@ FSM_STATE(approach_opponents_static_dispenser)
                        }
                        break;
                case EV_MOTION_DONE:
-                       FSM_SIGNAL(ACT, EV_PICK_UP_PUCK, NULL);
+                       FSM_SIGNAL(ACT, EV_LOAD_THE_PUCK, NULL);
                        printf("Arrived to the static dispenser\n");
                        break;
                case EV_PUCK_LOADED_UP:
@@ -268,7 +345,10 @@ FSM_STATE(approach_opponents_static_dispenser)
                case EV_GOAL_NOT_REACHABLE:
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
+               case EV_PUCK_REACHABLE: // FIXME: handle this
                case EV_STACK_FULL:
+               case EV_ACT_ERROR:
+               case EV_ACT_FATAL_ERROR:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
index 2e9e8e75d959ac5862de076e00a141cceb11c723..33485ef2c1fd6f4ead4f65950ed1a159c5aa6c09 100644 (file)
@@ -2,15 +2,19 @@ events = {
     "main" : {
         "EV_START" : "Changed state of start connector.",
         "EV_SHORT_TIME_TO_END" : "Time to go for the deposition regarless of what do we have.",
-       "EV_LASER_POWER" : "",
-       "EV_STACK_FULL" : "ACT FSM signals that the puck stack is full",
-       "EV_PUCK_LOADED_UP" : "ACT FSM signals that the puck has been embarked",
+       "EV_LASER_POWER" : "",          # FIXME: what's this? (F.J.)
 
-       "EV_MOTION_DONE" : "Previously submitted motion is finished",
+       "EV_STACK_FULL"         : "ACT FSM signals that the puck stack is full",
+       "EV_PUCK_LOADED_UP"     : "ACT FSM signals that the puck has been embarked",
+       "EV_PUCK_REACHABLE"     : "ACT FSM signals that the puck is in reachable position",
+       "EV_ACT_ERROR"          : "ACT FSM signals that the operation did not succeed",
+       "EV_ACT_FATAL_ERROR"    : "ACT FSM signals that there is some fatal error (HW signalling problems, ...)",
+
+       "EV_MOTION_DONE"        : "Previously submitted motion is finished",
        "EV_GOAL_NOT_REACHABLE" : "Path planner can't calculate a path to the goal. Probably obstacles are on the way.",
 
-       "EV_OBSTRUCTION_AHEAD" : "",
-       "EV_ENEMY_AHEAD" : "",
+       "EV_OBSTRUCTION_AHEAD" : "",    # FIXME: what's this exactly? (F.J.)
+       "EV_ENEMY_AHEAD" : "",          # FIXME: what's this exactly? (F.J.)
     },
     "loc" : {
        #"EV_ODO_RECEIVED" : "Execute prediction step based on odometry data",
@@ -32,9 +36,13 @@ events = {
     "disp" : {
     },
     "act" : {
-        "EV_PICK_UP_PUCK" : "Signal from the main FSM to initiate the puck picking up procedure",
-       "EV_PUCK_REACHABLE" : "Puck (or something) in reach of chelae",
-        "EV_PUCK_INSIDE" : "Puck inside the mechanism",
+        "EV_LOAD_THE_PUCK" : "Signal from the main FSM to initiate the puck picking up procedure",
+       "EV_GRASP_THE_PUCK": "Signal from the main FSM to make the mechanism grasp the puck and keep it holding tight",
+        "EV_LOOK_FOR_PUCK" : "Signal from the main FSM telling ACT FSM to use the Sharp sensor to indicate puck presence",
+        "EV_UNLOAD_THE_PUCK" : "Signal from the main FSM telling ACT FSM to unload the puck",
+
+       "EV_PUCK_REACHABLE": "Received through ORTE. Sharp sensor informs us, something (preferably the puck) is in reach of chelae",
+        "EV_PUCK_INSIDE"   : "Received through ORTE. Sharp sensor informs us that the puck is inside",
         #"EV_LIFT_GO_POSITION" : "",
         #"EV_LIFT_GROUND_POSITION" : "",
     }