Programmieren mit der BASIC Stamp 2 (7)


MIKROPROZESSOREN
Programmieren mit der
BASIC-Stamp 2
Teil 7: Subsumtive Programmierung
1
Flucht-
Stoßstangen-
Von Dennis Clark
verhalten
sensor
Bewegungs-
Motoren
verhalten
Von einer Subsumtion ist in diesem
Zusammenhang dann die Rede, wenn
ein Task durch einen anderen mit
990050 - 7 - 11
höherer Priorität ersetzt wird. In der
Roboterprogrammierung ist das der
Bild 1. Darstellung des Bewegungs- und
Fall, wenn ein Verhalten durch ein
Fluchtverhaltens in einem einfachen sub-
anderes aufgrund einer Priorität ver-
sumtiven Netzwerkdiagramm.
drängt wird, die wir zuvor definiert Fluchtverhalten eine
haben. Diese Verhaltensarchitektur höhere Priorität hat
wurde zuerst von Dr. Rodney Brooks in als das Bewegungsverhalten, können tensweisen können in einer Grafik dar-
seinem Artikel  A robust layered con- wir uns darauf verlassen, dass BoE-Bot gestellt werden, einem subsumtiven
trol system for a mobile robot beschrie- in der Lage ist, sich von Hindernissen Netzwerk-Diagramm. Ein Beispiel für
ben, erschienen im IEEE Journal of Robo- zu entfernen, die ihm im Weg stehen. unser einfaches Bewegungs- und
tics and Automation, RA-2, April, 14-23, Wenn das Bewegungsverhalten die Fluchtverhalten ist in Bild 1 zu sehen.
1986. Die ideale Brooks´sche subsumtive letzte Laufrichtung mit einer langen Ellipsen links sind die Eingänge, die
Architektur verlangt nicht, dass ein Ver- Laufzeit versehen hatte, wird das Rechtecke in der Mitte die Verhaltens-
halten irgendetwas über ein anderes Bewegungsverhalten nach dem Ende weisen und Ellipsen rechts die Aus-
Verhalten weiß. Ein derart program- des Fluchtverhaltens wieder die Kon- gänge. Wenn eine Linie von einem Ver-
mierter Roboter reagiert reflexartig mit trolle übernehmen und BoE-Bot unbe- halten mit höherer Priorität auf eine
einfachen Verhaltensweisen auf seine irrt in die alte Richtung weiterfahren Linie von einem Verhalten mit niedri-
Umgebung. Das bedeutet auch, dass lassen, als ob nichts geschehen wäre. gerer Priorität auf dem Weg zum Aus-
ein neues Verhalten hinzugefügt wer- Weil jedes Verhalten unabhängig von gangs-Aktuator (hier Motoren) trifft,
den kann, ohne irgendetwas an einem den anderen ist und viele einfach auf sagt man, dass das Verhalten höherer
anderen Verhalten zu ändern. Bei einer die Umgebung des Roboters reagieren, Priorität die Kontrolle vom Verhalten
subsumtiven Programmierung unseres können wir eine Reihe von Verhalten niedrigerer Priorität subsumiert (abzieht,
kleinen BoE-Bot haben wir zum Bei- installieren, deren Interaktionen nicht übernimmt). Das wird im Diagramm
spiel ein Verhalten, das einfach zufällig vorprogrammiert sind, so dass wir durch den Kreis rund um den Kreu-
eine Fahrtrichtung und eine bestimmte nicht vorhersehbare Verhaltenskombi- zungspunkt der Linien angedeutet. Es
Fahrtzeit in dieser Richtung auswählt. nationen feststellen werden. Das nennt gibt viele Möglichkeiten, ein solches
Nach Ablauf dieser Zeit legt diese Ver- man emergent behaviour, also  auftau- Netzwerkdiagramm zu konzipieren, es
haltensroutine wieder zufallsbestimmt chende Verhaltensweisen, die wir nicht kann viele Kreuzungspunkte an vielen
eine neue Richtung und Fahrtzeit fest. geplant haben und die sich aus der Stellen der Richtungslinien geben.
Wenn wir aber nicht wollen, dass BoE- Wechselwirkung zwischen dem Robo-
Bot sich an einer Wand oder einem ter und seiner Umwelt ergeben. Wenn N ÄCHSTE S CHRI TTE
Tischbein festfährt, fügen wir ein Ver- wir solches sich ergebendes Verhalten Die beschrieben Diagramme und
halten hinzu, das ein Anstoßen (z.B. mit zulassen, scheinen unsere Roboter ein Denkweisen werden in der Folge regel-
einem Stoßstangensensor) wahrnimmt Eigenleben zu entwickeln. Es sieht so mäßig und auch in erweiterten Netz-
und unseren Roboter zurückstoßen aus, als ob sie aufhören würden, werken verwendet. In jedem Abschnitt
und zur Seite drehen lässt. Wir geben immer auf die gleiche Weise zu reagie- werden die Aufgaben in kleine, über-
diesem  Fluchtverhalten natürlich Prio- ren. Wichtiger für die reale Welt ist, dass schaubare Teile zerlegt, wie benötigte
rität gegenüber dem eingangs beschrie- manches Verhalten programmiert wer- Variable, I/O-Ports und neue Befehle.
benen Bewegungsverhalten, so dass das den kann, um eine bestimmte Aufgabe Gezeigt wird auch der Prozess zur
Fluchtverhalten das Bewegungsverhal- zu erfüllen, ohne dass man sich um Definition von State Machines (SM). Das
ten subsumiert und die Kontrolle über ständige Aufgaben wie der Hindernis- Subsumtions-Netzwerkdiagramm trägt
die Radmotoren übernimmt, um den vermeidung kümmern muss. dann dazu bei, dass die Verhaltens-Pri-
BoE-Bot ausweichen zu lassen. Weil das Die beschriebenen einfachen Verhal- oritäten verständlich werden.
Elektor 3/2000
66
Listing 1.
 Servo-Routine Konstanten und Variablen act:  Servo Controller Subroutine
if aDur > 0 then aDec
LEFT con 15  Port 15,linker Motor
aDur = SACT  Status 1 ausführen
RIGHT con 3  Port 3,rechter Motor
pulsout LEFT,lmotor * 10
SACT con 5  Zahl der Schleifendurchläufe
pulsout RIGHT,rmotor * 10
drive var word  Beide Seite in Variable goto aDone  Status 1 ausgeführt
aDec:
ldrive var drive.byte1  Linke Seite ist hier
aDur = aDur - 1  Status 2 ausführen
rdrive var drive.byte0  Rechte Seite ist hier
aDone:
aDur var byte  Dauer Zähler return
P HASE 1: BO E- BOTS
Dauer von 20 ms brauchen. Wenn wir von state 1 (rechts) nach state 0 nur,
B EWEGUNGSVERHALTEN
andere Module schreiben, werden wir wenn wenn aDur = 0 ist. Zu beachten
UND F I NI TE S TATE diese Schätzung revidieren, aber für ist, daß state 1 eine Schleife aufweist,
M ACHI NE (FSM) den Moment ist es ein guter Aus- die austritt und wieder auf sich selbst
Ein untätiger Roboter ist nicht beson- gangspunkt. Wenn wir jetzt die state zurück gerichtet ist. Das zeigt an, daß
ders interessant. Es ist an der Zeit, dem machine grafisch darstellen, können wir dieser state auf sich selbst iteriert, was
BoE-Bot ein (zufallsgesteuertes) Bewe- verstehen, worum es geht und viel- bedeutet, daß dieser Teil des Moduls
gungsverhalten zu geben. leicht schon Fehler in unserer Logik mehrmals durchlaufen wird, bevor er
Dafür brauchen wir zwei Module: erkennen. abgeschlossen ist. Das Diagramm sollte
Eines, das die Richtung und die Dauer Bevor wir unsere state machines eingehend betrachtet werden. Es zeigt
der Fahrt bestimmt, und ein zweites, bauen können, ist es hilfreich, alle uns genau, was das act-Modul zu tun
das für die Steuerung der Räder sorgt. Aktionen zu definieren, die das Ver- hat, und in welcher Reihenfolge. Wie
Wir nennen diese Module wander bzw. halten oder die Ausgangsfunktion aus- würde es zum Beispiel aussehen,
act. Act steuert einfach die Motoren führen soll. Jede dieser Funktionen wenn der Ausgangspuls für den linken
und ist eigentlich kein Verhalten, son- kann nach den Aktivitäten einem Motor in einem anderen state als der
dern ein Ausgang (output), der im Dia- bestimmten state zugeordnet werden. für den rechten Motor erfolgen soll?
gramm mit motors bzw. Motoren Hier ein Beispiel für die Definition Für unsere Zwecke können wir sagen,
bezeichnet wird. Wander ist hingegen einer Motorsteuerfunktion, die ein- daß jeder Kreis (state) ein Ort ist, an
ein Verhalten und wird auch im Sub- gangs als Subroutine act erwähnt dem wir in unserem Programm in das
sumtions-Diagramm als solches darge- wurde: betreffende Modul eintreten und ent-
stellt. scheiden, was als nächstes zu tun ist.
State 0 Jetzt sollte man eigentlich bemerken,
Die State Machine und Stamp II-Pro- Output left servo pulse value wie brauchbar dieses Konzept für
gammkode für Act Output right servo pulse value unsere Zwecke ist!
Wie wir bereits wissen, benötigen die Set the number of iterations Der Programmkode, der unser act-
Rad-Servos einen Impuls mit einer (aDur) = 5 Modul implementiert, ist in Listing 1
Dauer zwischen etwa 1 und 2 ms, State 1 angegeben.
wobei die Stopp-Position (Stillstand) Decrement aDur Damit ein Programm leichter zu lesen
bei etwa 1,5 ms liegt. Dieser Impuls If aDur = 0 then go to state 0 und zu modifizieren ist, sollen die Kon-
muss alle 20 bis 30 ms wiederholt wer- stanten-Definitionen (con-statements)
den, damit sich die Räder weiter dre- Wir haben jetzt eine detaillierte Liste reichlich verwendet werden,  magi-
hen. Es sind also zwei Operationen zu der Aktionen, die in unserer state sche Zahlen sollten im Programm-
programmieren, eine für  output the machine für act zu passieren haben. Wir kode möglichst nicht auftauchen. Alles
pulse , die andere für  wait for 20 ms können jetzt ein ausreichend detail- rechts von einem ´ ist ein Kommentar
und gehe danach zurück zu state 1. Es liertes Zustandsdiagramm (state dia- und kein Befehl. Warum die lmotor-
sind zwei Servos, also haben wir drei gram) zeichnen (siehe Bild 2). und rmotor-Werte mit 10 multipliziert
Operationen: output pulse für linken Dieses Diagramm zeigt uns, wann eine werden, wird im nächsten Abschnitt
Servo, output pulse für rechten Servo Änderung (transition) stattfindet, wir erklärt.
und wait. Um das Modul einfach zu sehen genau, was in den einzelnen sta- Beim Schreiben größerer Programme
halten, beschränken wir es auf zwei tes passiert. Der Übergang von state 0 muß man auf Platz für Variable achten,
states, einen für die Ausgabe der (links) nach state 1 tritt immer auf, es was mit der Sprache PBASIC auf recht
Impulse und einen für das delay bis zur gibt dafür keine Bedingung. Hingegen intelligente Weise möglich ist. Der pul-
nächsten Impulszeit. Da wir wissen, passiert der Wechsel sout-Befehl gibt
dass der Impuls alle 20 bis 30 ms zu
Bild 2. Zustandsdiagramm für
wiederholen ist und wir nicht die
die  act -Prozedur.
ganze Zeit im act-Modul darauf warten
wollen, wissen wir auch, dass dieser
Programmkodeblock einige Male
aDur>0
2
durchlaufen wird, bevor der ganze
Satz von state transitions auftritt. Da
0 1
jeder Befehl der Stamp II zur Aus-
Impuls links
führung etwa 250 µs braucht, können
aDur verringern,
Impuls rechts
bis aDur = 0
wir abschätzen, wie lange jedes der
aDur auf 5
aufgerufenen Module läuft, indem wir
setzen
aDur=0
die Befehle zählen und die Anzahl mit
250 µs multiplizieren. Wir schätzen
990050 - 7 - 12
jetzt und nehmen an, dass wir 5
Durchläufe durch state 2 für eine
Elektor 3/2000
67
nächsten. Außerdem verwenden wir
noch eine Maske, um nur Werte in
3
0 1
einem bestimmten Bereich zu erhalten
- einem kleinen Bereich für die Rich-
Richtung Zeitdauer
willkürlich willkürlich tungsänderungen und einem wesent-
wählen wählen
lich größeren für die Fahrtdauer. Eben-
falls interessante Möglichkeiten bietet
wDur>0
der Befehl lookup, der ebenfalls eine
Variable von der Größe eines Worts ver-
2
wendet. Weil wir die drive-Variable in
wDur eine byte0- und eine byte1-Variable auf-
wDur=0
verringern bis
brechen, können wir die Werte für den
wDur = 0
rechten und den linken Motor mit
990050 - 7 - 13
einem einzigen lookup-Befehl erhalten.
Motorsteuerwerte sind in den Listings
Bild 3. Zustandsdia-
mit einem $-Zeichen vor dem Wert
gramm für die
State 0 aufgeführt, was bedeutet, daß es sich
 wander -Prozedur.
Wähle eine Fahrtrichtung mit Hilfe der um hexadezimale Werte handelt. Das
random-Funktion (wDir) macht es einfach, die linke und rechte
einen Impuls mit der richtigen Puls- Go to State 1 Hälfte (byte1 und byte0) zu erkennen,
breite für die gewünschte Geschwin- State 1 die wir dem linken bzw. dem rechten
digkeit und Richtung an die Servomo- Wähle eine Fahrtdauer mit Hilfe der ran- Motor zugeordnet haben. Das setzt
toren aus. Die drive-Variable ist ein dom-Funktion (wDur) natürlich voraus, daß man die hexade-
Wort mit zwei Bytes, einem Byte0 und Füge eine Mindestdauer hinzu, damit die zimale Schreibweise kennt. Jede Stelle
einem Byte1. Beim Schreiben des Fahrtdauer nicht zu kurz wird kann dabei mit den Ziffern 0 bis 9 und
Kodes für das wander-Modul im näch- Go to state 2 den Buchstaben von A bis F Dezimal-
sten Abschnitt werden wir sehen, daß State 2 zahlen von 0 bis 15 darstellen. Bei einer
diese Darstellung der Motor-Antriebs- Decrement wDur mehrstelligen hexadezimalen Zahl ist
Variablen recht nützlich ist. If wDur = 0 then go to state 0 die Stelle ganz rechts die Einer-Stelle,
mit der dann die Zahlen 0 bis 15 dar-
Das Diagramm der state machine für das gestellt werden können. Die zweite
P HASE 2: BO E- BOT Bewegungsverhalten (wander) ist in Bild Stelle von rechts ist die  Sechzehner-
AUF W ANDERSCHAFT 3 zu sehen. Nicht alle Pfeile sind dabei Stelle . Bei einer zweistelligen hexade-
Für das Modul wander, das das Bewe- mit der Übergangsfunktion bezeichnet. zimalen Zahl multipliziert man daher
gungsverhalten definiert, brauchen wir Der Grund: Wenn eine state machine die zweite Stelle mit 16 und addiert
nur zwei Aktionen: Zufallsauswahl der automatisch von einem state zum ande- den Wert der ersten Stelle hinzu. Die
Fahrtrichtung und der Fahrtdauer in ren wechselt und somit keine Entschei- Zahlen hinter dem $-Zeichen in den
dieser Richtung. Dieses Modul ist dung zu treffen braucht, erübrigt sich Listings haben vier Stellen, weil sie die
damit so einfach gestrickt wie das act- auch die Angabe einer Übergangsfunk- Werte für die beiden Motoren zusam-
Modul. Außerdem zeigt sich, wie leicht tion. Da beim wander-Modul Fahrtrich- menfassen. Die beiden Zahlen links
sich neue Verhaltensweisen hinzufü- tung und Fahrtzeit zufallsgesteuert stellen damit einen der beiden Werte
gen lassen und wie sich diese Verhalten sind, spielt der Befehl random() für die dar, z.B. hexadezimal $1C, was dezimal
 merken , was sie tun. Der erste Schritt Zufallsfunktion eine wichtige Rolle in 16 + 12 = 28 ergibt.
der Entwicklung unserer finite state der Logik des Bewegungsverhaltens. Jetzt ist es auch Zeit zu erklären,
machine besteht in der Niederschrift der Random verwendet eine Variable vom warum act die Werte von ldrive und
auszuführenden Schritte und der zu Wort-Typ und braucht einen Ausgangs- rdrive mit 10 multipliziert. Ein Byte
testenden Übergangsfunktionen. Nach wert als  Saat ( random seed ), um kann nur Werte von 0 bis 255 darstel-
Aufstellung dieser Liste kann die state einen return-Wert zu etablieren. Wir len, die Servos benötigen aber Zahlen
machine gezeichnet werden. Hier ist die nehmen dabei einfach den letzten von 500 bis 1000. Deshalb verwenden
Aktionsliste für wander: return-Wert als Ausgangswert für den wir für ldrive und rdrive nur Werte
if wDur > 0 then wDone1
Listing 2.
drive = wDir  Richtung ermitteln
 Servo drive commands wstate = 0  Status zurücksetzen
fd con $6432  vorwärts wDone1:  completed
rv con $3264  rückwärts
return
st con $4b4b  stopp
wcDir:  Richtung wählen
tr con $644b  nach rechts drehen
random seed  Zufallsrichtung
tl con $4b32  nach links drehen
i = seed & %111  Maskieren für 0-7
rr con $6464  rechts rotieren
lookup i,[tr,fd,fd,fd,rr,fd,fd,tl],wDir
rl con $3232  links rotieren
 Richtung wählen
 Bewegungswerte
wstate = 1  nächster Status
wstate var byt e  FSM Status
return
wDir var word  Bewegungswert
wcDur:  Wählen Dauer
wDur var byte  Bewegungsdauer
random seed  Zufallsgenerator
wDur = (seed & %111111) + 20
 Maske für 64 und
wander:
20 addieren für mehr Zeit
branch wstate,[wcDir,wcDur]
wstate = 2  nächster Status
 This is state 2
wDur = wDur  1 return
Elektor 3/2000
68
von 50 bis 100 (was kleiner als 255 ist) Funktionsmodule wander und act sind startet. Für den regelmäßigen Aufruf
und multiplizieren diese Werte mit 10, Subroutinen, das bedeutet, wir brau- von wander und act sorgt dann die
um in den Bereich von 500 bis 1000 zu chen noch etwas, um sie aufzurufen. Hauptschleife, die bei main startet.
kommen. Damit nutzen wir den mit Dieses etwas besteht aus einer durch Wenn wir das Listing mit dem Stamp-2-
einem Byte möglichen Zahlenbereich main und goto main definierten Schleife, Programmer programmieren, erhalten
zwar nur zum Teil, das macht aber die alle Verhaltensweisen aufruft. wir einen Roboter, der auf einem hin-
nichts, da wir für unseren Antrieb mit Listing 3 ist das vollständige Pro- dernisfreien Parcour herumwandert.
modifizierten Servomotoren keine gramm, das alle Variablen und Sub- Das Ausweichen, sprich Fluchtverhal-
höhere Auflösung brauchen. routinen ebenso enthält wie den Setup ten, soll er in der nächsten Folge noch
Wir haben jetzt schon fast alles, um und die Hauptschleife. Der Setup defi- erlernen. Dabei wird die Hauptschleife
unseren Roboter ziellos herumwan- niert den Status (state), mit dem das eine wichtige Rolle spielen.
dern zu lassen - aber eben nur fast. Die Bewegungsverhalten (wander-Routine) (990050-7e)
Listing 3.
 Allgemeine Werte
I var byte  Zähler für diverse Schleifen
Tmp var word  Temporärer Speicher
Seed var word  Zufallszahl gesetzt
 Dies gilt den Servo-Routinen
LEFT con 15  Port linkes Rad
RIGHT con 3  Port rechtes Rad
SACT con 5  Anzahl act-Durchlauf-Routine
Drive var word  Rad-Befehl combo
Ldrive var drive.byte1  Befehl linkes Rad
Rdrive var drive.byte0  Befehl rechtes Rad
ADur var byte  Dauer des Impulses
 Servo Fahrbefehle
fd con $6432  vorwärts
rv con $3264  rückwärts
st con $4b4b  stopp
tr con $644b  nach links drehen
tl con $4b32  nach rechts drehen
rr con $6464  rechts rotieren
rl con $3232  links rotieren
 Bewegungswerte
wstate var byte  geteiltes Byte
wDir var word  Bewegungswert
wDur var byte  Bewegungsdauer
 Einrichten für Bewegung
wstate =0  anfänglicher Bewegungs-Status
main:  dies ist die Haupt-Aktivitäts-Schleife
gosub wander
gosub act
goto main
 ========================================
 Verhalten folgen
 ========================================
wander:  Zufälliges Herumwandern
branch wstate,[wcDir,wcDur]  Status 2 folgt unmittelbar
wDur = wDur - 1
if wDur > 0 then wDone1
drive = wDir  Richtung erfassen
wstate = 0  Status zurücksetzen
wDone1:  vollständig
return
wcDir:  choose direction
random seed  Zufallsrichtung
i = seed & %111  Maske off nur für 0-7
lookup i,[tr,fd,fd,fd,rr,fd,fd,tl],wDir  Richtung wählen
wstate = 1  nächster Status
return
wcDur:  choose duration
random seed  Zufallsrichtung und -dauer
wDur = (seed & %111111) + 20  Maske für 64 Möglichkeiten
wstate = 2  nächster Status
return
act:  Bewegt Servo-Motoren
if aDur > 0 then aDec  wenn schon erledigt, zur aDec-Routine
aDur = SACT  Durchlaufzahl durch diese Routine
pulsout LEFT,ldrive * 10
pulsout RIGHT,rdrive * 10
aDec:  Abziehen
aDur = aDur - 1
aDone:
return
Elektor 3/2000
69


Wyszukiwarka

Podobne podstrony:
Programmieren mit der BASIC Stamp 2 (8)
Programowanie Obiektowe W Visual Basic Net Dla Ka dego
Visual Basic 2005 Zapiski programisty
Visual Basic w programie Excel funkcje definiowane, składnia języka
Methoden der Arbeit mit Bildern
Visual Basic 2005 Programowanie
Basic Microcontroller in C Programming
Mastering Visual Basic NET Database Programming
VB NET Programming with Microsoft Visual Basic NET?livery Guide
Makra programowanie w Visual Basic
Hauff Der junge Englaender
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6
Międzynarodowy Program Badań nad Zachowaniami Samobójczymi
Schalter ICs mit einstellbarer Strombegrenzung

więcej podobnych podstron