Vision#

Einführung#

Der Vision-Sensor für VEX EXP erkennt und verfolgt Farbsignaturen und Farbcodes. Dadurch kann der Vision-Sensor seine Umgebung analysieren und auf Basis der erfassten visuellen Daten reagieren.

Diese Seite verwendet vision_1, RED_BOXund BOX_CODE als Beispielnamen für Bildsensor, Farbsignatur bzw. Farbcode. Ersetzen Sie diese bei Bedarf durch Ihre eigenen Namen.

Nachfolgend finden Sie eine Liste aller Methoden:

Getter – Daten vom Bildsensor abrufen.

  • take_snapshot – Erfasst Daten für eine bestimmte Farbsignatur oder einen bestimmten Farbcode.

  • largest_object – Wählt das größte Objekt aus dem Snapshot aus.

  • installed – Gibt an, ob der Vision Sensor mit dem EXP 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.

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

  • Vision – Erzeugt einen Bildsensor.

  • Signature – Erzeugt eine Farbsignatur.

  • Code – Erstellt einen Farbcode.

Getter#

take_snapshot#

take_snapshot filtert Daten aus dem Vision Sensor-Frame zu einer einzelnen Signatur – einer gespeicherten Beschreibung von etwas, das der Sensor erkennen kann, wie z. B. 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:
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 Bildsensors, zwei Unterstriche und dann der Name der Farbsignatur oder des Farbcodes. Beispiel: vision_1__RED_BOX.

# Move forward if a red object is detected
while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Farbsignaturen#

Eine Farbsignatur ist eine eindeutige Farbe, die der Bildsensor 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 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 Bildverarbeitungssensors, zwei Unterstrichen und dem Namen der Farbsignatur bestehen. Beispiel: 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 = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color signature detected!")
        wait(100, MSEC)

Farbcodes#

Ein Farbcode ist ein strukturiertes Muster aus Farbsignaturen in einer bestimmten Reihenfolge. Mithilfe dieser Codes kann der Bildsensor 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 Vision-Sensors, zwei Unterstrichen und dem Namen des Farbcodes bestehen. Beispiel: 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 = vision_1.take_snapshot(vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)

largest_object#

largest_object ruft das größte erkannte Objekt ab, von dem Daten im Tupel zurückgegeben werden, das bei der letzten Verwendung von take_snapshot verwendet wird.

Mit dieser Methode kann man immer das größte Objekt aus einem Tupel erhalten, ohne einen Index angeben zu müssen.

Usage:
vision_1.largest_object()

# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box[0].exists:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

installed#

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

  • True – Der Vision Sensor ist mit dem EXP Brain verbunden.

  • False – Der Vision Sensor ist nicht mit dem EXP Brain verbunden.

Usage:
vision_1.installed()

Parameter

Beschreibung

Diese Methode hat keine Parameter.

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

Eigenschaften#

Es gibt acht Eigenschaften, die zu jedem Objekt gehören, das nach der Verwendung von take_snapshot in einem Tupel gespeichert wird.

Alle Eigenschaftswerte beschreiben Position und Größe des erkannten Objekts im Sichtfeld des Vision-Sensors zum Zeitpunkt der Aufnahme take_snapshot . Die Werte werden in Pixeln gemessen, basierend auf der Auflösung des Sensors von 316 x 212 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 one red object is detected
# You will receive an error if no objects are detected

while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    red_objects = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_objects[0].exists:
        brain.screen.print("At least 1")
            
    else:
        brain.screen.print("No red objects")

    wait(0.5, SECONDS)

.width#

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

# Move towards a blue object until its width is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].width < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    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 212.

# Move towards a blue object until its height is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].height < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    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 316.

# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if 140 < vision_1.largest_object().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 212.

# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].centerY < 140:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.angle#

.angle gibt die Orientierung des erkannten Objekts in Grad zurück, eine ganze Zahl zwischen 0 und 359.

# Turn left or right depending on how a
# configured box code is rotated
while True: 
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)

    if box_code[0].exists: 
        if 70 < box_code[0].angle < 110:
            drivetrain.turn_for(RIGHT, 45, DEGREES)
            
        elif 250 < box_code[0].angle < 290:
            drivetrain.turn_for(LEFT, 45, DEGREES)
        
        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 316.

# Display if a red object is to the
# left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    
    if red_box[0].exists:
        if red_box[0].originX < 160:
            brain.screen.print("To the left!")
        else: 
            brain.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 212.

# Display if a red object is close or far
# from the robot
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

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

    wait(50, MSEC)

Konstruktoren#

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

Vision#

Vision erstellt einen Vision Sensor.

Verwendung

Vision(smartport, brightness, sigs)

Parameter

Beschreibung

smartport

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

brightness

Optional. Der Helligkeitswert für den Bildsensor, von 1 bis 100.

sigs

Optional. Der Name eines oder mehrerer Color Signature oder Color Code Objekte, getrennt durch Kommas (,).

# Create the Color Signatures
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)

# Create the Color Code
BOX_CODE = Code(RED_BOX, BLUE_BOX)

"""
Create a Vision Sensor with the following values:
- Port 1
- brightness: 80
- RED_BOX and BOX_CODE signatures
"""
vision_1 = Vision(Ports.PORT1, 80, RED_BOX, BOX_CODE)

Signature#

Signature erzeugt eine Farbsignatur. Bis zu sieben verschiedene Farbsignaturen können gleichzeitig auf einem Bildverarbeitungssensor gespeichert werden.

Verwendung:

Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

Parameter

Beschreibung

index

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

uMin

Der Wert von uMin in der Vision Utility.

uMax

Der Wert von uMax im Vision Utility.

uMean

Der Wert von uMean in der Vision Utility.

vMin

Der Wert von vMin in der Vision Utility.

vMax

Der Wert von vMax im Vision Utility.

vMean

Der Wert von vMean in der Vision Utility.

rgb

Der Wert von rgb in der Vision Utility.

type

Der Wert von type im Vision Utility.

Um die Werte für die Erstellung einer Farbsignatur zu erhalten, öffnen Sie das Vision Utility. Sobald eine Farbsignatur konfiguriert ist, kopieren Sie die Parameterwerte aus dem Konfigurationsfenster.

"""
Create a Color Signature with the following values:
- index: 1
- uMin: 10121
- uMax: 10757
- uMean: 10439
- vMin: -1657
- vMax: -1223
- vMean: -1440
- rgb: 2.5
- type: 1
"""
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)

Code#

Code Code sind mindestens zwei bereits definierte Farbsignaturen erforderlich. Auf einem Bildverarbeitungssensor können bis zu acht verschiedene Farbcodes gleichzeitig gespeichert werden.

Verwendung:

Code(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 = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)

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