Nedenfor findes den tilstandsmaskine, Willy brugte til at køre gennem RoboCup banen i 2006.
Hver state består af tre ting:
- Initial: Det som sker, førtste gang robotten kommer ind i den pågældende tilstand.
- Action: Det som skal ske, så længe robotten er i tilstanden.
- Goto: Betingelser, der skal være opfyldt, for at robotten skifter til en anden tilstand.
Tilstandsmaskinen består af 65 tilstande.
| Start | |
|---|---|
| Stille og roligt mod guillotinen | |
| Initial | Set speed=0.88 m/s acc=5 dacc=1 Reset encoders Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at center edge, offset 0 |
| Goto | Flise 1 if All line |
| Flise 1 | |
|---|---|
| Willy ser dårligt på fliserne - kør over dem med lukkede øjne | |
| Initial | Set servo 0 to position -40 Reset encoders |
| Action | Do nothing |
| Goto | Mellem to første fliser if left encoder > 44.7 cm |
| Mellem to første fliser | |
|---|---|
| Initial | Set speed=0.50 m/s acc=1 dacc=1 |
| Action | Follow line at left edge, offset 0 |
| Goto | Flise 2 if All line |
| Flise 2 | |
|---|---|
| Willy ser dårligt på fliserne - kør over dem med lukkede øjne | |
| Initial | Set servo 0 to position -47 Reset encoders |
| Action | Do nothing |
| Goto | Racerbane 1 if left encoder > 44.0 cm |
| Racerbane 1 | |
|---|---|
| Hurtigt indtil svinget | |
| Initial | Set speed=1.50 m/s acc=5 dacc=1 Set linesensor threshold=160, background=127, line color=black Reset encoders |
| Action | Follow line at center edge, offset 3 |
| Goto | Racerbane 2 if left encoder > 409.9 cm |
| Racerbane 2 | |
|---|---|
| Lidt langsommere i svinget | |
| Initial | Set speed=1.12 m/s acc=1 dacc=1 Reset encoders |
| Action | Follow line at center edge, offset 5 |
| Goto | Racerbane 3 if left encoder > 264.9 cm |
| Racerbane 3 | |
|---|---|
| Hurtigt på langsiden | |
| Initial | Set speed=1.62 m/s acc=8 dacc=1 Reset encoders |
| Action | Follow line at center edge, offset 3 |
| Goto | Racerbane 4 if left encoder > 329.9 cm |
| Racerbane 4 | |
|---|---|
| Sænk hastigheden før flisen | |
| Initial | Set speed=0.50 m/s acc=1 dacc=3 Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at center edge, offset 0 |
| Goto | Flise efter racerbane if All line |
| Flise efter racerbane | |
|---|---|
| Willy ser dårligt på fliserne - kør over dem med lukkede øjne | |
| Initial | Set servo 0 to position -35 Reset encoders Set speed=0.50 m/s acc=1 dacc=5 |
| Action | Do nothing |
| Goto | Mellem 3. og 4. flise if right encoder > 49.9 cm |
| Mellem 3. og 4. flise | |
|---|---|
| Action | Follow line at center edge, offset 0 |
| Goto | Flise 4 if All line |
| Flise 4 | |
|---|---|
| Willy ser dårligt på fliserne - kør over dem med lukkede øjne | |
| Initial | Set servo 0 to position -35 Reset encoders |
| Action | Do nothing |
| Goto | Til første blinkende port if left encoder > 44.7 cm |
| Til første blinkende port | |
|---|---|
| Kør hen mod den blinkende port. Afstanden til porten måles fra flisekanten | |
| Initial | Set speed=0.25 m/s acc=1 dacc=1 Set linesensor threshold=160, background=127, line color=black Reset encoders |
| Action | Follow line at center edge, offset 0 |
| Goto | Bak væk fra port 1 if left encoder > 175.8 cm |
| Bak væk fra port 1 | |
|---|---|
| Robotten skal holde vinkelret ind mod porten, for at kunne se de blinkende dioder, så der skal lige navigeres lidt | |
| Initial | Set speed=-0.25 m/s acc=3 dacc=3 Set servo 0 to position -127 Reset encoders |
| Action | Do nothing |
| Goto | Bak væk fra port 2 if right encoder < -99.8 cm |
| Bak væk fra port 2 | |
|---|---|
| Initial | Set servo 0 to position 127 Reset encoders |
| Action | Do nothing |
| Goto | Frem mod streg if right encoder < -24.9 cm |
| Frem mod streg | |
|---|---|
| Initial | Set speed=0.18 m/s acc=1 dacc=1 Set servo 0 to position 0 |
| Action | Do nothing |
| Goto | Lidt længere frem if All line |
| Lidt længere frem | |
|---|---|
| Sådan. Med linjesensoren 1.6 cm inde over stregen er lyssensoren placeret ud for porten. | |
| Initial | Reset encoders |
| Action | Do nothing |
| Goto | Vent på værdi fra blink sensor if left encoder > 1.6 cm |
| Vent på værdi fra blink sensor | |
|---|---|
| Der skal lige ventes lidt, så softwaren kan finde ud af om der er noget der binker med 1 Hz | |
| Initial | Set speed=0.00 m/s acc=100 dacc=100 |
| Action | Do nothing |
| Goto | Vælg hvilken port der skal køres gennem if Time > 1.50 s |
| Vælg hvilken port der skal køres gennem | |
|---|---|
| Analog 4 er et filtreret signal. Robotten sampler en fotodiode 50 gange i sekundet. Løbende beregnes middelværdien af disse 50 samples. Hvis ca. halvdelen af samples ligger et stykke over middelværdien, og den anden halvdel ligger under middelværdien, sættes analog 4 = 800 - ellers sættes den til 0 | |
| Action | Do nothing |
| Goto | Gennem første blinkende port 1 if Analog input 4 < 150 Uden om første blinkende port 1 if Analog input 4 > 650 |
| Gennem første blinkende port 1 | |
|---|---|
| Navigiation gennem første port | |
| Initial | Set speed=-0.25 m/s acc=3 dacc=3 Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Gennem første blinkende port 2 if left encoder < -4.8 cm |
| Gennem første blinkende port 2 | |
|---|---|
| Initial | Set servo 0 to position -127 Set speed=0.50 m/s acc=1 dacc=1 Reset encoders |
| Action | Do nothing |
| Goto | Uden om anden blinkende port 1 if right encoder > 69.7 cm |
| Uden om anden blinkende port 1 | |
|---|---|
| Navigaiton uden om anden port | |
| Initial | Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Uden om anden blinkende port 2 if left encoder > 80.0 cm |
| Uden om anden blinkende port 2 | |
|---|---|
| Initial | Set servo 0 to position 60 Reset encoders |
| Action | Do nothing |
| Goto | Uden om anden blinkende port 3 if right encoder > 59.8 cm |
| Uden om anden blinkende port 3 | |
|---|---|
| Initial | Set servo 0 to position -20 |
| Action | Do nothing |
| Goto | Følg linie mod tunnel if One line |
| Uden om første blinkende port 1 | |
|---|---|
| Navigation uden om første port | |
| Initial | Reset encoders Set speed=-0.50 m/s acc=1 dacc=1 Set servo 0 to position -60 |
| Action | Do nothing |
| Goto | Uden om første blinkende port 2 if right encoder < -49.9 cm |
| Uden om første blinkende port 2 | |
|---|---|
| Initial | Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Uden om første blinkende port 3 if left encoder < -49.9 cm |
| Uden om første blinkende port 3 | |
|---|---|
| Initial | Set servo 0 to position -70 Reset encoders Set speed=0.50 m/s acc=4 dacc=1 |
| Action | Do nothing |
| Goto | Gennem anden blinkende port if right encoder > 89.9 cm |
| Gennem anden blinkende port | |
|---|---|
| Navigation gennem anden port | |
| Initial | Set servo 0 to position -25 Reset encoders |
| Action | Do nothing |
| Goto | Følg linie mod tunnel if right encoder > 30.5 cm |
| Følg linie mod tunnel | |
|---|---|
| Initial | Set speed=0.25 m/s acc=1 dacc=1 Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at left edge, offset 0 |
| Goto | Bak tilbage ved tunnel if button front left, or front right is on |
| Bak tilbage ved tunnel | |
|---|---|
| Initial | Set servo 0 to position -100 Set speed=-0.55 m/s acc=1 dacc=10 Reset encoders |
| Action | Do nothing |
| Goto | Fortsæt bagud forbi låge if right encoder < -155.6 cm |
| Fortsæt bagud forbi låge | |
|---|---|
| Initial | Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Ret op if left encoder < -59.8 cm |
| Ret op | |
|---|---|
| Så robotten er parallel med tunnel side | |
| Initial | Set servo 0 to position 52 Reset encoders |
| Action | Do nothing |
| Goto | Fremad for at åbne tunnel dør if left encoder < -24.9 cm |
| Fremad for at åbne tunnel dør | |
|---|---|
| Initial | Set speed=0.75 m/s acc=10 dacc=1 Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Lidt væk fra tunnel if right encoder > 29.7 cm |
| Lidt væk fra tunnel | |
|---|---|
| Robotten kan ikke dreje helt skarpt nok ind til linien, så den skal lige lidt væk først | |
| Initial | Set speed=0.50 m/s acc=40 dacc=40 Reset encoders Set servo 0 to position 60 |
| Action | Do nothing |
| Goto | Gennem åben dør if right encoder > 24.9 cm |
| Gennem åben dør | |
|---|---|
| Initial | Set servo 0 to position -127 Reset encoders Set speed=0.50 m/s acc=1 dacc=1 |
| Action | Do nothing |
| Goto | Linie gennem tunnel if right encoder > 104.9 cm |
| Linie gennem tunnel | |
|---|---|
| Initial | Set speed=0.38 m/s acc=1 dacc=1 Reset encoders Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at center edge, offset 0 |
| Goto | Forbi flise efter tunnel if All line |
| Forbi flise efter tunnel | |
|---|---|
| Robotten har problemer med fliserne, så der køres med fast vinkel på forhjulene, når fliserne nås.Denne state kan også være nået, hvis robotten ikke ramte lågen, som derfor ikke er åbnet. I så fald vil robotten nu være kørt ind i lågen, hvorfor den nu skal forsøge at åbne den igen | |
| Initial | Set servo 0 to position -7 Reset encoders Set servo 1 to position 127 Set servo 2 to position -40 |
| Action | Do nothing |
| Goto | Hen mod opsamling af første bold if left encoder > 44.4 cm Bak tilbage ved tunnel if button front left, or front right is on |
| Hen mod opsamling af første bold | |
|---|---|
| Action | Follow line at left edge, offset 0 |
| Goto | Tag første bold if Analog input 0 > 3800 |
| Tag første bold | |
|---|---|
| Robottens næb lukkes | |
| Initial | Set servo 2 to position 127 Set speed=0.50 m/s acc=1 dacc=1 Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at center edge, offset 0 |
| Goto | Flise før rampe if All line |
| Flise før rampe | |
|---|---|
| Initial | Reset encoders Set servo 0 to position -70 |
| Action | Do nothing |
| Goto | Op ad rampe if right encoder > 49.9 cm |
| Op ad rampe | |
|---|---|
| Initial | Set speed=0.50 m/s acc=5 dacc=1 Reset encoders Set linesensor threshold=140, background=127, line color=black |
| Action | Follow line at right edge, offset 0 |
| Goto | På rampe if left encoder > 599.9 cm |
| På rampe | |
|---|---|
| Initial | Set speed=0.12 m/s acc=1 dacc=1 Reset encoders |
| Action | Follow line at right edge, offset 0 |
| Goto | Hen mod hullet med bolden if left encoder > 40.0 cm |
| Hen mod hullet med bolden | |
|---|---|
| Bolden kommer i hul i denne eller den næste state | |
| Initial | Set speed=0.12 m/s acc=1 dacc=1 Set servo 0 to position 33 Reset encoders |
| Action | Do nothing |
| Goto | Bak tilbage mod steg if left encoder > 50.3 cm |
| Bak tilbage mod steg | |
|---|---|
| Initial | Set servo 0 to position 0 Set speed=-0.25 m/s acc=1 dacc=1 Reset encoders |
| Action | Do nothing |
| Goto | Ned af rampe if left encoder < -49.9 cm |
| Ned af rampe | |
|---|---|
| Golfarmen hæves igen | |
| Initial | Set speed=0.25 m/s acc=1 dacc=1 Set linesensor threshold=100, background=127, line color=black Reset encoders Set servo 1 to position -127 |
| Action | Follow line at center edge, offset 0 |
| Goto | Bakke op ad rampe if right encoder > 200.0 cm |
| Bakke op ad rampe | |
|---|---|
| Langsomt, da hjulene skrider på rampen. | |
| Initial | Set servo 0 to position 0 Set speed=-0.25 m/s acc=50 dacc=50 Reset encoders |
| Action | Do nothing |
| Goto | Bakke op ad rampe 2 if left encoder < -29.7 cm |
| Bakke op ad rampe 2 | |
|---|---|
| Det bakkes indtil motorregulerings I-værdi begynder at stige (fra meget negativ mod 0), hvilket er ensbetydende med, at robotten nu står på podiet. (forige state hvor der bakkes 30 cm tilbage er indsat, for at I-værdien kan nå at blive meget negativ) | |
| Initial | Reset encoders |
| Action | Do nothing |
| Goto | På podie 1 if I-value > -1700 |
| På podie 1 | |
|---|---|
| Bak tilbage | |
| Initial | Set servo 0 to position -90 Reset encoders |
| Action | Do nothing |
| Goto | På podie 2 if left encoder < -24.9 cm |
| På podie 2 | |
|---|---|
| Bak tilbage | |
| Initial | Set servo 0 to position 90 Reset encoders |
| Action | Do nothing |
| Goto | På podie 3 if right encoder < -27.7 cm |
| På podie 3 | |
|---|---|
| Frem mod trappe | |
| Initial | Set servo 0 to position -100 Set speed=0.25 m/s acc=10 dacc=10 Reset encoders |
| Action | Do nothing |
| Goto | På podie 4 if left encoder > 17.8 cm |
| På podie 4 | |
|---|---|
| Mod steg ved trappe | |
| Initial | Set servo 0 to position 80 Reset encoders |
| Action | Do nothing |
| Goto | Ned ad trappe if One line |
| Ned ad trappe | |
|---|---|
| Initial | Set speed=0.50 m/s acc=2 dacc=2 Set linesensor threshold=160, background=127, line color=black Reset encoders |
| Action | Follow line at center edge, offset 0 |
| Goto | Til flise efter væg if left encoder > 259.8 cm |
| Til flise efter væg | |
|---|---|
| Willy har ikke umiddelbart mulighed for at se den stump streg, der er ved vægen. Derfor køres hen til flisen efter vægen | |
| Initial | Set speed=0.50 m/s acc=1 dacc=1 Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at right edge, offset 0 |
| Goto | Tilbage til væg if All line |
| Tilbage til væg | |
|---|---|
| Og herfra bakkes der så tilbage til vægen | |
| Initial | Set servo 0 to position 0 Set speed=-0.25 m/s acc=5 dacc=5 Reset encoders |
| Action | Do nothing |
| Goto | Drej ind mod væg if right encoder < -94.6 cm |
| Drej ind mod væg | |
|---|---|
| Initial | Set servo 0 to position -127 Reset encoders Set speed=0.25 m/s acc=5 dacc=5 |
| Action | Do nothing |
| Goto | Følge væg 1 if right encoder > 45.5 cm |
| Følge væg 1 | |
|---|---|
| Initial | Set speed=0.38 m/s acc=1 dacc=1 |
| Action | Follow wall at distance 30.0 cm |
| Goto | Dreje rundt om væg if distance sensor 1 > 50.0 cm |
| Dreje rundt om væg | |
|---|---|
| Initial | Set servo 0 to position -120 Reset encoders Set speed=0.50 m/s acc=2 dacc=1 |
| Action | Do nothing |
| Goto | Følge væg 2 if right encoder > 120.0 cm |
| Følge væg 2 | |
|---|---|
| Initial | Set speed=0.38 m/s acc=1 dacc=1 |
| Action | Follow wall at distance 30.0 cm |
| Goto | Drej ind på streg if One line |
| Drej ind på streg | |
|---|---|
| Initial | Set servo 0 to position -127 Set speed=0.38 m/s acc=5 dacc=5 Reset encoders |
| Action | Do nothing |
| Goto | Tilbage for at undgå portben if right encoder > 21.8 cm |
| Tilbage for at undgå portben | |
|---|---|
| Initial | Set speed=-0.25 m/s acc=1 dacc=10 Reset encoders Set servo 0 to position 60 |
| Action | Do nothing |
| Goto | Efter væg if One line |
| Efter væg | |
|---|---|
| Initial | Set speed=0.50 m/s acc=2 dacc=1 Reset encoders Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at center edge, offset 0 |
| Goto | Til flise efter væg if left encoder > 19.8 cm |
| Til flise efter væg | |
|---|---|
| Initial | Set speed=0.88 m/s acc=1 dacc=1 Set linesensor threshold=160, background=127, line color=black |
| Action | Follow line at right edge, offset 0 |
| Goto | Flise efter væg if All line |
| Flise efter væg | |
|---|---|
| I blinde som sædvanligt | |
| Initial | Set servo 0 to position 0 Reset encoders |
| Action | Do nothing |
| Goto | Til mål flise if left encoder > 59.8 cm |
| Til mål flise | |
|---|---|
| Initial | Set speed=0.50 m/s acc=1 dacc=1 |
| Action | Follow line at center edge, offset 0 |
| Goto | Til mål if All line |
| Til mål | |
|---|---|
| De sidste 30 cm køres også i blinde | |
| Initial | Set servo 0 to position 0 |
| Action | Do nothing |
| Goto | Stop if button front left, or front right is on |
| Stop | |
|---|---|
| Juhuu.... så er vi i mål | |
| Initial | Set speed=0.00 m/s acc=10 dacc=10 |
| Action | Do nothing |
| Goto | Følge væg 1 if Never |