Bildsensor#
Einführung#
Der Vision-Sensor ist ein kamerabasierter Sensor, der Farbsignaturen und Farbcodes erkennen und verfolgen kann. Er ermöglicht es einem Roboter, seine Umgebung zu analysieren und auf visuelle Reize zu reagieren.
In den folgenden Beispielen wird der konfigurierte Vision Sensor mit vision_1bezeichnet, und die konfigurierten Farbsignaturobjekte, wie z. B. RED_BOX, werden in allen nachfolgenden Beispielen in dieser API-Dokumentation verwendet, wenn auf Vision Klassenmethoden verwiesen wird.
Nachfolgend finden Sie eine Liste aller Methoden:
Getter – Daten vom Bildsensor abrufen.
take_snapshot— Erfasst Daten für eine bestimmte Signatur.installed— Gibt an, ob der Vision Sensor mit dem IQ (2. Generation) Gehirn verbunden ist.
Eigenschaften — Objektdaten, die von take_snapshot zurückgegeben werden.
largest_object— Wählt sofort das größte Objekt aus dem Snapshot des Vision Sensors aus..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 – Sensoren manuell initialisieren und konfigurieren.
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 |
|---|---|
|
Filtert den Datensatz so, dass nur Daten der angegebenen Signatur enthalten sind. Verfügbare Signaturen sind:
|
# 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 Bildverarbeitungssensor erkennen kann. Mithilfe dieser Signaturen kann der Bildverarbeitungssensor 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 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)
installed#
installed gibt einen booleschen Wert zurück, der angibt, ob der Vision Sensor aktuell mit dem IQ (2. Generation) Gehirn verbunden ist.
True— Der Vision Sensor ist mit dem IQ (2. Generation) Gehirn verbunden.False— Der Vision Sensor ist nicht mit dem IQ (2. Generation) Gehirn 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("Installed!")
Eigenschaften#
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)
Tuple Properties#
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 objects 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)
.Breite#
.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)
.Höhe#
.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)
.Winkel#
.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 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 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 der Sensoren außerhalb von VEXcode erforderlich sind.
Vision Sensor#
Vision erstellt einen Vision Sensor.
Verwendung
Vision(port, brightness, sigs)
Parameter |
Beschreibung |
|---|---|
|
An welchen Smart Port (1 bis 12) der Vision Sensor angeschlossen ist. |
|
Optional. Der Helligkeitswert für den Bildsensor, von 1 bis 100. |
|
Optional. Der Name eines oder mehrerer Farbsignatur- oder Farbcode-Objekte. |
Beispiel
# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color 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 |
|---|---|
|
Der Index des Objekts |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
|
Der Wert von |
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.
Beispiel
# Create a new Signature RED_BOX with the Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color 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 |
|---|---|
|
Eine zuvor erstellte Farbsignatur. |
|
Eine zuvor erstellte Farbsignatur. |
|
Optional. Eine zuvor erstellte Farbsignatur. |
|
Optional. Eine zuvor erstellte Farbsignatur. |
|
Optional. Eine zuvor erstellte Farbsignatur. |
Beispiel
# Create two new Signatures for a red and blue box
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 for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)
# Display a message if Color Code is detected
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(RED_BLUE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)