diff --git a/motion/include/mtn_library.h b/motion/include/mtn_library.h index 925bf9611c6642aeb667b49db7773be67b5def9d..3a2fc57eed029e5b005ab246f5acadc306f65cec 100644 --- a/motion/include/mtn_library.h +++ b/motion/include/mtn_library.h @@ -8,6 +8,9 @@ void mtn_lib_init(void); void mtn_lib_stop_mtn(void); void mtn_lib_set_start_foot(foot_t foot); +void reset_steps(void); +int get_steps (void); + uint8_t walk_forward(void); uint8_t walk_backward(void); uint8_t turn_left(void); @@ -37,10 +40,12 @@ uint8_t fast_walk_backward_turn_right(void); uint8_t walk_forward_compensating(int comp_ini, int current); +uint8_t walk_backward_compensating(int comp_ini, int current); uint8_t get_up_process(fallen_t fall_state); uint8_t stairs_up_process (fallen_t fall_state); uint8_t stairs_down_process(void); uint8_t walk_left_compensating (int comp_ini, int comp_act); uint8_t walk_right_compensating (int comp_ini, int comp_act); - +uint8_t turn_angle (int angle); +//uint8_t fast_walk_forward_compensating(int comp_ini, int current); #endif diff --git a/motion/src/mtn_library.c b/motion/src/mtn_library.c index 3a61e8fdb9c46983353ad03c84b9fcb80687909c..b7c143db0d3eac71b8244642b120ccbc6e7c69c0 100644 --- a/motion/src/mtn_library.c +++ b/motion/src/mtn_library.c @@ -6,12 +6,16 @@ #include <stdlib.h> #include "cm510.h" // private variables + +#define err 100 // the error allowed for when we turn (angle) now set at 10º = 100 typedef enum {mtn_fwd=0,mtn_bwd=1,mtn_turn_left=2,mtn_turn_right=3,mtn_left=4,mtn_right=5,mtn_fwd_turn_left=6,mtn_fwd_turn_right=7, mtn_bwd_turn_left=8,mtn_bwd_turn_right=9,mtn_fwd_left=10,mtn_fwd_right=11,mtn_bwd_left=12,mtn_bwd_right=13, mtn_fast_fwd=14,mtn_fast_bwd=15} mtn_t; typedef enum {idle,wait_start,wait_middle,wait_end} full_states; typedef enum {wf_idle,wf_middle,wf_adjust,wf_end} wf_states; +typedef enum {wb_idle,wb_middle,wb_adjust,wb_end} wb_states; +typedef enum {t_init,t_middle,t_left,t_right,t_wait_end} turn_states; typedef enum {wrc_idle,wrc_middle,wrc_wait_stop,wrc_adjust,wrc_end} wrc_states; typedef enum {wlc_idle,wlc_middle,wlc_wait_stop,wlc_adjust,wlc_end} wlc_states; @@ -27,7 +31,7 @@ typedef struct{ uint8_t end_l; uint8_t end_r; }TPages; - +int step_count; uint8_t mtn_lib_stop; foot_t mtn_lib_start_foot; foot_t mtn_lib_current_foot; @@ -331,6 +335,16 @@ int compass_deviation (int ini, int actual){ //Calculates the difference between return inc; } //return value is between -1800 and 1800 +int add_angles (int a, int b){ + int res = a+b; + if (res < 0 ) res+=360; + else if (res>360){ + res-=360; + } + return res; + +} + /* public functions */ void mtn_lib_init(void) @@ -338,6 +352,7 @@ void mtn_lib_init(void) mtn_lib_stop=0x00; mtn_lib_start_foot=left_foot; mtn_lib_current_foot=left_foot; + step_count = 0; } void mtn_lib_stop_mtn(void) @@ -350,6 +365,15 @@ void mtn_lib_set_start_foot(foot_t foot) mtn_lib_start_foot=foot; } +void reset_steps(void) +{ + step_count = 0; +} + +int get_steps (void){ + return step_count; +} + uint8_t walk_forward(void) { return mtn_lib_full(&mtn_pages[mtn_fwd]); @@ -480,6 +504,7 @@ uint8_t walk_forward_compensating(int comp_ini, int current){ //el primer cop qu case wf_middle: if (is_action_running()) state = wf_middle; else { + step_count++; if (mtn_lib_stop==0x01){ if (mtn_lib_current_foot==left_foot) action_set_page (F_E_L); else action_set_page (F_E_R); @@ -520,6 +545,7 @@ uint8_t walk_forward_compensating(int comp_ini, int current){ //el primer cop qu case wf_adjust: if (is_action_running()) state = wf_adjust; else { + step_count++; if (mtn_lib_stop==0x01){ if (diff > 0){ // si estamos girando a la izq solo podemos acabar con la derecha if (mtn_lib_current_foot==right_foot){ @@ -569,6 +595,7 @@ uint8_t walk_forward_compensating(int comp_ini, int current){ //el primer cop qu case wf_end: if (is_action_running()) state = wf_end; else { + step_count++; mtn_lib_stop =0x00; state = wf_idle; done = 0x01; @@ -580,6 +607,125 @@ uint8_t walk_forward_compensating(int comp_ini, int current){ //el primer cop qu } +uint8_t walk_backward_compensating(int comp_ini, int current){ //el primer cop que es crida ha d'estar en walk_ready + static wb_states state = wb_idle; + uint8_t done=0x00; + int diff = compass_deviation(comp_ini,current); + switch (state) { + case wb_idle: + if (mtn_lib_start_foot==left_foot) action_set_page (B_S_L); + else action_set_page (B_S_R); + action_start_page(); + mtn_lib_current_foot = (mtn_lib_start_foot + 1 )%2; + state = wb_middle; + break; + case wb_middle: + if (is_action_running()) state = wb_middle; + else { + step_count--; + if (mtn_lib_stop==0x01){ + if (mtn_lib_current_foot==left_foot) action_set_page (B_E_L); + else action_set_page (B_E_R); + action_start_page(); + state = wb_end; + } + else { + //si no se ha desviado o se ha desviado pero toca andar con el otro pie + if (abs (diff)<100 || (diff>100 && mtn_lib_current_foot==left_foot)|| (diff<-100 && mtn_lib_current_foot==right_foot )){ + if (mtn_lib_current_foot==left_foot) action_set_page (B_M_L); + else action_set_page (B_M_R); + action_start_page(); + state = wb_middle; + } + else { //se ha desviado + if (diff>0){ //si tenemos que corregir hacia la derecha solo podemos empezar con el pie derecho + if (mtn_lib_current_foot==right_foot) {//--> quizas este if no es necesario + action_set_page (BRT_M_R); + state = wb_adjust; + action_start_page(); + } + else state = wb_middle; + } + else { //si tenemos que corregir hacia la izquierda solo podemos empezar con el pie izquierdo + if (mtn_lib_current_foot==left_foot) { + state = wb_adjust; + action_set_page (BLT_M_L); + action_start_page(); + } + else state = wb_middle; + } + } + + } + change_foot(); + } + break; + case wb_adjust: + if (is_action_running()) state = wb_adjust; + else { + step_count--; + if (mtn_lib_stop==0x01){ + if (diff < 0){ // si estamos girando a la izq solo podemos acabar con la derecha + if (mtn_lib_current_foot==right_foot){ + action_set_page (BLT_E_R); + state=wb_end; + } + else { + action_set_page (BLT_M_L); + state = wb_adjust; + } + } + else {// si estamos girando a la derecha solo podemos acabar con la izq + if (mtn_lib_current_foot==left_foot) { + action_set_page (BRT_E_L); + state = wb_end; + } + else { + action_set_page (BRT_M_R); + state = wb_adjust; + } + } + action_start_page(); + change_foot(); + + } + else { + if (abs (diff) > 100) { + if (diff < 0){ //Girar a la izq + if (mtn_lib_current_foot==left_foot) action_set_page (BLT_M_L);//Forward Left Turn - wb_middle -Left foot + else action_set_page (BLT_M_R);//Forward Left Turn - wb_middle -Right foot + } + else { //Girar a la derecha + if (mtn_lib_current_foot==left_foot) action_set_page (BRT_M_L);//Forward Right Turn - wb_middle -Left foot + else action_set_page (BRT_M_R);//Forward Right Turn - wb_middle -Right foot + } + action_start_page(); + state = wb_adjust; + change_foot(); + + } + else { //podemos volver a andar normal + state = wb_middle; + } + } + } + break; + case wb_end: + if (is_action_running()) state = wb_end; + else { + step_count--; + mtn_lib_stop =0x00; + state = wb_idle; + done = 0x01; + } + break; + } + return done; + + +} + + uint8_t get_up_process(fallen_t fall_state) { static get_up_states state; @@ -945,4 +1091,64 @@ uint8_t walk_right_compensating (int comp_ini, int comp_act){ } return done; } +uint8_t turn_angle (int angle){ + static turn_states s = t_init; + static int comp_ini = 0; + static int comp_end = 0; + int done = 0; + + switch (s){ + case t_init: + comp_ini = exp_compass_get_avg_heading(); + comp_end = add_angles (comp_ini,angle*10); + + s=t_middle; + break; + case t_middle: + if (abs (compass_deviation (exp_compass_get_avg_heading(),comp_end))>err){ + // ("diff = %d\n",compass_deviation (exp_compass_get_avg_heading(),comp_end)); + if (compass_deviation (exp_compass_get_avg_heading(),comp_end)>err){ + s =t_right; + } + else if (compass_deviation (exp_compass_get_avg_heading(),comp_end)<-err){ + s=t_left; + } + } + else { + s = t_wait_end; + } + break; + case t_right: + if (turn_right()){ + s = t_wait_end; + } + else { + if (compass_deviation (exp_compass_get_avg_heading(),comp_end)<err){ + mtn_lib_stop_mtn(); + } + else s = t_right; + + } + break; + + case t_left: + if (turn_left()){ + s = t_wait_end; + } + else { + if (compass_deviation (exp_compass_get_avg_heading(),comp_end)>-err){ + mtn_lib_stop_mtn(); + } + else s = t_left; + + } + break; + case t_wait_end: + done =0x01; + s = t_init; + break; + + } + return done; +}