Czujnik wizji#

Wstęp#

Klasa wizji vision służy do sterowania i dostępu do danych z czujnika wizyjnego IQ (2. generacji). Czujnik ten wykrywa i śledzi sygnatury kolorów w swoim polu widzenia, umożliwiając robotowi identyfikację celów i reagowanie na informacje wizualne w czasie rzeczywistym.

Czujnik wizyjny może wykrywać wiele obiektów jednocześnie i dostarcza informacji, takich jak położenie obiektu, jego szerokość, wysokość i współrzędne środka.

Konstruktory klas#

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

Destruktor klasy#

Niszczy obiekt o wizji vision i uwalnia powiązane zasoby.

~vision();

Parametry#

Parametr

Typ

Opis

index

int32_t

Inteligentny port, do którego podłączony jest czujnik wizyjny, zapisany jako PORTx, gdzie x to numer portu (na przykład PORT1).

bright

uint8_t

Poziom jasności czujnika wizyjnego.

sigs

vision::signature or vision::code objects

Jeden lub więcej obiektów vision::signature lub vision::code do zarejestrowania w czujniku.

Przykłady#

// 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

Funkcje członkowskie#

Klasa wizji vision zawiera następujące funkcje członkowskie:

  • takeSnapshot — Przechwytuje dane dla określonego podpisu koloru lub kodu koloru.

  • zainstalowanoinstalled — Czy czujnik wizyjny jest podłączony do mózgu IQ (2. generacji).

Aby uzyskać dostęp do danych wykrytego obiektu po wywołaniu takeSnapshot, należy użyć dostępnych Właściwości.

Przed wywołaniem jakiejkolwiek funkcji członkowskiej wizji vision należy utworzyć instancję wizji vision , jak pokazano poniżej:

/* 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#

Przechwytuje obraz z czujnika wizyjnego, przetwarza go na podstawie sygnatury i aktualizuje tablicę objects Ta metoda może również ograniczyć liczbę obiektów przechwyconych w migawce.

Tablica objects przechowuje obiekty uporządkowane według szerokości od największego do najmniejszego, zaczynając od indeksu 0. Dostęp do właściwości każdego obiektu można uzyskać za pomocą jego indeksu. Jeśli nie zostaną wykryte żadne pasujące obiekty, objectCount będzie równe 0, a objects[i].exists będzie równe false.

Available Functions

1 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego identyfikatora podpisu.

int32_t takeSnapshot( uint32_t id );

2 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego obiektu vision::code o kodzie .

int32_t takeSnapshot( code &cc );

3 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego obiektu vision::signature

int32_t takeSnapshot( signature &sig );

4 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do identyfikatora podpisu.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do określonego obiektu vision::code o kodzie .

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do vision::signature.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parametr

Typ

Opis

id

uint32_t

Numer identyfikacyjny podpisu, którego należy szukać.

cc

code &

Odwołanie do obiektu vision::code o wartości , który należy wyszukać.

sig

signature &

Odwołanie do obiektu vision::signature o wartości , który należy wyszukać.

count

uint32_t

Maksymalna liczba obiektów do wykrycia.

Return Values

Zwraca wartość int32_t reprezentującą liczbę wykrytych pasujących obiektów.

Notes
  • Czujnik wizyjny musi wykonać migawkę, zanim będzie można uzyskać dostęp do danych obiektu.

  • Jeśli określono wartość count , przechowywane są tylko największe wykryte obiekty (do określonej liczby).

Przykładów

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#

Zwraca informację, czy czujnik wizyjny jest podłączony do mózgu IQ (2. generacja).

Available Functions
bool installed();

Parameters

Funkcja ta nie przyjmuje żadnych parametrów.

Return Values

Zwraca wartość logiczną wskazującą, czy czujnik wizyjny jest podłączony:

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

Właściwości#

Wywołanie funkcji takeSnapshot aktualizuje wyniki detekcji czujnika wizyjnego. Każda migawka odświeża tablicę objects , która zawiera wykryte obiekty dla żądanego podpisu koloru lub kodu koloru.

Dostęp do danych czujnika wizyjnego uzyskuje się poprzez właściwości obiektów zapisanych w Vision1.objects[index], gdzie indeks index zaczyna się od 0.

Rozdzielczość obrazu czujnika wizyjnego wynosi 316 na 212 pikseli. Położenie i rozmiar obiektu są podawane w pikselach względem bieżącego widoku czujnika.

Dostępne są następujące właściwości:

  • largestObject — Wybiera największy wykryty obiekt z ostatniej migawki.

  • objectCount — Zwraca liczbę prawidłowych obiektów zapisanych w objects.

  • objects — Tablica wykrytych obiektów zaktualizowana przez takeSnapshot.

  • .exists — Czy wpis obiektu zawiera prawidłowe dane.

  • .width — Szerokość wykrytego obiektu w pikselach.

  • .height — Wysokość wykrytego obiektu w pikselach.

  • .centerX — Pozycja X środka obiektu w pikselach.

  • .centerY — Pozycja Y środka obiektu w pikselach.

  • .originX — Pozycja X lewego górnego rogu obiektu w pikselach.

  • .originY — Pozycja Y lewego górnego rogu obiektu w pikselach.

  • .angle — Orientacja wykrytego kodu koloru w stopniach (jeśli ma zastosowanie).

largestObject#

Pobiera największy wykryty obiekt z tablicy objects.

Tę metodę można stosować zawsze w celu uzyskania największego obiektu spośród objects bez konieczności określania indeksu.

Syntax
VisionSensor.largestObject

Components

Część

Opis

VisionSensor

Nazwa Twojej instancji czujnika wizyjnego.

Przykładów

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#

Zwraca liczbę elementów znajdujących się w tablicy objects jako liczbę całkowitą.

Syntax
VisionSensor.objectCount

Components

Część

Opis

VisionSensor

Nazwa Twojej instancji czujnika wizyjnego.

Przykładów

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 to tablica zawierająca wykryte obiekty z ostatniego wywołania takeSnapshot.

Każdy element w tablicy reprezentuje wykryty obiekt i zapewnia dostęp do jego właściwości, takich jak width, height, centerX i inne.

Obiekty są uporządkowane od największego do najmniejszego (według szerokości), zaczynając od indeksu 0.

Syntax
VisionSensor.objects[index].property

Components

Część

Opis

VisionSensor

Nazwa Twojej instancji czujnika wizyjnego.

index

Indeks obiektu w tablicy. Indeks zaczyna się od 0.

property

Jedna z dostępnych właściwości obiektu.

.istnieje#

.exists zwraca informację, czy określony indeks obiektu zawiera prawidłowy wykryty obiekt.

Dostęp

SensorName.objects[index].exists

wartości zwracanych

Zwraca wartość logiczną wskazującą, czy określony indeks obiektu zawiera prawidłowy wykryty obiekt:

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

Przykładów

// 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); 
}

.szerokość#

.width zwraca szerokość wykrytego obiektu.

Dostęp

SensorName.objects[index].width

wartości zwracanych

Zwraca wartość int int reprezentującą szerokość wykrytego obiektu w pikselach. Zakres wartości wynosi od 1 do 316.

Przykładów

// 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);
}

.wysokość#

.height zwraca wysokość wykrytego obiektu.

Dostęp

SensorName.objects[index].height

wartości zwracanych

Zwraca wartość int int reprezentującą wysokość wykrytego obiektu w pikselach. Zakres wartości wynosi od 1 do 212.

Przykładów

// 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 zwraca współrzędną x środka wykrytego obiektu.

Dostęp

SensorName.objects[index].centerX

wartości zwracanych

Zwraca wartość typu int int reprezentującą współrzędną x środka obiektu w pikselach. Zakres wartości wynosi od 0 do 316.

Przykładów

// 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 zwraca współrzędną y środka wykrytego obiektu.

Dostęp

SensorName.objects[index].centerY

wartości zwracanych

Zwraca wartość int int reprezentującą współrzędną y środka obiektu w pikselach. Zakres wartości wynosi od 0 do 212.

Przykładów

// 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 zwraca współrzędną x lewego górnego rogu pola ograniczającego wykryty obiekt.

Dostęp

SensorName.objects[index].originX

wartości zwracanych

Zwraca wartość int int reprezentującą współrzędną x lewego górnego rogu pola ograniczającego obiekt w pikselach. Zakres wartości wynosi od 0 do 316.

Przykładów

// 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 zwraca współrzędną y lewego górnego rogu pola ograniczającego wykryty obiekt.

Dostęp

SensorName.objects[index].originY

wartości zwracanych

Zwraca wartość int int reprezentującą współrzędną y lewego górnego rogu pola ograniczającego obiekt w pikselach. Zakres wartości wynosi od 0 do 212.

Przykładów

// 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);
}

.kąt#

.angle zwraca orientację wykrytego kodu koloru.

Dostęp

SensorName.objects[index].angle

wartości zwracanych

Zwraca wartość double reprezentującą orientację wykrytego kodu koloru w stopniach. Zakres wartości wynosi od 0 do 359.9.

Przykładów

// 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);
}