Universität Bremen  
  FB3 DFKI Kontakt  
  AG BKB > Thomas Röfer > Kognitive Robotik II > Übungszettel > Deutsch
English
 

1. Übungszettel: Kognitive Architekturen

 

Ausgabe: 12. Mai 2003
Abgabe: 26. Mai 2003

1. Begriffe (30%)

Erläutert die Grundideen hinter folgenden Begriffen:

  • Sense-Think-Act-Zyklus
  • Subsumption Architecture
  • Drei-Schichten-Architektur
  • Blackboard-System

Nutzt hierfür auch die Website http://ai.eecs.umich.edu/cogarch0/.

2. Blackboard-Architektur (30%)

Teilaufgabe 1. Es soll ein Blackboard-System erstellt werden, das aus folgenden Komponenten besteht:

  • Einem Aufzählungstyp BlackboardID, der Konstanten für die IDs der Einträge im Blackboard definiert. Der letzte Eintrag soll ID_MAX heißen und die Anzahl der IDs wiedergeben.
  • Einer Klasse, die das Blackboard implementiert. Sie soll dafür Sorge tragen, dass die gelieferten Daten stets konsistent sind. Abweichend von der Vorlesung soll dies durch die Verwendung des Paares DECLARE_SYNC/SYNC geschehen (s.u.).
  • Einer Vorlagenklasse template<BlackboardID ID, class T> class Writer, deren Instanzen Daten eines bestimmten Typs unter einer festen ID im Blackboard ablegen. Das eigentliche Speichern soll eine Member-Funktion void write(const T&) erledigen.
  • Einer Vorlagenklasse template<BlackboardID ID, class T> class Reader, deren Instanzen ebenfalls mit einer ID aus BlackboardID initialisiert werden und die mit einer Funktion bool read(T&) das jeweils aktuellste Datum mit dieser ID aus dem Blackboard auslesen. Jede Instanz von Reader soll ein bestimmtes Datum nur einmal ausliefern (Ergebnis: true). Steht im Blackboard bei einem weiteren Aufruf von read() immer noch dasselbe Datum, soll false zurückgeliefert werden. Dies gilt auch für den Fall, dass im Blackboard noch kein Datum unter der jeweiligen ID abgelegt wurde.

Teilaufgabe 2. Beschreibt die Anforderungen, die eure Implementierung an die im Blackboard zu speichernden Daten stellt.

Teilaufgabe 3. Schreibt ein einfaches Programm, um euer Blackboard-System zu testen. Dazu braucht ihr einen zweiten Thread. Leitet dazu die Klasse MyController zusätzlich von Thread<MyController> ab und startet eine parameterlose Memberfunktion als separaten Thread, der parallel zu execute() läuft (s.u.).

Tipps. Um einen zweiten Thread starten und Datenzugriffe synchronisieren zu können, müsst ihr Platform/Win32/Thread.h einbinden. Für die Synchronisation beim Zugriff auf Membervariablen einer Klasse fügt ihr in die Deklaration der Klasse das Makro DECLARE_SYNC ein. An allen Stellen, an denen der Zugriff auf die Membervariablen der Klasse synchronisiert geschehen sollen, fügt ihr das Makro SYNC ein. SYNC gilt immer bis zum Ende des aktuellen Programmblocks.

Beispiel:

#include "Platform/Win32/Thread.h"


class A : public Thread<A> 
{
  DECLARE_SYNC;

  void main()
  {
    while(isRunning())
	 {
      Sleep(1); // wichtig, da AiboControl sonst sehr träge reagiert
	   SYNC;
	   // auf Member synchronisiert zugreifen
	 }
  }
  
public: 
  A()
  {
    start(this,main);
  }
  
  void fn()
  {
    SYNC;
    // auf Member synchronisiert zugreifen
  }
};

3. Pufferung (20%)

Die Klassen Writer und Reader puffern die Daten nicht, d.h. im Blackboard steht immer nur die aktuellste Version eines Datenpakets. Dies ist für manche Informationen unzureichend, z.B. für Tastenanschläge.

Teilaufgabe 1. Erstellt daher zwei weitere Klassen:

  • Die Klasse BufferedWriter hatte dieselbe Signatur wie Writer (bis auf die Vorlagenparameter) und verwaltet einen Puffer fester Länge (analog zur Vorlesung). Die Größe des Puffers wird während der Konstruktion (also z.B. als template-Parameter) festgelegt. BufferedWriter soll Writer verwenden, um den Puffer im Blackboard abzulegen.
  • Die Klasse BufferedReader hatte dieselbe Signatur wie Reader (bis auf die Vorlagenparameter) und entnimmt die Daten einem Puffer fester Länge (analog zur Vorlesung). BufferedReader soll Reader verwenden, um den Puffer aus dem Blackboard auszulesen. BufferedReader.read() soll false zurückliefern, wenn bereits alle Pakete des Puffers ausgelesen wurden.

Teilaufgabe 2. Erstellt ein einfaches Testprogramm.

4. Selbstlokalisation mit dem Blackboard (20%)

Stellt euch folgendes Blackboard-System vor: Im Steuerungsprogramm eines mobilen Roboters gibt es zwei parallel laufende Module für die Selbstlokalisation. Das eine führt eine Odometrie-Rechnung mit hoher Geschwindigkeit durch und legt das jeweilige Ergebnis im Blackboard ab. Das andere bestimmt, z.B. mit Methoden der Bildverarbeitung, die globale Position des Roboters, ist aber viel langsamer als das Odometriemodul und kann daher viel seltener eine aktuelle Position liefern. Diese ist beim Beenden der Berechnung bereits veraltet.

Welche Informationen muss das langsame Selbstlokalisationsmodul im Blackboard ablegen, damit weitere Module jederzeit (d.h. maximal mit dem Takt des Odometriemoduls) eine gute Schätzung der aktuellen Position in x, y und Rotation berechnen können? Wie sieht die Berechnung aus?

 
   
Autor: Dr. Thomas Röfer
 
  Kognitive Robotik II 
Zuletzt geändert am: 19. Mai 2003   impressum