KI-Vision#

Einführung#

Der KI-Vision-Sensor kann Objekte, Farben und AprilTag-IDs erkennen und verfolgen. Dadurch kann der Roboter seine Umgebung analysieren, Objekten folgen und auf Basis der erfassten visuellen Daten reagieren.

Diese Seite verwendet ai_vision_1, RED_BOXund BOX_CODE als Beispielnamen für den AI Vision Sensor, die Farbsignatur bzw. den Farbcode. Ersetzen Sie diese bei Bedarf durch Ihre eigenen Namen.

Nachfolgend finden Sie eine Liste aller Methoden:

Getter – Daten vom KI-Vision-Sensor abrufen.

  • take_snapshot – Erfasst Daten für eine bestimmte Signatur.

  • installed – Gibt an, ob der AI Vision Sensor mit dem V5 Brain verbunden ist.

Eigenschaften – Objektdaten, die von take_snapshot zurückgegeben wurden.

  • .exists – Gibt an, ob das Objekt in 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.

  • .angle – Orientierung des Farbcodes.

  • .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.

Konstruktoren – Manuelle Initialisierung und Konfiguration des KI-Vision-Sensors und seiner Signaturen.

  • AiVision – Erstellt einen KI-Vision-Sensor.

  • Colordesc – Erstellt eine Farbsignatur.

  • Codedesc – Erstellt einen Farbcode.

  • Tagdesc – Erstellt eine AprilTag-ID.

Getter#

take_snapshot#

take_snapshot filtert Daten aus dem Frame des AI Vision Sensors 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 Vision Utility konfiguriert werden, bevor sie mit dieser Methode verwendet werden können.

The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.

Usage:
ai_vision_1.take_snapshot(SIGNATURE)

Parameter

Beschreibung

SIGNATURE

Filtert den Datensatz so, dass nur Daten der angegebenen Signatur enthalten sind. Verfügbare Signaturen sind:

  • Farbsignaturen oder Farbcodes – Der Name des AI Vision Sensors, zwei Unterstriche und dann der Name der Farbsignatur oder des Farbcodes. Zum Beispiel: ai_vision_1__RED_BOX.
  • AiVision.ALL_AIOBJS – Würfel, Ringe und Kugeln.
  • AiVision.ALL_TAGS – Alle AprilTag-IDs.

count

Optional. Legt die maximale Anzahl der zurückzugebenden Objekte (1 bis 24) fest. Der Standardwert ist 8.

# Drive forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    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(ai_vision_1.take_snapshot(AiVision.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(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=lambda tag: tag.height)
    for tag in apriltags_by_height:
        print(tag.height)
    wait(1, SECONDS)

KI-Klassifizierungen#

Der KI-Vision-Sensor kann verschiedene Objekte anhand bestimmter KI-Klassifizierungen erkennen. Je nachdem, welches KI-Klassifizierungsmodell bei der Konfiguration des KI-Vision-Sensors im Gerätefenster ausgewählt wird, werden unterschiedliche Objekte erkannt. Folgende Modelle stehen derzeit zur Verfügung:

Elemente für den Unterricht

Identifikationsnummer

KI-Klassifizierung

0

BLUE_BALL

1

GREEN_BALL

2

RED_BALL

3

BLUE_RING

4

GREEN_RING

5

RED_RING

6

BLUE_CUBE

7

GREEN_CUBE

8

RED_CUBE

VEX V5 Robotik-Wettbewerb – Hohe Einsätze

Identifikationsnummer

KI-Klassifizierung

0

MOBILE_GOAL

1

RED_RING

2

BLUE_RING

VEX V5 Robotik-Wettbewerb: Verschiebung

Identifikationsnummer

KI-Klassifizierung

0

BLUE_BLOCK

1

RED_BLOCK

VEX V5 Robotics Competition Override

Identifikationsnummer

KI-Klassifizierung

0

RED_BLUE_PIN

1

BLUE_YELLOW_PIN

2

RED_YELLOW_PIN

3

YELLOW_PIN

4

CUP

Farbsignaturen#

Eine Farbsignatur ist eine eindeutige Farbe, die der KI-Vision-Sensor erkennen kann. Mithilfe dieser Signaturen kann der KI-Vision-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 take_snapshot verwendet, um farbige Objekte in Echtzeit zu verarbeiten und zu erkennen.

Um eine konfigurierte Farbsignatur in einem Projekt zu verwenden, muss ihr Name aus dem Namen des Sensors, zwei Unterstrichen und dem Namen der Farbsignatur bestehen. Beispiel: ai_vision_1__RED_BOX.

# Display if any objects match the RED_BOX signature
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Signature
    red_box = ai_vision_1.take_snapshot(ai_vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color detected!")
        wait(100, MSEC)

Farbcodes#

Ein Farbcode ist ein strukturiertes Muster aus Farbsignaturen 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.

Um einen konfigurierten Farbcode in einem Projekt zu verwenden, muss sein Name aus dem Namen des Sensors, zwei Unterstrichen und dem Namen des Farbcodes bestehen. Beispiel: ai_vision_1__BOX_CODE.

# Display if any objects match the BOX_CODE code
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Code
    box_code = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)

installed#

installed gibt einen booleschen Wert zurück, der angibt, ob der AI Vision Sensor aktuell mit dem V5 Brain verbunden ist.

  • True – Der KI-Vision-Sensor ist mit dem V5 Brain verbunden.

  • False – Der KI-Vision-Sensor ist nicht mit dem V5-Gehirn verbunden.

Usage:
ai_vision_1.installed()

Parameter

Beschreibung

Diese Methode hat keine Parameter.

# Display a message if the AI Vision Sensor is connected
if ai_vision_1.installed():
    brain.screen.print("Installed!")

Eigenschaften#

Es gibt zehn Eigenschaften, die zu jedem Objekt gehören, das in einem Tupel gespeichert wird, nachdem take_snapshot verwendet wurde.

Alle Eigenschaftswerte außer .id und .score beschreiben Position und Größe des erkannten Objekts im Sichtfeld des KI-Vision-Sensors zum Zeitpunkt der Verwendung take_snapshot Diese Werte werden in Pixeln gemessen, basierend auf der Auflösung des Sensors von 320 x 240 Pixeln.

.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:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[1].exists:
            brain.screen.print("At least 2")

        else:
            brain.screen.print("Less than 2")
    wait(50, MSEC)

.width#

.width gibt die Breite des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 1 und 320.

# Approach an object until it's at least 100 pixels wide
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].width < 100:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.height#

.height gibt die Höhe des erkannten Objekts in Pixeln zurück, eine ganze Zahl zwischen 1 und 240.

# Approach an object until it's at least 90 pixels tall
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].height < 90:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    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.

# Turn until an object is directly in front of the sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 140 < objects[0].centerX < 180:
            drivetrain.stop()
    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.

# Approach an object until the object's center is
# high enough in the field of view
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].centerY < 150:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.angle#

.angle gibt die Orientierung des erkannten Farbcodes oder der AprilTag-ID in Grad zurück, eine ganze Zahl zwischen 0 und 359.

# Turn left or right depending on how a
# configured Color Code is rotated
while True:
    box_code = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)

    if box_code[0].exists:
        if 50 < box_code[0].angle < 100:
            drivetrain.turn(RIGHT)

        elif 270 < box_code[0].angle < 330:
            drivetrain.turn(LEFT)

        else:
            drivetrain.stop()
    else:
        drivetrain.stop()
    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.

# Display if an object is to the left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originX < 120:
            brain.screen.print("To the left!")
        else:
            brain.screen.print("To the right!")
    else:
        brain.screen.print("No objects")
    wait(100, 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.

# Display if an object is close or far
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originY < 110:
            brain.screen.print("Close")
        else:
            brain.screen.print("Far")

.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 36. 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 = ai_vision_1.take_snapshot(AiVision.ALL_TAGS)

    if apriltags[0].exists:
        if apriltags[0].id == 1:
            robot.drive(FORWARD)
    else:
        drivetrain.stop()

    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.

Konstruktoren#

Konstruktoren werden verwendet, um manuell AiVision, Colordescund Codedesc Objekte zu erstellen, die für die Konfiguration des AI Vision Sensors außerhalb von VEXcode erforderlich sind.

AiVision#

AiVision erstellt einen KI-Vision-Sensor.

Verwendung

Vision(smartport, sigs)

Parameter

Beschreibung

smartport

Der Smart Port, an den der AI Vision Sensor angeschlossen ist, wird als Ports.PORTx geschrieben, wobei x die Nummer des Ports ist.

sigs

Optional. Der Name einer oder mehrerer Signaturen, durch Kommas getrennt (,):

  • Farbsignatur
  • Farbcode
  • AiVision.ALL_TAGS – Alle AprilTag-IDs
  • AiVision.ALL_AIOBJS – Alle KI-Klassifizierungen

# Create the Color Signatures
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)
BLUE_BOX = Colordesc(0, 26, 255, 0, 20, 0.9)

# Create the Color Code
RED_BLUE = Codedesc(RED_BOX, BLUE_BOX)

"""
Create an AI Vision Sensor with the following signatures:
- RED_BLUE
- AiVision.ALL_TAGS - for AprilTag IDs
"""
ai_vision_1 = AiVision(Ports.PORT1, RED_BLUE, AiVision.ALL_TAGS)

Colordesc#

Colordesc erzeugt eine Farbsignatur. Bis zu sieben verschiedene Farbsignaturen können gleichzeitig auf einem KI-Vision-Sensor gespeichert werden.

Usage:
Colordesc(index, red, green, blue, hangle, hdsat)

Parameter

Beschreibung

index

Der Index des Objekts Colordesc , von 1 bis 7.
Hinweis: Wenn zwei Objekte Colordesc mit der gleichen Indexnummer erstellt werden, überschreibt das zweite erstellte Objekt das erste.

red

Der Rotwert der Farbe von 0 bis 255.

green

Der Grünwert der Farbe von 0 bis 255.

blue

Der Blauwert der Farbe von 0 bis 255.

hangle

Die zulässige Farbtonabweichung wird als Bereich in Grad auf dem Farbkreis (1–40) angegeben. Höhere Werte erlauben eine größere Abweichung von der Grundfarbe.

hdsat

Die zulässige Sättigungsabweichung liegt zwischen 0,10 und 1,00. Dieser Wert gibt den Anteil des vollen Sättigungsbereichs an, innerhalb dessen die Farbe abweichen darf (z. B. 0,10 = ±10 % Sättigung).

Ein kreisförmiges Farbrad, das ein vollständiges Farbspektrum anzeigt, wobei die Gradwerte am Rand in 30-Grad-Schritten von 0° oben bis 360° ansteigen.

"""
Create a Color Signature with the following values:
- index: 1
- red: 255
- green: 0
- blue: 0
- hangle: 20
- hdsat: 0.9
"""
# Create a red Color Signature
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)

Codedesc#

Codedesc erzeugt einen Farbcode. Zur Verwendung sind mindestens zwei bereits definierte Farbsignaturen erforderlich. Auf einem Bildverarbeitungssensor können bis zu acht verschiedene Farbcodes gleichzeitig gespeichert werden.

Usage:
Codedesc(sig1, sig2, sig3, sig4, sig5)

Parameter

Beschreibung

sig1

Eine zuvor erstellte Farbsignatur.

sig2

Eine zuvor erstellte Farbsignatur.

sig3

Optional. Eine zuvor erstellte Farbsignatur.

sig4

Optional. Eine zuvor erstellte Farbsignatur.

sig5

Optional. Eine zuvor erstellte Farbsignatur.

# Create the Color Signatures
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)
BLUE_BOX = Colordesc(0, 26, 255, 0, 20, 0.9)

# Create a Color Code with the Color Signatures
BOX_CODE = Codedesc(RED_BOX, BLUE_BOX)

Tagdesc#

Tagdesc erstellt eine AprilTag-ID. Sie können diese verwenden, um eindeutige AprilTag-IDs zu definieren, wodurch Ihr Code übersichtlicher und leichter lesbar wird.

Usage:
Tagdesc(id)

Parameter

Beschreibung

id

Die zu verwendende AprilTag-ID.

# Set AprilTag ID 7 to be the "goal"
goal = Tagdesc(7)