KI-Vision#
Einführung#
Der KI-Vision-Sensor des VEX AIM Coding-Roboters erkennt und verfolgt Objekte, Farben und AprilTag-IDs. Dadurch kann der Roboter seine Umgebung analysieren, Objekten folgen und auf Basis der erfassten visuellen Daten reagieren.
Der KI-Vision-Sensor hat eine Auflösung von 320×240 Pixeln. Der Ursprung (0, 0) befindet sich in der oberen linken Ecke, wodurch sich der Mittelpunkt des Sensors bei (160, 120) befindet, wie in der folgenden Abbildung dargestellt:

Nachfolgend finden Sie eine Liste aller Methoden und Eigenschaften:
Aktionen – Kamerabild der KI-Vision ein- oder ausblenden.
show_aivision— Zeigt den AI Vision-Feed auf dem Bildschirm des Roboters an.hide_aivision— Blendet den AI Vision-Feed vom Bildschirm aus.tag_detection— Schaltet die AprilTag-ID-Erkennung ein oder aus.
Getter – Erkennen, ob der Roboter ein Objekt hält.
get_data— Gibt ein Tupel erkannter Objekte für eine bestimmte Signatur zurück.has_sports_ball— Gibt zurück, ob der Roboter einen Sportball hat.has_any_barrel— Gibt zurück, ob der Roboter über irgendeine Art von Fass verfügt.has_blue_barrel— Gibt zurück, ob der Roboter ein blaues Fass hat.has_orange_barrel— Gibt zurück, ob der Roboter ein oranges Fass hat.
Eigenschaften — Objektdaten, die von get_data zurückgegeben werden.
exists— Gibt als boolescher Wert an, ob das Objekt bei der aktuellen Erkennung existiert.width— Breite des erkannten Objekts.height— Höhe des erkannten Objekts.centerX— X-Position des Objektmittelpunkts.centerY— Y-Position des Objektmittelpunkts.bearing— Horizontaler Winkel relativ zur Vorderseite des Roboters.rotation— Orientierung des Objekts.originX— X-Position der oberen linken Ecke des Objekts.originY— Y-Position der oberen linken Ecke des Objekts.id— Klassifizierung oder Tag-ID des Objekts.score— Konfidenzwert für KI-Klassifizierungen.type— Gibt den Typ des Objekts zurück (AI, Tag, Farbe oder Code).
Konstrukteure – Farbsignaturen und -codes definieren.
Farbsignatur erstellen — Erstellt eine neue Farbsignatur basierend auf RGB- und Farbton-/Sättigungsbereichen.
Farbcode erstellen — Kombiniert mehrere Farbsignaturen zu einem einzigen Farbcode.
Aktionen#
show_aivision#
show_aivision zeigt die Live-Daten des KI-Vision-Sensors auf dem Bildschirm des Roboters an. Die Live-Daten überdecken alle anderen Bilder oder Texte auf dem Bildschirm.
Hinweis: Es werden keine anderen Bilder oder Texte angezeigt, es sei denn, hide_aivision wird verwendet, um den Feed auszublenden.
Usage:
robot.screen.show_aivision()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision entfernt die Live-Daten des KI-Vision-Sensors vom Bildschirm des Roboters.
Usage:
robot.screen.hide_aivision()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection aktiviert oder deaktiviert die AprilTag-ID-Erkennung, wobei der Status ein boolescher Wert ist.
Der Sensor kann AprilTag-IDs von 0 bis 36 aus der Circle21h7-Familie erkennen.
Usage:
robot.vision.tag_detection(state)
Parameter |
Beschreibung |
|---|---|
|
Die Werte sind: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
Getter#
get_data#
get_data filtert Daten aus dem AI Vision Sensor-Frame zu einer einzelnen Signatur – einer gespeicherten Beschreibung von etwas, das der Sensor erkennen kann, wie z. B. ein vorab trainiertes Objekt, eine AprilTag-ID oder eine konfigurierte Farbsignatur oder ein Farbcode – und gibt ein Tupel zurück.
Farbsignaturen und Farbcodes müssen zuerst im AI Vision Utility konfiguriert werden, bevor sie mit dieser Methode verwendet werden können.
Das Tupel speichert Objekte, sortiert nach ihrer Breite von groß nach klein, beginnend bei Index 0. Auf die Eigenschaften jedes Objekts kann über seinen Index zugegriffen werden. Wird kein passendes Objekt gefunden, wird ein leeres Tupel zurückgegeben.
Usage:
robot.vision.get_data(signature, count)
Parameter |
Beschreibung |
|---|---|
|
Filtert den Datensatz so, dass er nur Daten mit der angegebenen Signatur enthält. Verfügbare Signaturen:
|
|
Optional. Legt die maximale Anzahl der zurückzugebenden Objekte zwischen 1 und 24 fest (Standardwert: 8). |
Hinweis: Die AprilTag-IDs 5 bis 37 können mithilfe der gedruckten AprilTag-IDs aus AIM Printables abgerufen werden.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
wait(50, MSEC)
Note: The returned tuple can be sorted by any property, not just width, using Python’s sorted function. For example, sorting by AprilTag ID:
# Print each detected AprilTag ID in ascending order by ID
while True:
apriltags = sorted(robot.vision.get_data(ALL_TAGS), key=id)
for tag in apriltags:
print(tag.id)
wait(1, SECONDS)
Oder stattdessen nach Höhe sortieren:
# Print each detected AprilTag ID in ascending order by height
while True:
apriltags_by_height = sorted(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
Daten anzeigen#
Die Ausgabe des von get_data zurückgegebenen Tupels zeigt eine Liste aller Eigenschaften aller erkannten Objekte an:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

KI-Klassifizierungen#
Der AIM AI Vision Sensor kann folgende KI-Klassifizierungen erkennen:
Identifikationsnummer |
KI-Klassifizierung |
Unterschrift |
|---|---|---|
0 |
Ball |
|
1 |
Blaues Fass |
|
2 |
Orange Barrel |
|
3 |
AIM-Roboter |
|
Farbsignaturen#
Eine Farbsignatur ist eine eindeutige Farbe, die der KI-Vision-Sensor erkennen kann. Mithilfe dieser Signaturen kann der Sensor Objekte anhand ihrer Farbe erkennen und verfolgen. Sobald eine Farbsignatur konfiguriert ist, kann der Sensor Objekte mit dieser spezifischen Farbe in seinem Sichtfeld identifizieren. Farbsignaturen werden zusammen mit get_data verwendet, um farbige Objekte in Echtzeit zu verarbeiten und zu erkennen.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
Farbcodes#
Ein Farbcode ist ein strukturiertes Muster aus zwei bis vier Farbtönen in einer bestimmten Reihenfolge. Mithilfe dieser Codes kann der KI-Vision-Sensor vordefinierte Farbmuster erkennen. Farbcodes eignen sich zur Identifizierung komplexer Objekte oder zur Erstellung eindeutiger Markierungen für die autonome Navigation.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball gibt einen booleschen Wert zurück, der angibt, ob der Roboter aktuell einen Sportball besitzt.
True— Der Roboter hat einen Sportball.False— Der Roboter hat keinen Sportball.
Usage:
robot.has_sports_ball()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel gibt einen booleschen Wert zurück, der angibt, ob der Roboter aktuell über irgendeine Art von Fass verfügt.
True— Der Roboter hat ein Fass.False— Der Roboter hat keinen Lauf.
Usage:
robot.has_any_barrel()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel gibt einen booleschen Wert zurück, der angibt, ob der Roboter aktuell einen blauen Lauf hat.
True— Der Roboter hat einen blauen Lauf.False— Der Roboter hat keinen blauen Lauf.
Usage:
robot.has_blue_barrel()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel gibt einen booleschen Wert zurück, der angibt, ob der Roboter aktuell ein oranges Fass besitzt.
True— Der Roboter hat ein orangefarbenes Fass.False— Der Roboter hat kein oranges Fass.
Usage:
robot.has_orange_barrel()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Eigenschaften#
Es gibt zwölf Eigenschaften, die zu jedem Objekt gehören, das nach der Verwendung der Methode robot.vision.get_data in einem Tupel gespeichert wird.
All property values except .id, .score, and .type describe the detected object’s position, size, orientation, or bearing at the moment robot.vision.get_data was used. These values are measured in pixels or degrees, based on the sensor’s 320 by 240 pixel resolution.

.exists#
.exists gibt einen booleschen Wert zurück, der angibt, ob der Index im Tupel existiert oder nicht.
True— Der Index existiert.False— Der Index existiert nicht.
# Check if at least two objects are detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width gibt die Breite des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 1 und 320.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height gibt die Höhe des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 1 und 240.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.centerX#
.centerX gibt die x-Koordinate des Mittelpunkts des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 0 und 320.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
wait(10,MSEC)
.centerY#
.centerY gibt die y-Koordinate des Mittelpunkts des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 0 und 240.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing gibt einen Dezimalwert (float) zurück, der die Entfernung eines Objekts links oder rechts vom Zentrum des Sichtfelds des KI-Vision-Sensors in Grad angibt. Ein Wert von 0 bedeutet, dass sich das Objekt im Zentrum befindet, positive Werte bedeuten, dass es sich rechts befindet, und negative Werte bedeuten, dass es sich links befindet.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
.rotation gibt die Ausrichtung des Objekts auf der Sichtebene des KI-Vision-Sensors in Grad (0 bis 359) zurück. Ein Farbcode entspricht 0°, wenn die Farben horizontal angeordnet sind (z. B. Rot–Blau). Bei einer Drehung der Farben ändert sich der Winkel (z. B. ergibt die Anordnung Blau–Rot 180°).
Im folgenden Beispiel wurde der Farbcode so konfiguriert, dass links Rot und rechts Blau dargestellt ist.
In diesem Bild entspricht das Übereinanderlegen von Blau und Rot einer Drehung des ursprünglichen Farbcodes um 270 Grad nach rechts.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(50, MSEC)
.originX#
.originX gibt die x-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 0 und 320.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY gibt die y-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 0 und 240.
Hinweis: Die Pixelwerte beziehen sich auf das Koordinatensystem des Sensors. Siehe dazu das Diagramm in der Einleitung.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.id#
.id gibt die ID der erkannten KI-Klassifizierung oder AprilTag-ID als ganze Zahl zurück.
Bei einer AprilTag-ID repräsentiert die Eigenschaft .id die erkannte AprilTag-ID-Nummer im Bereich von 0 bis 37. Bei einer KI-Klassifizierung entspricht die Eigenschaft .id der vordefinierten ID im Abschnitt KI-Klassifizierungen.
# Move forward when AprilTag ID 1 is detected
while True:
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.score#
.score gibt den Konfidenzwert der erkannten KI-Klassifizierung als ganze Zahl zwischen 1 und 100 zurück.
Ein niedrigerer Wert bedeutet, dass der Sensor weniger sicher ist, welches Objekt erkannt wurde, während ein höherer Wert bedeutet, dass der Sensor sicherer ist.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
.type gibt eine Ganzzahl zurück, die den Typ des erkannten Objekts angibt. Sie können diesen Wert entweder mit der Typnummer oder der entsprechenden benannten Konstante vergleichen:
Objekttyp |
Eingeschlossene Objekte |
|---|---|
|
— Sportbälle |
|
— AprilTag-IDs |
|
— Farbsignaturen |
|
— Farbcodes |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
Konstruktoren#
Creating a Color Signature#
Eine neue Farbsignatur wird mithilfe des Konstruktors Colordesc erstellt und anschließend mit der Methode Colordesc beim KI-Vision-Sensor registriert. Ein color_description Objekt definiert eine von bis zu sieben erkennbaren Farbsignaturen für den Sensor, muss aber explizit mit color_description um wirksam zu werden.
Colordesc-Nutzung:
Colordesc(index, red, green, blue, hangle, hdsat)
Parameter |
Beschreibung |
|---|---|
|
Eine ganze Zahl von 1 bis 7, die den Index der Farbsignatur darstellt. Wenn zwei Farbsignaturen denselben Index verwenden, überschreibt die zweite die erste. |
|
Eine ganze Zahl von 0 bis 255 für die Rotkomponente der Farbe. |
|
Eine ganze Zahl von 0 bis 255 für die Grünkomponente der Farbe. |
|
Eine ganze Zahl von 0 bis 255 für die blaue Farbkomponente. |
|
Ein Gleitkommawert von 1 bis 40, der den Farbtonbereich in Grad angibt. |
|
Eine Gleitkommazahl von 0,10 bis 1,00, die den Sättigungsbereich darstellt. |
Farbbeschreibung Verwendung:
robot.vision.color_description(object)
Parameter |
Beschreibung |
|---|---|
|
Das Objekt |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
Ein neuer Farbcode wird mithilfe des Konstruktors Codedesc erstellt und anschließend mit der Methode code_description aktiviert. Ein Farbcode gruppiert 2 bis 4 vorhandene Colordesc Objekte zu einer einzigen Kennung, die der KI-Vision-Sensor als Sequenz erkennen kann. Er muss jedoch explizit mit code_description festgelegt werden, um wirksam zu werden.
Codedesc-Nutzung:
Codedesc(index, c1, c2, c3, c4, c5)
Parameter |
Beschreibung |
|---|---|
|
Der Index des Farbcodes, von 1 bis 8. Hinweis: Wenn Sie zwei |
|
Das erste |
|
Das zweite |
|
Optional. Ein drittes |
|
Optional. Ein viertes |
Codebeschreibung Verwendung:
robot.vision.code_description(object)
Parameter |
Beschreibung |
|---|---|
|
Ein |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)