Nachdem wir jetzt bereits einiges über Python und das Programmieren mit Cozmo wussten, wollte unser Lehrer und Projektbegleiter, Herr Eschweiler, uns noch eine weitere Sache aneignen, bevor wir mit unseren Projekten beginnen: Cozmos interne Landkarte.
Das kann man sich genau so vorstellen, wie es sich anhört: eine von Cozmo erstellte, virtuelle Landkarte
. Diese wird durch die Klasse Pose definiert, durch welche Cozmos, aber auch die Position aller anderen Objekte, wie die der Würfel, festlegt. Wir haben zudem herausgefunden, dass Cozmos Landkarte zurückgesetzt wird, wenn ein neues Programm ausgeführt wird oder wenn man Cozmo anhebt oder kippt, also „delokalisiert“, sodass er nicht mehr weiß, wo er ist. Die Anfangsposition von Cozmo ist (0/0/0). Die erste Zahl ist die x-Koordinate, die zweite die y-Koordinate und die dritte die z-Koordinate. Doch was heißt das? Laut der Anki Dokumentation verläuft die x-Koordinate in Cozmos Blickrichtung und die y-Koordinate von Cozmo aus gesehen von rechts nach links. Demnach sieht Cozmos Koordinatensystem etwa so aus:
Da Cozmo aber sowieso nur in x- und y-Richtung bewegt werden kann, ist es leichter, das Koordinatensystem von oben aus zu betrachten:
Zudem ist in der Pose-Klasse die Drehung eines Objektes festgelegt. Für Objekte wie Cozmo, welche nicht kippen können, gibt die Variable angle_z die Drehung auf der x-y Ebene an, relativ zu Cozmos Startposition, in der er um 0 Grad gedreht ist.
In der Dokumentation von Anki haben wir auch einen Befehl namens go_to_pose() gefunden, mit dem man Cozmo zu einer Position fahren lassen kann. Alles, was man dazu machen muss, ist die gewünschte Position anzugeben, inklusive Drehung.
Man kann es aber auch etwas anders machen, wenn man dazu die Variable relative_to_robot mit True gleichsetzt. Dann fährt Cozmo nämlich nicht zu der angegebenen Position, sondern addiert die angegebenen Koordianten zu seiner jetzigen Position dazu. Wenn Cozmo also zum Beispiel gerade auf der Position (20/10/0/0) ist, also bereits 20 mm nach vorne und 10 mm nach links gefahren ist und um 0 Grad gedreht ist, und dann die Methode go_to_pose(Pose(-10,20,0,angle_z=degrees(0)) ,relative_to_robot=True) ausgeführt wird, fährt Cozmo 10 mm nach hinten und 20 mm nach links, also zur Position (10/30/0) mit einer Drehung von 0°. Diese Art, Cozmo zu bewegen, ist vor allem für Methoden wichtig, in denen man eine Bewegung öfters wiederholen will, wie es in Schleifen der Fall ist. Wenn man Cozmo die erste Bewegung mit der go_to_pose() Methode machen lässt, kommt man garnicht umher, die Variable relative_to_robot mit True gleichsetzen, sonst fährt Cozmo nämlich gar nicht erst los.
Doch man kann mit der internen Landkarte auch noch viel mehr machen, als nur Cozmo hin und herfahren zu lassen. So kann man mit der Methode create _custom_fixed_object() ein virtuelles Objekt erstellen. Dabei gibt man erst die Position des Objektes an und dann, wie groß es ist, nur muss man beachten, dass die angegebene Postion in der Mitte des Objektes ist. Schreibt man also create_custom_fixed_object(Pose(15,15,0,angle_z=degrees(45)),20,5,1) sieht das entsprechende Objekt in der virtuellen Landkarte dann so aus:
Das Kreuz in der Mitte des Objektes ist die angegebene Position. Das Objekt wurde um 45° gedreht, jedoch gegen und nicht mit dem Uhrzeigersinn. Diese beiden Faktoren muss man immer im Hinterkopf behalten, wenn man ein Objekt erstellt.
Das schönste an der go_to_pose Methode kommt jetzt: Wenn ein Objekt auf dem direkten Weg von Cozmo zur Zielposition liegt, umfährt Cozmo dieses automatisch. So kann man echte Hindernisse einfach ausmessen und in das Programm einprogrammieren, so dass Cozmo sich von alleine einen Weg an den Hindernissen vorbei bahnen kann. Eine andere tolle Eigenschaft der internen Landkarte ist, dass Cozmo die Würfel registriert und in die Karte einträgt, wenn er sie mit der Kamera sieht, so dass er auch diese millimetergenau alleine anfahren und anheben kann.