# HG changeset patch # User meillo@marmaro.de # Date 1219848457 -7200 # Node ID 0cb0ac135c7607f9fdd935b5717bd4782c9e6263 # Parent ecb4a59ef40faff466570d4d4e698dcb1514a8da new content for logics module diff -r ecb4a59ef40f -r 0cb0ac135c76 taetigkeit.tex --- a/taetigkeit.tex Tue Aug 26 15:20:48 2008 +0200 +++ b/taetigkeit.tex Wed Aug 27 16:47:37 2008 +0200 @@ -102,7 +102,7 @@ Es galt also diesen Unregelmäßigkeiten entsprechend zu begegnen. Sich ändernde Ballwege waren grundsätlich kein Problem, da sie schon von Beginn an bedacht waren. Liegen gebliebene Bälle mussten neu angestoßen werden --- auch dies war mit relativ wenig Aufwand machbar. Auf der Stelle wackelnde Bälle waren schon ein größeres Problem, denn einmal sieht es so aus, als ob der Ball nach rechts läuft, in nächsten Zyklus aber als wenn er nach links läuft, und so weiter. Die Roboter wissen also nicht wohin er sich denn nun bewegt. Ich habe dazu nur Ballbewegungen die zweimal in ungefähr die gleiche Richtung gehen, als tatsächliche Ballbewegung gewertet. Eine Bewegung in die entgegengesetzte Richtung im nächsten Zeitschritt, bedeutet Stillstand. So waren die auf der Stelle zitternden Bälle eliminiert. Alle tatsächlichen Ballbewegungen habe ich dann noch ausgeglichen um die Ballbahn gleichmäßiger zu machen. \paragraph{Zustandslosigkeit} -Das große Problem, das sich mit der Zeit herausstellte, war die Zustandslosigkeit des Intelligenz-Moduls. Ich hatte es so aufgebaut, dass jeweils nur anhand des letzten Zeitschrittes (wenn überhaupt) entschieden wird, wie als nächstes agiert werden soll. In der Realität stellte sich aber heraus, dass dies nicht genug war. Es war nötig, Roboter in Zustände zu versetzen und diese über mehrere Zyklen beibehalten zu können. So benötigt es mehrere Zyklen um einen Ball der hinter einem Roboterarm festgeklemmt ist, wieder in's Spiel zu bringen. Der Roboter muss dazu seinen Arm heben, über den Ball zurück fahren und ihn von hinten anstoßen. Während dieses Vorgangs sollte er nicht unterbrochen werden. Änderungen an der Grundstruktur der Intelligenz waren an diesem Punkt zeitlich nicht mehr möglich; so setzte ich auf \texttt{static}-Variablen, um Zustände speichern zu können. Die Lösung war nicht unbedingt schön, aber zweckmäßig. +Das große Problem, das sich mit der Zeit herausstellte, war die Zustandslosigkeit des Intelligenz-Moduls. Ich hatte es so aufgebaut, dass jeweils nur anhand des letzten Zeitschrittes (wenn überhaupt) entschieden wird, wie als nächstes agiert werden soll. In der Realität stellte sich aber heraus, dass dies nicht genug war. Es war nötig, Roboter in Zustände zu versetzen und diese über mehrere Zyklen beibehalten zu können. So benötigt es mehrere Zyklen um einen Ball, der hinter einem Roboterarm festgeklemmt ist, wieder in's Spiel zu bringen. Der Roboter muss dazu seinen Arm heben, über den Ball zurück fahren und ihn von hinten anstoßen. Während dieses Vorgangs sollte er nicht unterbrochen werden. Änderungen an der Grundstruktur der Intelligenz waren an diesem Punkt, vor der ersten Messe, zeitlich nicht mehr möglich; so setzte ich auf Variablen, um Zustände zu speichern. Die Lösung war nicht unbedingt schön, aber an diesem Zeitpunkt zweckmäßig. \paragraph{Wo ist der Ball?} Die punktuelle Sichtweise der Dinge machten uns auch im Bezug auf die Position des Balles zu schaffen. Das Problem war, dass wir, wenn kein Ball vom Vision-Modul gefunden wurde, nicht sagen konnten, ob der Ball einfach nicht erkannt wurde, er sich gar nicht mehr im Bild befand, oder er unter einem Roboterarm für die Kamera unsichtbar war. Ein Mensch nimmt dieses Problem zuerst gar nicht wahr. Für uns war es aber zentral, denn je nach tatsächlicher Position mussten verschiedene Aktionen ausgeführt werden: Wurde der Ball nur nicht erkannt, dann sollten die Arme abwarten, in der Hoffnung, dass der Ball im nächsten Zyklus wieder erkannt würde. War der Ball vom Tisch, dann sollten die Roboter in die Wartestellung fahren und so verweilen. War der Ball aber unter einem Arm eingeklemmt, dann sollte dieser eine ``Befreiungsbewegung'' ausführen um den Ball wieder in's Spiel zu bringen. Würde er, im letzten Fall, dies nicht tun, dann wäre das Spiel in einer Sackgasse angelangt, denn beim Abwarten, oder Bewegen in die Wartestellung würde der Ball weiterhin unter dem Arm bleiben --- unsichtbar. @@ -111,6 +111,14 @@ Dieses Problem löste sich ziemlich gut, indem wir deine wahrscheinliche Ballposition (ausgehend von der bisherigen Bewegung) annahmen, falls er nicht gefunden wurde. Wurde er jedoch über mehrere Zyklen nicht gefunden, sollte zuerst der Roboter der dem Ball wahrscheinlich am nächsten war, eine Befreiungsbewegung ausführen. War der Ball dann immer noch verschwunden, sollten alle Roboter die Bewegung ausführen. Brachte dies den Ball noch immer nicht zum Vorschein, dann war er vermutlich außerhalb des Spielfeldes und die Roboter sollten in ihre Ruhestellung fahren und warten \dots bis der Ball wieder auftauchen würde. +\paragraph{Eine neue Struktur} +Nach der ersten Messe machte ich mich daran, die Struktur des Intelligenz-Moduls im Bezug auf dessen Zustandslosigkeit zu ändern. Ich führte ein Task-Konzept ein, bei dem einem Roboter eine bestimmte Aufgabe zugewiesen werden kann. Diese erledigt er komplett, bevor er für weitere Aufgaben frei ist. Aufgaben höherer Priorität brechen allerdings jederzeit unwichtigere Jobs ab und treten an deren Stelle. + +Auf diese Weise hatte ich die vorher ``zusammengeschusterte'' Funktionialität mit einem soliden Konzept nachgebaut. Die Handhabung ist jetzt deutlich einfacher und das Programm ohne Probleme erweiterbar. Da der neue Code nur sinngemäß dem alten entspricht (und nicht dessen Unregelmäßigkeiten beinhaltet), muss er erst noch optimiert werden um ein gleich gutes oder besseres Verhalten beim Fußballspiel zu erzielen. Leider war dies bisher noch nicht möglich, es sollte aber kein Problem darstellen. + +\paragraph{Ergebnis} +Es existiert nun ein ordentliches Intelligenz-Modul, in etwa 500 Zeilen Quelltext, das vier Robotern zum Fußballspiel verhilft. Seine Struktur wurde mit Blick auf zukünftige Erweiterungen entworfen. Es bietet Ansatzpunkte für spieltaktische Raffinessen, auch wenn diese unsere (derzeitige) Hardware leider nicht ermöglicht. Das Modul ist in seinem jetzigen Umfang für seine Aufgabe gut geeignet. Es sollte allerdings noch Zeit in das Feintuning gesteckt werden. Bei Bedarf kann weitere Spiellogik sehr einfach auf die vorliegende Basis aufgesetzt werden. + \section{Die Vision} Für dieses Modul war zwar hauptsächlich meine Kollegin zuständig, jedoch möchte ich der Vollständigkeit halber ein paar Informationen dazu hier anführen.