|
EINDZOLANG
Het nadeel van dit programma is dat de robot alleen obstakels voelt wanneer hij vooruit gaat. Wanneer de rechterbumper contact maakt met een obstakel en programmatak B wordt uitgevoerd, dan wordt gedurende 600 ms geen enkele sensor afgelezen en is de robot totaal blind voor alle sensoren. Wat nu als de linkerbumper contact met een obstakel maakt
wanneer het programma zijn afwerking voor de rechterbumper uitvoert? Het programma houdt geen enkele rekening met die mogelijkheid. Wat we zouden willen, is dat tijdens elk punt van het programma alle sensors afgelezen worden, en het programma daarop blijft reageren. Dit is nu mogelijk door de doorloop van de hoofdlus zo kort mogelijk te houden, en te voorkomen dat het programma voor een ontoelaatbaar lange tijd verzandt in een zijtak. Dit nu is mogelijk met behulp van een FSM.
Door het programma verloop voor te stellen in een toestanddiagram wordt duidelijk hoe de zaken ervoor staan. De ballonnen stellen een bepaalde toestand voor, waarin de FSM verkeert. Alleen op een voorwaarde gaat de FSM naar een andere toestand. Deze toestand
overgangen worden voorgesteld als een pijl. De voorwaarde voor een toestandovergang staat naast de pijl. Een voorwaarde kan een sluitende schakelaar of een andere sensor of een verstreken tijdsduur zijn.
We nemen aan dat de robot altijd vooruit blijft gaan, maar als er iets gebeurt op de bumper, dan wordt er aktie ondernomen. Deze aktie wordt uitgevoerd door de FSM, het programma dat we BUMPER noemen.
BUMPER staat altijd in toestand 0 en leest continu de bumperschakelaars af. Zodra één van de bumpers contact maakt, dan gaat de BUMPER naar toestand 1 wanneer de rechterbumper contact maakt, en naar toestand 3 wanneer de linkerbumper contact maakt, en het command achteruit wordt gegeven. Na 200 milliseconden het command achteruit te hebben gegeven, geeft BUMPER het commando om weg te draaien naar de andere richting, gedurende 400 milliseconden. Nadat 400 milliseconden verstreken zijn komt BUMPER weer in toestand 0 waarin BUMPER geen command meer geeft.
Een voorbeeld maakt dit duidelijk. Het volgende sourcecodefragment is een routine in Forth uit mijn vorige robot Mobo die reageert op een bumperschakelaar en de robot achteruit en daarna links of rechts stuurt.
|