Nach all den Übungsaufgaben und Vorbereitungen durften wir endlich anfangen eigene individuelle Projekte zu erstellen. Bevor ich aber anfange über mein Projekt zu sprechen, möchte ich erstmal die interne Landkarte von Cozmo detaillierter beschreiben.
Die interne Landkarte 2
Wie schon vorher erwähnt, hat Cozmo eine interne Landkarte mit welcher er sich orientiert. Objekte, die Cozmo erkannt hat, merkt er sich mithilfe der Karte und schätzt die Koordinaten des gesehenen Objektes ein. Die Klasse cozmo.util.Pose benutzt die interne Landkarte um die Postion eines Objektes anzugeben. In cozmo.util.Pose muss man die x-, y-, und z- Koordinaten angeben. Diese Klasse beschreibt die Postion von jedem Objekt, die auf der internen Landkarte gespeichert werden. Dazu gehört auch Cozmo selber.
Der Befehl create_custom_fixed_object aus der Klasse cozmo.world.World erstellt Objekte in der internen Landkarte von Cozmo. Die Parameter, die man für den Befehl eingeben muss, sind: Pose(die Koordinaten eines Objektes) und die Länge des Objektes auf den drei Achsen(x, y, z). Die Position des Objektes wird dabei als Mitte des Objektes gezählt. Die Objekte, die erstellt werden können, sind nur Vierecke.
Ein weiterer Befehl, der die interne Landkarte von Cozmo ausnutzt und in meinem Projekt hilfreich sein wird, ist der Befehl go_to_pose in der Klasse cozmo.robot.Robot. Mit diesem Befehl kann Cozmo befohlen werden, zu einer bestimmten Koordinate zu fahren. Die Parameter des Befehls sind:Pose, relative_to_robot (ob die Position des Objektes relativ ist zum Roboter), in_parallel(ob die Aktion parallel mit einem anderen Befehl laufen kann), num_retries (die Anzahl der Wiederholungen bei einer Fehleranzeige).
Die Kamera
Eine Funktion, die zu meinem Projekt gehört, ist die Kamera und die eingebaute Erkennungsfunktion. Die Kamera kann bestimmte Sticker erkennen, die für eine Aktion oder ein Objekt stehen können (s.Bild oben). Cozmo kann aber auch Gesichter erkennen und diese auch speichern (leider habe ich kein Foto aus dem Kameraviewer davon gemacht). Um die Kamera zu aktivieren, muss man im Quelltext cozmo.robot.Robot.image_stream_enabled= True schreiben. Damit bei der Ausführung eines Programmes die Kamerasicht gezeigt wird, muss man bei cozmo.run_program nach der Angabe des Methodennamen use_viewer=True und force_viewer_on_top=True (s.Bild unten) schreiben. Der erste Parameter sagt, dass der Kameraviewer (s. Bild oben) angezeigt wird und beim zweiten Parameter wird der Kamerviewer von Cozmo als Programm auf dem PC gezeigt, welches im Fokus ist (der Viewer wird einfach als oberstes Fenster angezeigt).
Meine erste Projektidee
Der erste Gedanke, der mir einfiel bei der Planung für mein Projekt, war, dass ich etwas mit der Gesichtsfunktion von Cozmo machen will. Deswegen fing ich an auf der Cozmo API Internetseite die Beschreibungen der verschiedenen Befehle, die zur Gesichtserkennung von Cozmo beitragen, durchzulesen.
Mein Programm sollte für jede Person aus dem Kurs eine Nachricht mitteilen, die durch die Erkennung des Gesichts erfolgt. Dazu müsste ich die Gesichter von allen Personen aus meinem Kurs in meinem Cozmo speichern. Dann würde ich für jede einzelne Person eine Nachricht schreiben und wenn Cozmo beim Vorbeifahren eine Person am Gesicht erkennt, wird er dann die Nachricht, die zur erkannten Person gesagt werden muss, durch seine Lautsprecher mitteilen.
Leider gab es Komplikationen.
Auf dem oberen Bild ist mein Programm abgebildet. Natürlich ist es nur ein Teil davon und nicht zu Ende geschrieben wegen eines Fehlers. Eigentlich habe ich gedacht, dass man die Attribute face_id (cozmo.faces.Face) oder name (cozmo.faces.EvtFaceObserved) einfach ohne Probleme abrufen kann. Dabei sollte face_id eine Zahl, die zum gespeicherten Gesicht erteilt wurde, anzeigen und name einen Namen anzeigen, die zum erkannten Gesicht gehört. In beiden Fällen sollte nach der Erkennung eines Gesichts ein Wert angezeigt werden, was aber nicht der Fall war (cozmo.faces.EvtFaceObserved.name habe ich dabei als erstes Attribut benutzt und nach einer Fehleranzeige zum zweiten Attribut cozmo.faces.Faceface_id gewechselt). In beiden Fällen wurde mir nach der Erkennung eines Gesichts mit print((Attributname)) eine Hexadezimalzahl angezeigt, die keinen Wert für mich hat, weil es den Platz im Speicher zeigt, wo der Wert gespeichert ist und nicht den Wert selber. Danach habe ich versucht Gesichter zu vergleichen und zu gucken, ob es doch klappt. Leider ist das Programm nach der Erkennung eines Gesichts steckengeblieben (dabei hat Cozmo ununterbrochen „Hey“ gesagt). In den nächsten Doppelstunden habe ich damit verbracht Seiten von Quelltexten zu lesen und im Internet nach einer Lösung für mein Problem zu suchen. Die Firma Anki hat auch ein Forum, wo ich Beiträge gesucht habe, die mit den zwei Attributen zu tun haben. Leider war ich erfolglos. Nach solchen Ergebnissen habe ich mein erstes Projekt abgebrochen und ein zweites Projekt geplant, wo ich Cozmos interne Landkarte ausnutzen kann.
Das zweite Projekt
Bei meinem zweiten Projekt wollte ich die Sitzpositionen aller Kursteilnehmer im Informatikraum als go_to_pose Koordinaten speichern und alle Hindernisse im Raum als create_custom_fixed_object Objekte in Cozmo erstellen. Cozmo sollte dann bei Angabe eines Namens von einem Kursteilnehmer zur festgelegten Sitzpositionskoordinate fahren und eine Nachricht durch die Lautsprecher von Cozmo mitteilen. Dazu habe ich den ganzen Informatikraum abgemessen (s. Bild oben), damit ich die Positionen der erstellten Objekte bestimmen kann.
Die Kombination
Im Forum von Anki habe ich einen Beitrag gefunden, der die Frage beantwortet, wie man Gesichter, die Cozmo mit seiner Kamera erkennt, mit gespeicherten Gesichtern vergleicht. Der Beitrag hat auf ein Beispiel Programm hingewiesen, welches „desk_security_guard“ heißt. Das Programm war nicht unter dem Ordner „tutorials“, welches ich benutzt habe, gespeichert, sondern in einem anderen Ordner namens „apps“ bei den SDK-Beispielen von Cozmo. Diesen Ordner habe ich mir vorher noch nie angeguckt und deswegen auch nicht das Programm gesehen, was mein Problem in meinem ersten Projekt lösen konnte.
Als ich das Programm öffnete musste ich erstmal die Datei bearbeiten, damit ich nur den Teil habe, der mir bei der Lösung des Gesichtserkennungsproblems hilft. Das Programm sollte bei der Ausführung Gesichter von Personen erkennen, die an dem Tisch vorbeigehen wo Cozmo fährt, und wenn das Gesicht zu einer fremden Person gehört und nicht zum Besitzer, dann wird durch Twitter eine Nachricht an den Besitzer geschickt, wodurch er von einem Eindringling informiert wird. Da ich den Twitterteil des Programms nicht brauche, habe ich erstmal alles, was mit Twitter zu tun hat, zu Kommentaren im Quelltext gemacht. Leider kann ich nicht mehr darüber berichten, weil ich noch nicht herausgefunden habe, wie Cozmo in desk_security_guard Gesichter vergleicht.
Meine neue Idee wäre es jetzt mein erstes und zweites Projekt zusammen als ein Projekt zu kombinieren. Cozmo soll dann zum Sitzplatz einer Person im Raum fahren, sein Gesicht erkennen und wenn das Gesicht der Person erkannt wird, eine Nachricht durch die Lautsprecher wiedergeben. Wenn es sich aber um eine fremde Person handelt, die eigentlich nicht auf dem Platz sitzt, wird Cozmo durch einen Vergleich mit dem gespeicherten Gesicht feststellen, dass nicht die Person sitzt bei der eine Nachricht wiedergegeben werden soll. Somit fährt Cozmo zu seinem Startpunkt zurück oder Cozmo sagt dann etwas wie „Du bist nicht Person XY, der hier eigentlich sitzt“ und fährt dann zum Startpunkt zurück.
Weitere Fortschritte in meinem Projekt kann ich leider nicht mehr berichten, weil mein Blog bis zum 16.06 fertig geschrieben werden soll. Ich hoffe einfach, dass ich es mit der Zeit schaffe mein Projekt fertigzustellen und keine weiteren Komplikationen mehr entstehen (z.B. habe ich mitbekommen, dass paar Gruppen im Kurs Probleme mit der internen Landkarte hatten, weil Cozmo die Objekte, die durch create_custom_fixed_object erstellt wurden, einfach von Cozmo ignoriert wurden und Cozmo durch die „imaginären“ Objekte gefahren ist, was auf einen Fehler in Cozmos Programm für die interne Landkarte hindeutet).
Die Meinung
Zusammengefasst möchte ich noch sagen, dass der Projektkurs mir Spaß gemacht hat und ich es sehr spannend fand ein Projekt zu konzipieren. Die eigenständige Arbeit und die Herausforderungen haben mich die ganze Zeit motiviert. Obwohl wir mit Robotern gearbeitet haben, die komplizierter waren als Lego-Roboter, war es dennoch sehr spannend mit denen zu arbeiten. Der Projektkurs „Robotik“ ist meiner Meinung nach sehr empfehlenswert.