Um überhaupt mit dem Cozmo über unsere Handys im SDK-Modus zu kommunizieren, müssen wir ein paar Formen einhalten. Es gibt eine grundlegende Struktur, wie Cozmo-Programe aufgebaut sein müssen, welche wie folgt aussieht:
import cozmo
def my_program(r: cozmo.robot.Robot):
<programm>
cozmo.run_program(my_program)
Die erste Zeile braucht man, um die Befehle verwenden zu können, mit welchen man mit Cozmo interagiert. So gesehen um dem Programm zu erklären, wer der Roboter überhaupt ist und was er kann. Dann schreibt man ein Programm, in dem der Roboter zum Beispiel eine Bewegung ausführt oder etwas sagt. In diesem Programm, welches hier beispielhaft my_program heißt kann man den Roboter dann alle möglichen Sachen ausführen lassen. Auch die Befehlsblöcke, welche im letzten Blog erläutert wurden, können hier Anwendung finden. Eine Übersicht von allen Befehlen findet man auf der Anki-Homepage unter cozmosdk.anki.com/docs/api.html, die Dokumentation der Methoden und Attribute von Cozmo. Dieses Programm wird dann mithilfe der letzten Zeile von Cozmo ausgeführt.
Die Anzahl der Befehle für Cozmo ist enorm, weshalb wir die nächsten Stunden damit verbracht haben, einfache und grundlegende Befehle auszuprobieren. Zum Beispiel haben wir den Befehl zum Bewegen des Hebearms auf eine spezifische Höhe, oder den Befehl zum Fahren kennengelernt. Wir haben aber auch ein Programm geschrieben, um den Akkuladestand von Cozmo abzufragen. Dazu haben wir einen Befehl verwendet, welcher die Spannung des Akkus ausgibt. Diese Information scheint auf den ersten Blick zwar nutzlos, aber wenn man den Cozmo einmal komplett auflädt und dann den Ladestand beim Entladen in Regelmäßigen abständen Ausgeben lässt, bis er leer ist, kann man entdecken, dass die Spannung beim Entladen von einem Maximalwert bis zu einem Minimalwert sinkt, und zwar nicht konstant, sondern kurvenförmig. Zu Beginn fällt die Spannung etwas schneller, bevor sie sich an einen Konstanten Fallwert annähert und sie zum Schluss erneut schneller fällt, also ungefähr so:
Aus den Werten kann man dann eine Funktion bestimmen, welche ungefähr beschreibt, zu wie viel Prozent der Akku geladen ist bei einem gegebenen Spannungswert. Diese Funktion benutzt man dann, um das Programm für die Akkuanzeige zu programmieren.
Als wir dann die ersten komplexeren Programme schreiben wollten, in denen Cozmo mehrere Aktionen hintereinander ausführen sollte, stießen wir auf ein Problem: Cozmo wollte das Programm nicht mehr ausführen. Der Fehler wurde durch eine Eigenheit des Programms verursacht: wenn man will, dass Cozmo zwei Aktionen nacheinander ausführt, muss man hinter jeden Befehl .wait_for_completed() schreiben. Das Problem ist jedoch eigentlich nur durch eine andere nützliche Funktion entstanden: man kann Cozmo mehrere Dinge gleichzeitig machen lassen, wenn man die nötige Variable verändert, welche es vorher verboten hat, dass zwei Aktionen gleichzeitig ausgeführt werden, weshalb das Programm nicht funktionierte. Diese heißt in_parallel und ist, wenn man es nicht explizit ändert, standardmäßig auf False gesetzt. Hat man diese aber auf True gesetzt, kann Cozmo beispielsweise gleichzeitig fahren und den Kopf heben.
So könnte ein solches Programm aussehen:
Bei der Methode r.drive_straight, welche Cozmo geradeaus fahren lässt, muss zuerst die Distanz angegeben werden, die Cozmo fahren soll. Dann, durch ein Komma getrennt, die Geschwindigkeit, die er fahren soll und nach einem weiteren Komma, ob Cozmo während des Fahrens eine Animation der Augen auf dem Bildschirm zeigen soll. Zum Schluss muss dann die Variable in_parallel mit True gleichgesetzt werden.
Bei der Methode set_head_angle, welche Cozmos Kopf auf eine bestimmte Höhe stellt, muss zuerst die Höhe in Grad, oder einer anderen Kreiseinheit, angegeben werden. Dann folgt die Beschleunigung in Radiant pro Quadratsekunde (so eine komische Einheit, die nur noch von den Amerikanern benutzt wird), wofür ein Wert von 0 bis 10 eingesetzt werden kann, daraufhin die maximale Drehgeschwindigkeit in Radiant pro Sekunde (noch so eine komische Einheit…), wo wieder ein Wert von 0 bis 10 eingesetzt werde kann und dann die Zeit, in der der Kopf auf die Position gebracht werden soll – wie ihr sicher schon gesehen habt steht bei dem Beispiel für die Zeit 0, was daran liegt, dass bei einem Wert von 0 Cozmo den Kopf einfach so schnell wie möglich bewegt. Der vorletzte Wert fragt ab, ob eine Warnung angezeigt werden soll, wenn die angegebene Position, die als erstes abgefragt wurde, nicht in dem Möglichen Winkelbereich liegt, in dem Cozmo seinen Kopf bewegen kann (dieser geht von -25° bis 44,5°) und der letzte Wert legt wieder fest, ob andere Bewegungen gleichzeitig ausgeführt werden dürfen.
Normalerweise müsste man die meisten dieser Parameter gar nicht angeben, da für die Variablen bereits Standardwerte vorgegeben sind, die einfach übernommen werden, wenn man sie selber nicht angibt. Jedoch ist die Variable in_parallel nach all diesen anderen Variablen anzugeben, weshalb man alle Variablen, die davor anzugeben sind, mit dazu schreiben muss. Welche Variablen angegeben werden müssen und welche nicht, kann man übrigens auf der Cozmo-Website nachlesen, die ich oben verlinkt habe. Ein Tipp: Jede variable, hinter der ein ‚=‘ steht, muss nicht zwingend angegeben werden, da bereits ein Standardwert existiert.