Finite_State_Machines - Carnegie Mellon Robotics Club

advertisement
PROJECT
Finite State Machines
introduction to hunter-prey
DATE
10/8/10
PRESENTERS
JOSEPH LEE, ALEX ZIRBEL
Carnegie Mellon
So I hear you like Graph Theory.
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
An Example
Questions?
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
An Example
Questions?
Carnegie Mellon
Overview
Initial State
State
1
State
2
State
3
Sometimes it is best to draw a diagram.
Carnegie Mellon
Overview
When in doubt, do this:
1. Draw Diagram (Design)
2. Then Code (Implement)
int state = 1
while(1) {
switch(state) {
case 1:
printf(“hello!\n”);
state++;
break;
case 2:
printf(“good-bye.\n”);
state--;
break;
default:
printf(“AHH! You shouldn’t be here!\n”);
break;
}
}
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
An Example
Questions?
Carnegie Mellon
Implementation in C
A FSM in C consists of two parts:
A While Loop
while(1){
A Switch Statement
switch(state){
You should define your states
#define HUNTER 1
Carnegie Mellon
Implementation in C
Code Example:
#define PREY 0
#define HUNTER 1
#define WAIT -1
...
int state = PREY;
while(1){
switch(state){
case PREY:
/* prey code */
break;
case WAIT:
/* waiting code */
case HUNTER:
/* hunter code */
break;
default: break;
}
}
Carnegie Mellon
Implementation in C
Code Example:
#define PREY 0
#define HUNTER 1
#define WAIT -1
...
int state = PREY;
while(1){
switch(state){
case PREY:
/* prey code */
break;
case WAIT:
/* waiting code */
case HUNTER:
/* hunter code */
break;
default: break;
}
}
Define the states
Carnegie Mellon
Implementation in C
Code Example:
#define PREY 0
#define HUNTER 1
#define WAIT -1
...
int state = PREY;
while(1){
switch(state){
case PREY:
/* prey code */
break;
case WAIT:
/* waiting code */
case HUNTER:
/* hunter code */
break;
default: break;
}
}
Make the while loop
Carnegie Mellon
Implementation in C
Code Example:
#define PREY 0
#define HUNTER 1
#define WAIT -1
...
int state = PREY;
while(1){
switch(state){
case PREY:
/* prey code */
break;
case WAIT:
/* waiting code */
case HUNTER:
/* hunter code */
break;
default: break;
}
}
Add the switch
statement
Carnegie Mellon
Implementation in C
Code Example:
#define PREY 0
#define HUNTER 1
#define WAIT -1
...
int state = PREY;
while(1){
switch(state){
case PREY:
/* prey code */
break;
case WAIT:
/* waiting code */
case HUNTER:
/* hunter code */
break;
default: break;
}
}
You should have
break statements
Carnegie Mellon
Implementation in C
Things to look out for
Do not have states that go nowhere
Bad State
Conversely, do not have unreachable states
Bad State
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
An Example
Questions?
Carnegie Mellon
Hunter-Prey
The Prey has simple requirements
Design a prey that will run from the hunters
If the prey is tagged, it will first acknowledge the tag
After the prey acknowledges, it will change state to Waiting
After waiting, the bot will move to the Hunter state
Carnegie Mellon
Hunter-Prey
The Hunter is just as simple
Design a hunter that will catch the prey
When the hunter is close enough to the prey, it will tag the prey
If the prey acknowledges the tag, then the hunter becomes the Prey
If another hunter becomes the prey, your hunter changes state to Waiting
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
An Example
Questions?
Carnegie Mellon
An Example: Zombie Design
hunting
for
food
human shines
flashlight
Zombie becomes hungry
hiding in
corners
Zombie
recovers
Zombie decides
hunting is not worth it
blinded by
light
Carnegie Mellon
An Example: Zombie Implementation
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
hunting
for
food
human shines
flashlight
case HUNTING:
//locate flesh
//go towards flesh
//grab blindly
break;
case HUNTING:
//same as above
if(light_shine)
state=BLINDED;
break;
Carnegie Mellon
An Example: Zombie Implementation
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Carnegie Mellon
An Example: Zombie Implementation
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Carnegie Mellon
An Example: Zombie Implementation
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Carnegie Mellon
An Example: Zombie Implementation
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
state = HIDING
motivated = 0
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = HIDING
motivated = 0
After
state = HIDING
motivated = 1
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = HIDING
motivated = 1
After
state = HUNTING
motivated = 2
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = HUNTING
motivated = 2
After
state = BLINDED
motivated = 1
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = BLINDED
motivated = 1
After
state = HUNTING
motivated = 1
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = HUNTING
motivated = 1
After
state = BLINDED
motivated = 0
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = BLINDED
motivated = 0
After
state = HIDING
motivated = 0
Carnegie Mellon
An Example: Tracing Zombie
#define HIDING 0
#define HUNTING 1
#define BLINDED 2
int main(){
int state = HIDING;
int motivated = 0;
while(1){
switch(state){
case HIDING:
motivated++;
if(motivated >= 2)
state = HUNTING;
break;
case HUNTING:
if(light_shine){
motivated--;
state = BLINDED;
}
break;
case BLINDED:
if(!motivated)
state = HIDING;
else
state = HUNTING;
break;
}
}
}
Before
state = HIDING
motivated = 0
After
state = HIDING
motivated = 1
Back to Square 1
Carnegie Mellon
Introduction to Finite State Machines
Overview
Implementation in C
Hunter-Prey
Going Further
Questions?
Download