Bildsensor#

Einführung#

Die Klasse vision dient zur Steuerung und zum Zugriff auf Daten des EXP-Vision-Sensors. Dieser Sensor erkennt und verfolgt Farbsignaturen in seinem Sichtfeld und ermöglicht es Ihrem Roboter, Ziele zu identifizieren und in Echtzeit auf visuelle Informationen zu reagieren.

Der Vision Sensor kann mehrere charakteristische Objekte gleichzeitig erkennen und liefert Informationen wie Objektposition, Breite, Höhe und Mittelpunktkoordinaten.

Klassenkonstruktoren#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Klassendestruktor#

Destroys the vision object and releases associated resources.

~vision();

Parameter#

Parameter

Typ

Beschreibung

index

int32_t

Der Smart Port, an den der Vision Sensor angeschlossen ist, wird als PORTxgeschrieben, wobei x die Portnummer ist (zum Beispiel PORT1).

bright

uint8_t

Der Helligkeitswert des Bildsensors.

sigs

vision::signature or vision::code objects

Ein oder mehrere vision::signature oder vision::code Objekte, die beim Sensor registriert werden sollen.

Beispiele#

// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

Mitgliedsfunktionen#

Die Klasse vision umfasst die folgenden Memberfunktionen:

  • takeSnapshot — Erfasst Daten für eine bestimmte Farbsignatur oder einen bestimmten Farbcode.

  • installed — Gibt an, ob der Vision Sensor mit dem EXP Brain verbunden ist.

Um auf erkannte Objektdaten zuzugreifen, nachdem takeSnapshot aufgerufen wurde, verwenden Sie die verfügbaren Properties.

Bevor Funktionen der Klasse vision aufgerufen werden können, muss eine Instanz der Klasse vision erstellt werden, wie unten dargestellt:

/* This constructor is required when using VS Code.
Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */


// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

takeSnapshot#

Erfasst ein Bild vom Bildsensor, verarbeitet es anhand der Signatur und aktualisiert das Array objects . Mit dieser Methode lässt sich auch die Anzahl der im Snapshot erfassten Objekte begrenzen.

The objects array stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. If no matching objects are detected, objectCount will be 0 and objects[i].exists will be false.

Available Functions

1 — Erstellt eine Momentaufnahme und sucht nach Objekten, die der angegebenen Signatur-ID entsprechen.

int32_t takeSnapshot( uint32_t id );

2 — Erstellt eine Momentaufnahme und sucht nach Objekten, die dem angegebenen vision::code Objekt entsprechen.

int32_t takeSnapshot( code &cc );

3 — Erstellt eine Momentaufnahme und sucht nach Objekten, die dem angegebenen vision::signature Objekt entsprechen.

int32_t takeSnapshot( signature &sig );

4 — Erstellt eine Momentaufnahme und speichert nur die größte angegebene Anzahl von Objekten, die mit der Signatur-ID übereinstimmen.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Erstellt eine Momentaufnahme und speichert nur die größte angegebene Anzahl von Objekten, die dem angegebenen vision::code Objekt entsprechen.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Erstellt eine Momentaufnahme und speichert nur die größte angegebene Anzahl von Objekten, die mit dem angegebenen vision::signature Objekt übereinstimmen.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parameter

Typ

Beschreibung

id

uint32_t

Die zu suchende Signatur-ID-Nummer.

cc

code &

Ein Verweis auf ein vision::code Objekt, nach dem gesucht werden soll.

sig

signature &

Ein Verweis auf ein vision::signature Objekt, nach dem gesucht werden soll.

count

uint32_t

Die maximale Anzahl der zu erkennenden Objekte.

Return Values

Gibt einen int32_t zurück, der die Anzahl der erkannten übereinstimmenden Objekte darstellt.

Notes
  • Der Vision-Sensor muss eine Momentaufnahme erstellen, bevor auf die Objektdaten zugegriffen werden kann.

  • Bei der Angabe count werden nur die größten erkannten Objekte (bis zur angegebenen Anzahl) gespeichert.

Beispiele

while (true) {
  // Display if a blue object is detected
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Blue detected");
  } 
  else {
    Brain.Screen.print("No blue");
  }

  wait(0.5, seconds);
}

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

// Display when BOXCODE is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BOXCODE);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Code detected!");
  }
  wait( 100, msec);
}

installed#

Gibt zurück, ob der Vision Sensor mit dem EXP Brain verbunden ist.

Available Functions
bool installed();

Parameters

Diese Funktion benötigt keine Parameter.

Return Values

Gibt einen booleschen Wert zurück, der angibt, ob der Vision-Sensor angeschlossen ist:

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

Eigenschaften#

Der Aufruf von takeSnapshot aktualisiert die Erkennungsergebnisse des Vision-Sensors. Jeder Snapshot aktualisiert das Array objects , welches die erkannten Objekte für die angeforderte Farbsignatur oder den Farbcode enthält.

Die Daten des Vision Sensors werden über Eigenschaften von Objekten abgerufen, die in Vision1.objects[index]gespeichert sind, wobei index bei 0 beginnt.

Die Bildauflösung des Vision-Sensors beträgt 316 x 212 Pixel. Objektposition und -größe werden in Pixeln relativ zum aktuellen Sichtfeld des Sensors angegeben.

Folgende Objekte stehen zur Verfügung:

  • largestObject — Wählt das größte erkannte Objekt aus dem aktuellsten Snapshot aus.

  • objectCount — Gibt die Anzahl der gültigen Objekte zurück, die in objects gespeichert sind.

  • objects — Array der erkannten Objekte, aktualisiert durch takeSnapshot.

  • .exists — Gibt an, ob der Objekteintrag gültige Daten enthält.

  • .width — Breite des erkannten Objekts in Pixeln.

  • .height — Höhe des erkannten Objekts in Pixeln.

  • .centerX — X-Position des Objektmittelpunkts in Pixeln.

  • .centerY — Y-Position des Objektmittelpunkts in Pixeln.

  • .originX — X-Position der oberen linken Ecke des Objekts in Pixeln.

  • .originY — Y-Position der oberen linken Ecke des Objekts in Pixeln.

  • .angle — Orientierung des erkannten Farbcodes in Grad (falls zutreffend).

largestObject#

Ruft das größte erkannte Objekt aus dem Array objects ab.

Mit dieser Methode kann man immer das größte Objekt aus objects erhalten, ohne einen Index anzugeben.

Syntax
VisionSensor.largestObject

Components

Komponente

Beschreibung

VisionSensor

Der Name Ihrer Vision Sensor-Instanz.

Beispiele

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display the largest detected object's width
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (Vision1.objects[0].exists) {
      Brain.Screen.print("%d", Vision1.largestObject.width);
    } 
    wait(0.5, seconds);
  }
}

objectCount#

Gibt die Anzahl der Elemente im Array objects als ganze Zahl zurück.

Syntax
VisionSensor.objectCount

Components

Komponente

Beschreibung

VisionSensor

Der Name Ihrer Vision Sensor-Instanz.

Beispiele

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display how many blue objects are detected
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    Brain.Screen.print("Object Count: %d", Vision1.objectCount);

    wait(0.5, seconds);
  }
}

objects#

objects ist ein Array, das die erkannten Objekte aus dem letzten Aufruf von takeSnapshot enthält.

Jedes Element im Array repräsentiert ein erkanntes Objekt und ermöglicht den Zugriff auf dessen Eigenschaften, wie z. B. width, height, centerX und mehr.

Die Objekte sind von der größten zur kleinsten (nach Breite) geordnet, beginnend mit dem Index 0.

Syntax
VisionSensor.objects[index].property

Components

Komponente

Beschreibung

VisionSensor

Der Name Ihrer Vision Sensor-Instanz.

index

Der Objektindex im Array. Die Indexzählung beginnt bei 0.

property

Eine der verfügbaren Objekteigenschaften.

.exists#

.exists gibt zurück, ob der angegebene Objektindex ein gültig erkanntes Objekt enthält.

Zugriff

SensorName.objects[index].exists

Rückgabewerte

Gibt einen booleschen Wert zurück, der angibt, ob der angegebene Objektindex ein gültiges erkanntes Objekt enthält:

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Beispiele

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

.Breite#

.width gibt die Breite des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].width

Rückgabewerte

Gibt einen int zurück, der die Breite des erkannten Objekts in Pixeln darstellt. Der Wertbereich liegt zwischen 1 und 316.

Beispiele

// Approach an object until it's at least 100 pixels wide
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists && Vision1.objects[0].width < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);
}

.Höhe#

.height gibt die Höhe des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].height

Rückgabewerte

Gibt einen int zurück, der die Höhe des erkannten Objekts in Pixeln darstellt. Der Wertbereich liegt zwischen 1 und 212.

Beispiele

// Approach an object until it's at least 100 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists && Vision1.objects[0].height < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);  // Avoid over-processing
}

.centerX#

.centerX gibt die x-Koordinate des Mittelpunkts des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].centerX

Rückgabewerte

Gibt einen int Wert zurück, der die x-Koordinate des Objektmittelpunkts in Pixeln darstellt. Der Wertbereich liegt zwischen 0 und 316.

Beispiele

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    int centerX = Vision1.largestObject.centerX;
    if (140 < centerX && centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}

.centerY#

.centerY gibt die y-Koordinate des Mittelpunkts des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].centerY

Rückgabewerte

Gibt einen int zurück, der die y-Koordinate des Objektmittelpunkts in Pixeln darstellt. Der Wertbereich liegt zwischen 0 und 212.

Beispiele

// Approach an object until it's at least 90 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].centerY < 90) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.originX#

.originX gibt die x-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].originX

Rückgabewerte

Gibt einen int zurück, der die x-Koordinate der oberen linken Ecke des Begrenzungsrahmens des Objekts in Pixeln darstellt. Der Wertbereich liegt zwischen 0 und 316.

Beispiele

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originX < 160) {
      Brain.Screen.print("To the left!");
    }
    else {
      Brain.Screen.print("To the right!");
    }
  }
  wait(0.5, seconds); 
}

.originY#

.originY gibt die y-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts zurück.

Zugriff

SensorName.objects[index].originY

Rückgabewerte

Gibt einen int zurück, der die y-Koordinate der oberen linken Ecke des Begrenzungsrahmens des Objekts in Pixeln darstellt. Der Wertbereich liegt zwischen 0 und 212.

Beispiele

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originY < 80) {
      Brain.Screen.print("Far");
    } else {
      Brain.Screen.print("Close");
    }
  }
  wait(0.5, seconds);
}

.Winkel#

.angle gibt die Ausrichtung des erkannten Farbcodes zurück.

Zugriff

SensorName.objects[index].angle

Rückgabewerte

Gibt einen Wert vom Typ double zurück, der die Ausrichtung des erkannten Farbcodes in Grad angibt. Der Wertbereich liegt zwischen 0 und 359.9.

Beispiele

// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
  Vision1.takeSnapshot(Vision1__BOXCODE);
  if (Vision1.objects[0].exists) {
    double angle = Vision1.objects[0].angle;
    if (70 < angle && angle < 110) {
      Drivetrain.turnFor(right, 45, degrees);
    }
    else if (250 < angle && angle < 290) {
      Drivetrain.turnFor(left, 45, degrees);
    }
    else {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}