Zum Inhalt

Repräsentation des Würfels

In diesem Abschnitt wird thematisiert, wie der Würfel intern repräsentiert wird und wie diese Repräsentation genutzt wird, um den Würfel in RoboDK zur Anzeige zu bringen.

Der Würfel (definiert in core.cube.Cube3D.Cube3D) besteht aus 26 Segmenten (das nicht-sichtbare Mittelstück ist nicht relevant und wird somit weggelassen), welche würfelförmig im dreidimensionalen Raum um den Ursprung in dem Bereich in X-, Y- und Z-Richtung angeordnet sind. Jede Seite des Würfels besteht aus 9 Segmenten, als 3x3-Raster angeordnet. Das Segment, dessen Ursprung sich in befindet, gibt es nicht.

Der Würfel befindet sich in dem Würfel-Koordinatensystem, welches die Pose des gesamten Würfels angibt. Bei der Modellierung des Würfels ist eine Beobachtung wichtig, nämlich, dass sich die Mittelfläche jeder Seite ihre Position niemals verändert. Somit können diesen Mittelflächen bzw. ihren Farben Achsen der Würfelbasis zugewiesen werden.

Das Würfel-Koordinatensystem ist so definiert, dass die positiven X-Achse von der blauen Würfelseite, die positive Y-Achse von der roten Würfelseite und die positive Z-Achse von der gelben Würfelseite ausgeht. Die anderen Würfelseiten sind der entsprechenden negativen Achse zugewiesen (siehe Abbildung 1). Auch wenn Seiten dieses Würfels verdreht werden, gilt diese Zuweisung.

Abbildung 1. Zuweisung von Achsen zu Seiten bzw. Farben des Würfels.

Innerhalb dieses Koordinatensystems sind die Segmente wie oben beschrieben verteilt. Jedes Segment besitzt somit einen Ursprung bezüglich des Würfel-Koordinatensystems und zusätzlich eine Basis, die die Drehung dieses Segments angibt. Analog zum Würfel-Koordinatensystem sind in den Segment-Koordinatensystemen den Achsen dieselben Farben zugeordnet (und anders herum, siehe Abbildung 2). Anhand der nach außen sichtbaren Achsen lassen sich also die angezeigten Farben berechnen (siehe core.cube.Cube3D.CubeSegment.get_exposed_colors()).

Abbildung 2. Ansicht eines Segment-Koordinatensystems. Hier sind die blaue Seite (positive X-Achse), die rote Seite (positive Y-Achse) und die weiße Seite (negative Z-Achse) sichtbar.

Die Modellierung des Würfels in dieser Form hat den Vorteil, dass eine Ebene von Segmenten anhand der Koordinaten ausgewählt werden kann und auf die Koordinaten der Segmente ausschließlich eine Rotationsmatrix angewendet werden muss, um diese Seite zu rotieren. In dieser Repräsentation können also auch unabhängig von RoboDK die Seiten des Würfels gedreht und der Würfel somit gelöst werden (siehe core.cube.Cube3D.Cube3D.perform_rotations() und core.cube.Cube3D.Cube3D.rotate()). Um die Animation einer sich drehenden Seite des Würfels in RoboDK darzustellen, wird die zu drehende Ebene in RoboDK über die Python-Schnittstelle zum Kindobjekt der Halterung gemacht, die während der Drehung starr bleibt. Die beiden restlichen Ebenen sind nach wie vor Kindobjekte des Greifers und drehen sich somit mit seiner Drehung mit. Mit Abschluss der Drehung wird die gedrehte Ebene wieder zu einem Kindobjekt des Greifers (dies geschieht in den Methoden der Klasse core.cube.AnimatingCuber.AnimatingCuber).

Die interne Repräsentation kann mithilfe der Funktion core.ui.ui_cube.UICube.update_ui() zur Anzeige gebracht werden, z.B. nach dem Einlesen des Würfels. Mithilfe der Funktion core.ui.ui_util.UIUtilities.set_pose(), welche letztendlich die Robolink-Funktionen setVX(), setVY() und setVZ() nutzt, um die Basisvektoren des Objekts zu setzen, kann die Basis von der internen Repräsentation direkt RoboDK übergeben werden, um Würfel und Segmente in der richtigen Orientierung anzuzeigen.


Wie der physische Würfel mithilfe der Kamera eingelesen wird, erläutert das nächste Kapitel.