NIKI-Beispiele

Mit Hilfe einer kleinen Einführungssequenz lernen Sie die Möglichkeiten der NIKI-Programmierumgebung kennen. Im folgenden werden bei allen Beispielen die englischen Schlüsselwörter verwendet.

NIKI befindet sich auf einem Arbeitsfeld mit einer Treppe und einem Podest. NIKI soll den Gegenstand von der obersten Stufe der Treppe auflesen und zum Podest transportieren und anschließend vor dem Podest stehenbleiben.

Nikis Möglichkeiten sind sehr eingeschränkt. Der Roboter kann Gegenstände aufnehmen und abgeben, er kann sich in Pfeilrichtung nach vorne bewegen und er hat die Möglichkeit, sich nach links zu drehen.

Handsteuerung

Zunächst soll NIKI mit der Hand gesteuert werden. Hierzu bietet sich die Eingabe der Befehle über Tastatur an:

v gehe einen Schritt nach vorne
d Drehung um 90° nach links
n nimm einen Gegenstand auf
g gib einen Gegenstand ab

Eine entsprechende Eingabesequenz könnte dann folgendermaßen aussehen:

vvvvdvdddvdvdddv...

Aufgabe: Führen Sie jetzt die oben gestellte Aufgabe mit Hilfe der Handsteuerung durch.

Die Handsteuerung benötigt immer noch einen Menschen, der den Roboter steuert. Sinnvoller wäre es, NIKI könnte einen einmal durchgeführten Arbeitsauftrag erlernen und selbständig wiederholen. Dies ist mit Hilfe des Teach-in-Modus möglich.

Wenn man im Menü Teach-inid_teachin den Eintrag Sequenz aufzeichnen anwählt, werden alle nachfolgenden Arbeitsanweisungen aufgezeichnet. Die Aufzeichnung wird durch Anwahl des gleichen Menüeintrags beendet. Mit Sequenz starten kann NIKI jeweils den gleichen Arbeitsauftrag beliebig oft wiederholen.

Mit Speichern sichert man Sequenzen auf Festplatte.

Aufgabe: Erstellen Sie eine Teachin-Sequenz für die Anfangsaufgabe und speichern Sie diese unter dem Namen Treppe0.tip.

Das Aufzeichnen von Arbeitssequenzen ist schon ein bedeutender Schritt zur Automatisierung. Allerdings kann NIKI hierbei noch nicht auf Veränderungen seiner Umgebung reagieren. Ein verändertes Arbeitsfeld, z.B. ein fehlender Gegenstand wird einen Fehler auslösen.

Erst mit Hilfe der Programmsteuerung kann NIKI flexibel reagieren.

NIKI-Programme werden mit Hilfe eines Texteditors geschrieben, von einem speziellen Programm, dem Compiler, in NIKI-Anweisungen übersetzt.

Die Programmentwicklung findet im Programm-Menüid_programm statt. Mit Editor wird der Programmeditor geöffnet, mit Starten wird das Übersetzungsprogramm gestartet und, falls kein Syntax-Fehler aufgetreten ist, das NIKI-Programm gestartet. Beide Aktionen lassen sich mit Alt+E und Alt+S auch über die Tastatur auslösen.

NIKI-Programme haben eine festgelegten Aufbauid_aufbau. So muß jedes Programm mit dem Schlüsselwort Program und dem Namen des Programms beginnen. Danach folgt ein Semikolon. Die Niki-Anweisungenid_prozedur werden mit Begin und End geklammert, einzelne Anweisungen durch ein Semikolon getrennt. Das Programmende markiert ein Punkt.

Ein entsprechendes Programm könnte dann folgendermaßen aussehen:

Program Treppe0;
Begin
  vor;
  vor;
  vor;
  drehe_links;
  vor;
  drehe_links;
  drehe_links;
  drehe_links;
  vor;
  ....
End.

Aufgabe: Vervollständigen Sie das Programm mit den fehlenden Anweisungen.

Wenn man die Aufgabeid_ein als Programmsequenz eingibt, hat man relativ viel Schreibarbeit. Beim Programmtext fällt auf, daß häufig gleiche Programmsequenzen auftauchen. So muß sich NIKI, um sich einmal nach rechts zu drehen, dreimal nach links drehen.

Man kann solche wiederkehrenden Befehlssequenzen zu neuen NIKI-Befehlen zusammenfassen - NIKI kann also neue Befehle erlernen.

Das Formulieren neuer Befehle geschieht mit Hilfe von Prozeduren. In einer Prozedur werden NIKI-Befehle zu einer neuen Anweisung zusammengefaßt.

Beispiel für eine Prozedur:

Procedure drehe_rechts;
Begin
  drehe_links;
  drehe_links;
  drehe_links
End;

Beliebig viele Prozeduren können direkt hinter dem Programmkopf eingefügt werden:

Beispiel Treppe1.pas

Ändern Sie das Programm aus der letzten Aufgabe entsprechend.

Program Treppe1;
Procedure drehe_rechts;
Begin
  drehe_links;
  drehe_links;
  drehe_links
End;
 
Begin
  vor;vor;vor;
  drehe_links;
  vor;
  drehe_rechts;
  ....
End.

NIKI bekommt eine neue Aufgabe. Er soll von der Treppe einen Gegenstand auflesen. Es ist aber nicht bekannt, an welcher Stelle auf der Treppe dieser Gegenstand liegt. Ein Arbeitsfeld könnte folgendermaßen aussehen:

Um entscheiden zu können, wo sich ein Gegenstand befindet, benötigt NIKI Sensoren, mit denen er seine Umgebung abtasten kann. NIKI verfügt über mehrere Sensorenid_sensoren. Der Sensor für Gegenstände heißt Platz_belegt. Niki kann diesen Sensor abfragen und dann entscheiden, ob er einen Gegenstand aufnehmen muß. Dies geschieht mit der Anweisung

If Platz_belegt then nimm_auf;

Eine solche Anweisung wird Entscheidungsanweisung genannt.

Aufgabe: Verändern Sie das Programm für die oben gestellte Grundufgabe so, daß sich der Gegenstand an einer beliebigen Stelle auf der Treppe befinden kann.

Das Arbeitsfeld wird jetzt so verändert, daß NIKI die Lage der Treppe und des Podestes nicht kennt. Treppe und Podest stehen hintereinander, aber weder der Abstand zur Treppe noch der Abstand zwischen Treppe und Podest sind bekannt.

NIKI verfügt allerdings über einen Sensorid_Sensoren, mit dem er Hindernisse wahrnehmen kann. Dieser Sensor heißt vorne_frei.

Mit der folgenden Anweisung kann NIKI bis zu einem Hindernis laufen;

While vorne_frei do vor;

Eine solche Anweisung heißt Wiederholungsanweisung oder Schleife.

Aufgabe: Veränderen Sie das Programm für die oben gestellte Aufgabe so, daß sich Treppe und Podest an einer beliebigen Stelle befinden können.

Da NIKI keine Variablen kennt, läßt sich die folgende Aufgabe nur schwer realisieren:

NIKI soll bis zum Hindernis gehen, sich umdrehen und dann exakt die gleiche Anzahl von Schritten wieder zurückgehen.

Da in der NIKI-Programmiersprache die Möglichkeit besteht, daß sich Prozeduren selbst aufrufen, ist eine Lösung mit Hilfe der Rekursion möglich.

Eine Prozedur heißt rekursiv, wenn sie sich innerhalb eines Anweisungsblockes selbst aufruft. Der Aufruf muß ein bedingter sein und folgende Form haben:

Procedure rekursiv_arbeiten;
Begin
  If <Bedingung> Then
    <Anweisung1>
  Else
    Begin
      <Anweisung2>;
      rekursiv_arbeiten;
      <Anweisung3>
    End;
End;

Hier folgt die Umsetzung in Niki-Pascal:

Program Gehe_zum_Hindernis_und_zurueck;
 
Procedure drehe_um;
Begin
  drehe_links;
  drehe_links
End;
 
Procedure Zum_Hindernis_und_zurueck;
Begin
  IF not vorne_frei then
    drehe_um
  Else
    Begin
      vor;
      Zum_Hindernis_und_zurueck; 
      {Prozedur ruft sich selbst auf}
      vor;
    End;
End;
 
Begin
  Zum_Hindernis_und_zurueck
End.

Aufgabe: Die Grundaufgabe wird nun dahingehend erweitern, daß NIKI über eine beliebig hohe Treppe geht. Man kann den Lösungsweg für eine rekursive Prozedur gehe_über_die_Treppe so beschreiben:

Falls noch eine Stufe kommt, dann

gehe eine Stufe hoch
gehe über die Treppe
gehe eine Stufe runter

Aufgabe: Erweitern Sie die Grundaufgabe entsprechend, so daß NIKI über eine beliebig hohe Treppe gehen kann.