]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
MAIN and ACT fsms: defined events changed; different puck_distance message handling
authorFilip Jares <filipjares@post.cz>
Sun, 19 Apr 2009 18:16:01 +0000 (20:16 +0200)
committerFilip Jares <filipjares@post.cz>
Sun, 19 Apr 2009 18:16:01 +0000 (20:16 +0200)
actual puck_distance is now stored in robot.puck_distance
EV_PUCK_REACHABLE is now received by the MAIN FSM instead of ACT FSM

src/robodim/robodim.h
src/robofsm/fsmact.c
src/robofsm/fsmmain.c
src/robofsm/homologation.cc
src/robofsm/roboevent.py
src/robofsm/robot.h
src/robofsm/robot_orte.c
src/robofsm/test/test_actuators.cc

index 4a3b60242338ae8b92814c59e906ae8484e22c28..4381c230fcf3c53e455c57fa94d2840c96bb1228 100644 (file)
@@ -53,6 +53,8 @@
 #define HOKUYO_CENTER_OFFSET_M (HOKUYO_CENTER_OFFSET_MM/1000.0)
 
 #define ROBOT_AXIS_TO_PUCK_M 0.2 // puck approach distance
+#define PUCK_REACHABLE(x) ((x<0.13)?true:false)
+#define PUCK_INSIDE(x) ((x<=0.055)?true:false)
 
 /**
  * PLAYGROUND DIMENSIONS
index cf76d99fa9744c3abe70328754d418f450063bbf..62890e4c7f6ee6dba1bd4073d025ffd7c91ff67a 100644 (file)
@@ -43,16 +43,15 @@ FSM_STATE(wait_for_command)
        case EV_ENTRY:
                act_belts(BELTS_OFF, BELTS_OFF);
                act_chelae(CHELA_OPEN, CHELA_OPEN);
+               act_holder(HOLDER_OPENED);
+               act_lift(100);
+               act_pusher(100);
                // TODO
                // put all actuators to defined initial positions
                break;
        case EV_LOAD_THE_PUCK:
                FSM_TRANSITION(dummy_action);
                break;
-       case EV_LOOK_FOR_PUCK:
-               //FSM_TRANSITION(dummy_action);
-               FSM_TRANSITION(look_for_puck);
-               break;
        case EV_GRASP_THE_PUCK:
                //FSM_TRANSITION(dummy_action);
                FSM_TRANSITION(grasp_the_puck);
@@ -61,63 +60,10 @@ FSM_STATE(wait_for_command)
                FSM_TRANSITION(dummy_action);
                //FSM_TRANSITION(...);
                break;
-       case EV_PUCK_REACHABLE:  // we do not want react unless MAIN FSM tell us to
        case EV_PUCK_INSIDE:     // we do not want react unless MAIN FSM tell us to
                break;
        case EV_RETURN:
-       case EV_STOP_LOOKING:
-       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_INSIDE:    // FIXME: handle this the same way
-       case EV_PUCK_REACHABLE: // like EV_PUCK_REACHABLE? or differently?
-               FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
-               FSM_TRANSITION(wait_for_command);
-               break;
-       case EV_STOP_LOOKING:
-               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_UNLOAD_THE_PUCK:
-               DBG_PRINT_EVENT("unhandled event");
-               break;
-       case EV_EXIT:
-               break;
-       }
-}
-
-FSM_STATE(reactive_demo)
-{
-       switch (FSM_EVENT) {
-       case EV_ENTRY:
-               break;
-       case EV_PUCK_REACHABLE:
-               FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
-               FSM_TRANSITION(suck_the_puck);
-               break;
-       case EV_PUCK_INSIDE:
-               break;
-       case EV_RETURN:
        case EV_TIMER:
-       case EV_LOAD_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
-       case EV_STOP_LOOKING:
-       case EV_UNLOAD_THE_PUCK:
-       case EV_GRASP_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
        case EV_EXIT:
@@ -133,9 +79,8 @@ FSM_STATE(grasp_the_puck)
                act_chelae(CHELA_TIGHT, CHELA_TIGHT);
                FSM_TIMER(2000);
                break;
-       case EV_PUCK_REACHABLE:
-               break;
        case EV_PUCK_INSIDE:
+               FSM_TIMER_STOP();
                act_belts(BELTS_OFF, BELTS_OFF);
                FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
                FSM_TRANSITION(hold_the_puck);
@@ -147,13 +92,10 @@ FSM_STATE(grasp_the_puck)
        case EV_UNLOAD_THE_PUCK:
        case EV_RETURN:
        case EV_LOAD_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
-       case EV_STOP_LOOKING:
        case EV_GRASP_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
        case EV_EXIT:
-               //FSM_TIMER_STOP();
                break;
        }
 }
@@ -163,7 +105,6 @@ FSM_STATE(hold_the_puck)
        switch (FSM_EVENT) {
        case EV_ENTRY:
                break;
-       case EV_PUCK_REACHABLE:
        case EV_PUCK_INSIDE:
                break;
        case EV_UNLOAD_THE_PUCK:
@@ -179,8 +120,6 @@ FSM_STATE(hold_the_puck)
                break;
        case EV_RETURN:
        case EV_LOAD_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
-       case EV_STOP_LOOKING:
        case EV_GRASP_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
@@ -208,10 +147,7 @@ FSM_STATE(suck_the_puck)
                break;
        case EV_LOAD_THE_PUCK:
        case EV_GRASP_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
-       case EV_STOP_LOOKING:
        case EV_UNLOAD_THE_PUCK:
-       case EV_PUCK_REACHABLE:
                DBG_PRINT_EVENT("unhandled event");
                break;
        case EV_EXIT:
@@ -231,14 +167,11 @@ FSM_STATE(dummy_action)
                FSM_SIGNAL(MAIN, EV_ACTION_DONE, NULL);
                FSM_TRANSITION(wait_for_command);
                break;
-       case EV_PUCK_REACHABLE:
        case EV_PUCK_INSIDE:
                break;
        case EV_RETURN:
        case EV_LOAD_THE_PUCK:
        case EV_GRASP_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
-       case EV_STOP_LOOKING:
        case EV_UNLOAD_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
@@ -253,13 +186,11 @@ FSM_STATE()
        switch (FSM_EVENT) {
        case EV_ENTRY:
                break;
-       case EV_PUCK_REACHABLE:
        case EV_PUCK_INSIDE:
        case EV_UNLOAD_THE_PUCK:
        case EV_TIMER:
        case EV_RETURN:
        case EV_LOAD_THE_PUCK:
-       case EV_LOOK_FOR_PUCK:
        case EV_GRASP_THE_PUCK:
                DBG_PRINT_EVENT("unhandled event");
                break;
index 87bb1162251ea37b40c7acedc573b68a3ef8be97..e8c0a7ee26acd989a96f3d0403a3026b953093ed 100644 (file)
@@ -227,7 +227,8 @@ FSM_STATE_DECL(approach_our_static_dispenser);
 FSM_STATE_DECL(approach_opponents_static_dispenser);
 /* States handling ACT's actions (SUBFSMs) */
 FSM_STATE_DECL(grasp_the_puck);
-FSM_STATE_DECL(look_for_puck);
+FSM_STATE_DECL(look_for_puck_ahead);
+FSM_STATE_DECL(look_around_for_puck);
 
 /************************************************************************
  * INITIAL AND STARTING STATES
@@ -303,7 +304,7 @@ FSM_STATE(wait_for_start)
                case EV_STACK_FULL:
                case EV_ACTION_DONE:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_MOTION_DONE:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -320,7 +321,6 @@ FSM_STATE(collect_free_pucks)
 {
        static const int lot = 3;  // this variable location is temporary...; going to be received from the camera
        static int free_puck_to_get = 0; // next free puck number to pick up
-       static struct puck_pos pp;
        switch (FSM_EVENT) {
                case EV_ENTRY:
                        robot_goto_puck_in_grid(
@@ -331,6 +331,8 @@ FSM_STATE(collect_free_pucks)
                        break;
                case EV_MOTION_DONE:
                        printf("arrived to the free puck no. %d\n", free_puck_to_get);
+                       break;
+               case EV_RETURN:
                        if(free_puck_to_get<4) {
                                robot_goto_puck_in_grid(
                                        free_puck_pick_up_sequence[lot][free_puck_to_get][0],
@@ -340,7 +342,6 @@ FSM_STATE(collect_free_pucks)
                        }
                        break;
                case EV_ACTION_DONE:
-               case EV_RETURN:
                case EV_TIMER:
                case EV_OBSTRUCTION_AHEAD:
                case EV_LASER_POWER:
@@ -349,7 +350,7 @@ FSM_STATE(collect_free_pucks)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -370,7 +371,7 @@ FSM_STATE(approach_first_puck)
                        break;
                case EV_MOTION_DONE:
                        //FSM_SIGNAL(ACT, EV_LOOK_FOR_PUCK, NULL);
-                       SUBFSM_TRANSITION(look_for_puck, NULL);
+                       SUBFSM_TRANSITION(look_around_for_puck, NULL);
                        break;
                case EV_ACTION_DONE:
                        //SUBFSM_TRANSITION(grasp_the_puck, NULL);
@@ -391,7 +392,7 @@ FSM_STATE(approach_first_puck)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -421,7 +422,7 @@ FSM_STATE(simple_construction_zone_approach)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -462,7 +463,7 @@ FSM_STATE(approach_our_static_dispenser)
                //case EV_PUCK_REACHABLE: // FIXME: handle this
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -503,7 +504,7 @@ FSM_STATE(approach_opponents_static_dispenser)
                //case EV_PUCK_REACHABLE: // FIXME: handle this
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -513,7 +514,7 @@ FSM_STATE(approach_opponents_static_dispenser)
 }
 
 /************************************************************************
- * STATES HANDLING ACT's ACTIONS
+ * STATES HANDLING ACT's ACTIONS (to be used as SUB FSMs)
  ************************************************************************/
 
 FSM_STATE(grasp_the_puck)
@@ -536,7 +537,7 @@ FSM_STATE(grasp_the_puck)
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -545,27 +546,26 @@ FSM_STATE(grasp_the_puck)
        }
 }
 
-FSM_STATE(look_for_puck)
+FSM_STATE(look_around_for_puck)
 {
        static int lfp_status = 0;
        const static int scatter_angle = 20;
        static struct ref_pos_type orig_position;
        switch (FSM_EVENT) {
                case EV_ENTRY:
-                       FSM_SIGNAL(ACT, EV_LOOK_FOR_PUCK, NULL);
                        ROBOT_LOCK(ref_pos);
                        orig_position = robot.ref_pos;
                        ROBOT_UNLOCK(ref_pos);
-                       printf("original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
+                       //printf("original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
                        robot_move_by(0, TURN_CW(DEG2RAD(RAD2DEG(orig_position.phi)-scatter_angle)), &tcSlow);
-                       printf("lfp_status: %d\n", lfp_status);
+                       //printf("lfp_status: %d\n", lfp_status);
                        break;
                case EV_MOTION_DONE:
                        switch (lfp_status) {
                        case 0:
-                               printf("2. original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
-                               printf("robot.fer_pos angle of rotation of the robot: %f degrees\n", RAD2DEG(robot.ref_pos.phi));
-                               printf("--- robot move by ... turn cw\n");
+                               //printf("2. original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
+                               //printf("robot.fer_pos angle of rotation of the robot: %f degrees\n", RAD2DEG(robot.ref_pos.phi));
+                               //printf("--- robot move by ... turn cw\n");
                                robot_move_by(0, TURN_CCW(DEG2RAD(RAD2DEG(orig_position.phi)+scatter_angle)), &tcSlow);
                                lfp_status++;
                                break;
@@ -577,12 +577,13 @@ FSM_STATE(look_for_puck)
                                SUBFSM_RET((void *)false);
                                break;
                        }
-                       printf("lfp_status: %d\n", lfp_status);
+                       //printf("lfp_status: %d\n", lfp_status);
                        break;
-               case EV_ACTION_DONE: // puck found
+               case EV_PUCK_REACHABLE: // puck found
                        robot_stop();
                        SUBFSM_RET((void *)true);
                        break;
+               case EV_ACTION_DONE:
                case EV_ACTION_ERROR: // look for puck does not send this event
                case EV_RETURN:
                case EV_TIMER:
@@ -592,7 +593,6 @@ FSM_STATE(look_for_puck)
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
-               case EV_ACT_FATAL_ERROR:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -619,7 +619,7 @@ FSM_STATE()
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
index a5d6a46a71661022e73067607428ca242019937e..2bcb517c2a59bfc4892cb92d10a6432096e0e50e 100644 (file)
@@ -45,6 +45,8 @@ FSM_STATE_DECL(simple_construction_zone_approach);
 FSM_STATE_DECL(get_out_of_the_construction_zone);
 
 FSM_STATE_DECL(grasp_the_puck);
+FSM_STATE_DECL(look_around_for_puck);
+
 /************************************************************************
  * INITIAL AND STARTING STATES
  ************************************************************************/
@@ -103,7 +105,7 @@ FSM_STATE(wait_for_start)
                case EV_STACK_FULL:
                case EV_ACTION_DONE:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_MOTION_DONE:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -123,15 +125,31 @@ FSM_STATE(approach_first_puck)
                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_ACTION_DONE:
-                       SUBFSM_TRANSITION(grasp_the_puck, NULL);
+               case EV_MOTION_DONE: {
+                               int i = 0;      
+                               if (PUCK_REACHABLE(robot.puck_distance)) {
+                                       printf("Puck reachable, telling act to grasp the puck\n");
+                                       SUBFSM_TRANSITION(grasp_the_puck, NULL);
+                               } else {
+                                       switch(i) {
+                                       case (0):
+                                               printf("making transition to look_around_for_puck state\n");
+                                               SUBFSM_TRANSITION(look_around_for_puck, NULL);
+                                               break;
+                                       case (1):
+                                               printf("telling the robot to move by 5 cm and try again\n");
+                                               robot_move_by(0.05, NO_TURN(), &tcSlow);
+                                               break;
+                                       }
+                                       i++;
+                               }
+                       }
                        break;
+               case EV_PUCK_REACHABLE:
                case EV_RETURN:
                        FSM_TRANSITION(simple_construction_zone_approach);
                        break;
+               case EV_ACTION_DONE:
                case EV_TIMER:
                case EV_OBSTRUCTION_AHEAD:
                case EV_LASER_POWER:
@@ -139,8 +157,6 @@ FSM_STATE(approach_first_puck)
                case EV_SHORT_TIME_TO_END:
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
-               case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -155,7 +171,7 @@ FSM_STATE(simple_construction_zone_approach)
                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());
+                       robot_trajectory_add_final_point_trans(0.9, ROBOT_AXIS_TO_FRONT_M + 0.00, NO_TURN());
                        break;
                case EV_MOTION_DONE:
                        FSM_SIGNAL(ACT, EV_UNLOAD_THE_PUCK, NULL);
@@ -172,7 +188,7 @@ FSM_STATE(simple_construction_zone_approach)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -199,7 +215,7 @@ FSM_STATE(get_out_of_the_construction_zone)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
                case EV_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -208,6 +224,10 @@ FSM_STATE(get_out_of_the_construction_zone)
        }
 }
 
+/************************************************************************
+ * STATES HANDLING ACT's ACTIONS (to be used as SUB FSMs)
+ ************************************************************************/
+
 FSM_STATE(grasp_the_puck)
 {
        switch (FSM_EVENT) {
@@ -227,7 +247,62 @@ FSM_STATE(grasp_the_puck)
                case EV_ENEMY_AHEAD:
                case EV_STACK_FULL:
                case EV_ACTION_ERROR:
-               case EV_ACT_FATAL_ERROR:
+               case EV_PUCK_REACHABLE:
+               case EV_START:
+                       DBG_PRINT_EVENT("unhandled event");
+                       break;
+               case EV_EXIT:
+                       break;
+       }
+}
+
+FSM_STATE(look_around_for_puck)
+{
+       static int lfp_status = 0;
+       const static int scatter_angle = 20;
+       static struct ref_pos_type orig_position;
+       switch (FSM_EVENT) {
+               case EV_ENTRY:
+                       ROBOT_LOCK(ref_pos);
+                       orig_position = robot.ref_pos;
+                       ROBOT_UNLOCK(ref_pos);
+                       //printf("original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
+                       robot_move_by(0, TURN_CW(DEG2RAD(RAD2DEG(orig_position.phi)-scatter_angle)), &tcSlow);
+                       //printf("lfp_status: %d\n", lfp_status);
+                       break;
+               case EV_MOTION_DONE:
+                       switch (lfp_status) {
+                       case 0:
+                               //printf("2. original angle of rotation of the robot: %f degrees\n", RAD2DEG(orig_position.phi));
+                               //printf("robot.fer_pos angle of rotation of the robot: %f degrees\n", RAD2DEG(robot.ref_pos.phi));
+                               //printf("--- robot move by ... turn cw\n");
+                               robot_move_by(0, TURN_CCW(DEG2RAD(RAD2DEG(orig_position.phi)+scatter_angle)), &tcSlow);
+                               lfp_status++;
+                               break;
+                       case 1:
+                               robot_move_by(0, TURN(orig_position.phi), &tcSlow);
+                               lfp_status++;
+                               break;
+                       case 2: // puck not found
+                               SUBFSM_RET((void *)false);
+                               break;
+                       }
+                       //printf("lfp_status: %d\n", lfp_status);
+                       break;
+               case EV_PUCK_REACHABLE: // puck found
+                       robot_stop();
+                       SUBFSM_RET((void *)true);
+                       break;
+               case EV_ACTION_DONE:
+               case EV_ACTION_ERROR: // look for puck does not send this event
+               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_START:
                        DBG_PRINT_EVENT("unhandled event");
                        break;
@@ -236,6 +311,10 @@ FSM_STATE(grasp_the_puck)
        }
 }
 
+/************************************************************************
+ * MAIN FUNCTION
+ ************************************************************************/
+
 int main()
 {
        int rv;
index 6f3a18b48df72278f6cb278cb4204a609beb7904..7d9658406af63df48902fd4026bcc55da8ba33a7 100644 (file)
@@ -6,7 +6,7 @@ events = {
 
        "EV_ACTION_DONE"        : "ACT FSM signals that the requested action has finished successfully",
        "EV_ACTION_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_PUCK_REACHABLE"     : "Received through ORTE. Sharp sensor informs us, something (preferably the puck) is in reach of chelae",
        "EV_STACK_FULL"         : "ACT FSM signals that the puck stack is full",
 
        "EV_MOTION_DONE"        : "Previously submitted motion is finished",
@@ -37,11 +37,10 @@ events = {
     "act" : {
         "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_STOP_LOOKING" : "Signal from the main FSM telling ACT FSM to return back to the wait_for_command state",
+        # we don't want this to be implemented using ACT FSM: "EV_LOOK_FOR_PUCK" : "Signal from the main FSM telling ACT FSM to use the Sharp sensor to indicate puck presence",
+        "EV_STOP_LOOKING" : "Signal from the main FSM telling ACT FSM to return back to the wait_for_command state",
         "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" : "",
index 02a892bccaf5524bfb387e740d8bac3c4e4560cb..89ede6da5504488f31ccc809bc73146789901b16 100644 (file)
@@ -171,6 +171,7 @@ struct robot {
        /* sensors */
        struct motion_irc_type motion_irc;     /* odometry */
        struct corr_distances_type corr_distances;  /* ultrasound */
+       double puck_distance;   /* sharp sensor to puck distance in meters */
 
        struct hokuyo_scan_type hokuyo;
        struct cmu_type cmu;
index f4688521a2df8905ea84813726147e29587251b0..4e3da928c0a688f9c48a5953d948b6d57dd67525 100644 (file)
@@ -261,21 +261,29 @@ void rcv_puck_distance_cb(const ORTERecvInfo *info, void *vinstance,
                            void *recvCallBackParam)
 {
        switch (info->status) {
-               case NEW_DATA:
-                       //printf("Sharp distance: %f\n", robot.orte.puck_distance.distance);
-                       if(robot.orte.puck_distance.distance <= 0.055) {
+       case NEW_DATA: {
+                       double old_distance_value = robot.puck_distance;
+
+                       ROBOT_LOCK(sharps);
+                       robot.puck_distance = robot.orte.puck_distance.distance;
+                       ROBOT_UNLOCK(sharps);
+
+                       if (PUCK_INSIDE(robot.orte.puck_distance.distance) && !PUCK_INSIDE(old_distance_value)) {
+                               // signal puck is inside
                                FSM_SIGNAL(ACT, EV_PUCK_INSIDE, NULL);
                        }
-                       if(robot.orte.puck_distance.distance < 0.13 && robot.orte.puck_distance.distance > 0.055) {
-                               FSM_SIGNAL(ACT, EV_PUCK_REACHABLE, NULL);
+                       if (PUCK_REACHABLE(robot.orte.puck_distance.distance) && !PUCK_REACHABLE(old_distance_value)) {
+                               // signal puck is reachable
+                               FSM_SIGNAL(MAIN, EV_PUCK_REACHABLE, NULL);
                        }
-                       break;
-               case DEADLINE:
-                       // FIXME F.J. (?) inform display in case of invalid data?
-                       // FIXME F.J. (?) limited space on the display...
-                       //robot.hw_status[STATUS_ACTUATORS]=HW_STATUS_FAILED;
-                       DBG("ORTE deadline occurred - servos receive\n");
-                       break;
+               }
+               break;
+       case DEADLINE:
+               // FIXME F.J. (?) inform display in case of invalid data?
+               // FIXME F.J. (?) limited space on the display...
+               //robot.hw_status[STATUS_ACTUATORS]=HW_STATUS_FAILED;
+               DBG("ORTE deadline occurred - servos receive\n");
+               break;
        }
 }
 
index eb3bf0af251e73d38501a8851f1dfe91e96b0ef3..9e1b9fc76784c857b396355f724feb7ba5007020 100644 (file)
@@ -84,8 +84,8 @@ FSM_STATE(just_receive_events)
                case EV_ACTION_ERROR:
                        printf("MAIN: EV_ACTION_ERROR arrived\n");
                        break;
-               case EV_ACT_FATAL_ERROR:
-                       printf("MAIN: EV_ACT_FATAL_ERROR arrived\n");
+               case EV_PUCK_REACHABLE:
+                       printf("MAIN: EV_PUCK_REACHABLE arrived\n");
                        break;
                case EV_MOTION_DONE:
                case EV_RETURN:
@@ -114,11 +114,6 @@ void * handle_keyboard(void *)
                        printf("Sending 'EV_GRASP_THE_PUCK' event to the act fsm\n");
                        FSM_SIGNAL(ACT, EV_GRASP_THE_PUCK, NULL);
                        break;
-               case 's' : 
-               case 'S' :
-                       printf("Sending 'EV_LOOK_FOR_PUCK' event to the act fsm\n");
-                       FSM_SIGNAL(ACT, EV_LOOK_FOR_PUCK, NULL);
-                       break;
                case 'u' : 
                case 'U' :
                        printf("Sending 'EV_UNLOAD_THE_PUCK' event to the act fsm\n");