Project

General

Profile

Statistics
| Revision:

root / branches / autonomous_recharging / code / projects / autonomous_recharging / dragonfly / smart_run_around_fsm.c @ 1390

History | View | Annotate | Download (3.57 KB)

1 321 bcoltin
#include "dragonfly_lib.h"
2
#include "smart_run_around_fsm.h"
3 734 cmar
#include <wireless.h>
4 321 bcoltin
5
/*A simple behavior for navigating in an environment, i.e. avoiding walls and getting stuck.
6
Could be better at not getting stuck.
7

8
Latest revision only has two accessible states: move and reverse.
9
*/
10
11
12
void run_around_init(void)
13
{
14 697 cmar
  range_init();
15 321 bcoltin
16
  /*Start in the default state, MOVING*/
17
  avoid_state=MOVING;
18 734 cmar
  prev_state = avoid_state;
19 321 bcoltin
  /*Set timers to their maximum values.*/
20
  crazy_count=CRAZY_MAX;
21 695 cmar
  backup_count=BACKUP_MAX;
22 321 bcoltin
  pControl=0;
23
24
  /*Initialize distances to zero.*/
25
  d1=0; d2=0; d3=0; d4=0; d5=0;
26
27 759 cmar
  orb_set_color(BLUE);
28 321 bcoltin
29
}
30
31
/*The main function, call this to update states as frequently as possible.*/
32
void run_around_FSM(void) {
33 734 cmar
  prev_state = avoid_state;
34 697 cmar
  /*Default to moving.*/
35 734 cmar
  //avoid_state=MOVING;
36 321 bcoltin
37
  /*The following lines ensure that undefined (-1) values
38
  will not update the distances.*/
39
  int temp;
40
41
  temp=range_read_distance(IR1);
42 697 cmar
  d1=(temp == -1) ? d1 : temp;
43 321 bcoltin
44
  temp=range_read_distance(IR2);
45 697 cmar
  d2=(temp == -1) ? d2 : temp;
46 321 bcoltin
47
  temp=range_read_distance(IR3);
48 697 cmar
  d3=(temp == -1) ? d3 : temp;
49 321 bcoltin
50
  temp=range_read_distance(IR4);
51 697 cmar
  d4=(temp == -1) ? d4 : temp;
52 321 bcoltin
53
  temp=range_read_distance(IR5);
54 697 cmar
  d5=(temp == -1) ? d5 : temp;
55 321 bcoltin
56 697 cmar
  /*If the crazy count is in it's >>3 range, it acts crazy.*/
57 321 bcoltin
  if(crazy_count<=(CRAZY_MAX>>3))
58
  {
59
    avoid_state=CRAZY;
60
    crazy_count--;
61
62
    if(crazy_count<0) crazy_count=CRAZY_MAX;
63
64
    evaluate_state();
65
    return;
66
  }
67
68
  //Checks the forward distance to see if it should back up, if so...state backwards.
69 697 cmar
  if((d2!=-1)&&(d2 < 150)){
70 321 bcoltin
      backup_count=BACKUP_MAX;
71
      avoid_state=BACKWARDS;
72
      evaluate_state();
73
      return;
74
  }
75 734 cmar
76 321 bcoltin
  if(backup_count<BACKUP_MAX){
77 734 cmar
    usb_puts("DO I EVER GET HERE?\n\r");
78 697 cmar
    avoid_state=BACKWARDS;
79 321 bcoltin
    if(backup_count<0)
80
      backup_count=BACKUP_MAX;
81
    evaluate_state();
82
    return;
83
  }
84
85 734 cmar
  //usb_puts("avoid_state set to MOVING\n\r");
86
  avoid_state = MOVING;
87
88 697 cmar
  /*Should evaluate an expression from -255 to 255 to pass to move.*/
89 321 bcoltin
  pControl= ((d3-d1) + (d4-d5)) >> TURN_CONSTANT;
90
91
  if(pControl>PCONTROL_CRAZY_LIMIT || pControl<-PCONTROL_CRAZY_LIMIT) crazy_count--;
92 697 cmar
  /*i.e. if you really want to turn for an extended period of time...you're probably stuck.*/
93 321 bcoltin
94
  /*Debug stuff:*/
95
  /*usb_puts("pControl evaluating: ");
96
  usb_puti(pControl);
97
  usb_puts("\n\r");
98
  usb_puts("IR1: ");
99
  usb_puti(d1);
100
  usb_puts(" IR2: ");
101
  usb_puti(d2);
102
  usb_puts(" IR3: ");
103
  usb_puti(d3);
104
  usb_puts(" IR4: ");
105
  usb_puti(d4);
106
  usb_puts(" IR5: ");
107
  usb_puti(d5);
108
  usb_puts("\n\r");*/
109
110
  evaluate_state();
111
}
112
113
114
//Acts on state change.
115
void evaluate_state(){
116
    switch(avoid_state){
117 734 cmar
    case(MOVING): //orb_set_color(GREEN);
118 759 cmar
      if(prev_state == BACKWARDS) {
119
        delay_motors();
120
      }
121 321 bcoltin
      move(STRAIT_SPEED,-pControl);
122 734 cmar
      //motor1_set(FORWARD,200);
123
      //motor2_set(FORWARD,200);
124 321 bcoltin
      break;
125
126 734 cmar
    case(BACKWARDS): //orb_set_color(RED);
127 759 cmar
      if(prev_state == MOVING) {
128
        delay_motors();
129
      }
130 697 cmar
      move(-STRAIT_SPEED-50,0);
131 734 cmar
      //motor1_set(BACKWARD,200);
132
      //motor2_set(BACKWARD,200);
133 321 bcoltin
      break;
134
135 734 cmar
    case(CRAZY): //orb_set_color(RED);
136 321 bcoltin
      /*TODO: Implement a crazy state.*/
137 759 cmar
      if(prev_state == BACKWARDS) {
138
        delay_motors();
139
      }
140 321 bcoltin
      move(STRAIT_SPEED,-pControl);
141
      break;
142
143
    default:
144
      /*Should never get here, go strait.*/
145 734 cmar
      move(100,0); //orb_set_color(BLUE);
146 321 bcoltin
      break;
147
  }
148
}
149
150 734 cmar
void delay_motors() {
151
  int count = 0;
152
  move(0,0);
153
  //usb_puts("called delay_motors()\n\r");
154
  while(count < 300) {
155
    delay_ms(1);
156
    wl_do();
157
    count++;
158
  }
159
}