Czujnik wizyjny AI#

Wstęp#

Klasa aivision służy do sterowania i dostępu do danych z czujnika wizyjnego AI EXP. Czujnik wizyjny AI może wykrywać:

  • Klasyfikacje sztucznej inteligencji (takie jak obiekty gry)

  • Identyfikatory AprilTag

  • Niestandardowe sygnatury kolorów

  • Niestandardowe kody kolorów

Dostarcza danych o obiekcie, w tym jego położenie, rozmiar, orientację, identyfikator klasyfikacji i wynik wiarygodności.

Czujnik przetwarza informacje wizualne za pomocą wbudowanego modelu sztucznej inteligencji (AI) wybranego w programie AI Vision Utility w VEXcode. Wybrany model określa klasyfikacje sztucznej inteligencji (AI), które czujnik może wykryć. W przypadku korzystania z VS Code, model sztucznej inteligencji musi zostać najpierw skonfigurowany w VEXcode, zanim będzie można go użyć w programie. Wykryte obiekty są zwracane za pośrednictwem tablicy objects po wywołaniu takeSnapshot.

Konstruktory klas#

aivision(
  int32_t index,
  Args&... sigs );

Parametry#

Parametr

Typ

Opis

index

int32_t

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

sigs

colordesc, codedesc, or AI constants

Jeden lub więcej typów wykrywania do zarejestrowania w czujniku:

  • aivision::ALL_AIOBJS — wszystkie klasyfikacje AI
  • aivision::ALL_TAGS — wszystkie identyfikatory AprilTag
  • aivision::colordesc — niestandardowy podpis koloru
  • aivision::codedesc — niestandardowy kod koloru

Modele i klasyfikacje sztucznej inteligencji#

Czujnik wizyjny AI może wykrywać różne obiekty z określonymi klasyfikacjami AI. W zależności od modelu klasyfikacji AI wybranego podczas konfiguracji czujnika wizyjnego AI w oknie Urządzenia, możliwe jest wykrywanie różnych obiektów. Obecnie dostępne są następujące modele:

Elementy klasowe

Numer identyfikacyjny

Klasyfikacja AI

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

Konkurs robotyki VEX V5 o wysoką stawkę

Numer identyfikacyjny

Klasyfikacja AI

0

mobileGoal

1

redRing

2

blueRing

Odrzucenie konkursu robotycznego VEX V5

Numer identyfikacyjny

Klasyfikacja AI

0

blueBlock

1

redBlock

Zawody robotyczne VEX V5 Override

Numer identyfikacyjny

Klasyfikacja AI

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

Przykłady#

// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT11,                  // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

Funkcje członkowskie#

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

  • takeSnapshot — Przechwytuje dane dla określonego podpisu koloru, kodu koloru, grupy klasyfikacji AI lub grupy identyfikatorów AprilTag.

  • zainstalowanoinstalled — Zwraca informację, czy czujnik wizyjny AI jest podłączony do mózgu EXP.

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 aivision należy utworzyć instancję aivision , jak pokazano poniżej:

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


// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT1,                   // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

takeSnapshot#

Przechwytuje obraz z czujnika AI Vision, przetwarza go przy użyciu wybranego modelu AI lub skonfigurowanych sygnatur kolorów i aktualizuje tablicę objects.

Każde wywołanie odświeża tablicę objects najnowszymi wynikami detekcji. Obiekty są sortowane od największego do najmniejszego (według szerokości), zaczynając od indeksu 0. Jeśli nie wykryto żadnych obiektów objectCount będzie równe 0 , a objects[i].exists będzie false.

1 — Wykonuje migawkę przy użyciu identyfikatora obiektu i typu obiektu.

int32_t takeSnapshot(
  uint32_t id,
  objectType type,
  uint32_t count );

2 — Wykonuje migawkę przy użyciu Podpisu koloru.

int32_t takeSnapshot(
  const colordesc &desc,
  int32_t count = 8 );

3 — Wykonuje migawkę przy użyciu Kodu koloru.

int32_t takeSnapshot(
  const codedesc &desc,
  int32_t count = 8 );

4 — Wykonuje migawkę przy użyciu AprilTag ID.

int32_t takeSnapshot(
  const tagdesc &desc,
  int32_t count = 8 );

5 — Wykonuje migawkę przy użyciu klasyfikacji AI.

int32_t takeSnapshot(
  const aiobjdesc &desc,
  int32_t count = 8 );

6 — Wykonuje migawkę przy użyciu deskryptora obiektu.

int32_t takeSnapshot(
  const objdesc &desc,
  int32_t count = 8 );

Parameters

Parametr

Typ

Opis

id

uint32_t

Identyfikator obiektu do wykrycia podczas używania funkcji (id, type, count) Znaczenie zależy od type:

  • colorObject — indeks deskryptora koloru (1–7)
  • codeObject — indeks kodu koloru (1–8)
  • modelObject — identyfikator klasyfikacji AI
  • tagObject — identyfikator AprilTag (0–36)

Uwaga: W VEXcode nazwy klasyfikacji AI (takie jak blueBall) mogą być używane bezpośrednio. W VS Code należy użyć numerycznego identyfikatora.

type

objectType

Określa kategorię obiektu powiązanego z id:

  • objectType::tagObject — Wykrywa identyfikatory AprilTag
  • objectType::colorObject — Wykrywa sygnatury kolorów
  • objectType::codeObject — Wykrywa kody kolorów
  • objectType::modelObject — Wykrywa klasyfikacje AI
  • objectType::allObject — Wykrywa wszystko, co czujnik może rozpoznać

desc

colordesc &, codedesc &, tagdesc &, aiobjdesc &, or objdesc &

Deskryptor służący do wykrywania konkretnego obiektu. Przekazywany bezpośrednio do takeSnapshot, na przykład:

  • AIVision1.takeSnapshot(AIVision1__greenBox);
  • AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
Wstępnie zdefiniowane stałe deskryptora:
  • aivision::ALL_TAGS — Wykrywa wszystkie identyfikatory AprilTag
  • aivision::ALL_COLORS — Wykrywa wszystkie skonfigurowane Sygnatury kolorów
  • aivision::ALL_CODES — Wykrywa wszystkie skonfigurowane Kody kolorów
  • aivision::ALL_AIOBJS — Wykrywa wszystkie Klasyfikacje AI
  • aivision::ALL_OBJECTS — Wykrywa wszystko, co czujnik może rozpoznać

count

uint32_t / int32_t

Maksymalna liczba obiektów zapisanych ze migawki. Domyślnie 8.

wartości zwracanych

Zwraca wartość int32_t reprezentującą liczbę wykrytych obiektów pasujących do określonego podpisu lub typu wykrycia.

Notatki

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

  • Tablica objects jest odświeżana przy każdym wywołaniu.

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

Klasyfikacje AI zależą od modelu wybranego w narzędziu AI Vision Utility w VEXcode.

Przykładów

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

installed#

Zwraca informację, czy czujnik AI Vision jest podłączony do mózgu EXP.

Dostępne funkcje

bool installed();

Parametry

Funkcja ta nie przyjmuje żadnych parametrów.

wartości zwracanych

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

  • true — Czujnik AI Vision jest podłączony.

  • false — Czujnik AI Vision nie jest podłączony.

// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
  Brain.Screen.print("Installed!");
}

Właściwości#

Wywołanie funkcji takeSnapshot aktualizuje wyniki detekcji czujnika AI Vision. Każda migawka odświeża tablicę objects , która zawiera wykryte obiekty dla żądanej klasyfikacji AI, sygnatury koloru, kodu koloru lub identyfikatora AprilTag.

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

Obiekty są uporządkowane od największego do najmniejszego (według powierzchni).

Rozdzielczość obrazu czujnika AI Vision wynosi 320 × 240 pikseli. Wartości położenia i rozmiaru obiektu są podawane w jednostkach pikseli względem bieżącego widoku czujnika.

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

  • objectCount — Zwraca liczbę wykrytych obiektów z ostatniej migawki.

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

  • objects — Tablica zawierająca wykryte obiekty zaktualizowane 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 kodu koloru lub identyfikatora AprilTag w stopniach.

  • .id — ID klasyfikacji lub ID AprilTag.

  • .score — Wskaźnik pewności dla klasyfikacji AI.

objectCount#

objectCount zwraca liczbę elementów wewnątrz tablicy objects jako liczbę całkowitą.

Syntax
AIVisionSensor.objectCount

Components

Część

Opis

AIVisionSensor

Nazwa Twojej instancji czujnika AI Vision.

Przykładów

// Display the number of detected objects
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.objectCount);
  }
  wait(50, msec);
}

largestObject#

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
AIVisionSensor.largestObject

Components

Część

Opis

AIVisionSensor

Nazwa Twojej instancji czujnika AI Vision.

Przykładów

// Display the closest AprilTag ID
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.largestObject.id);
  }
  wait(50, msec);
}

objects#

objects zwraca tablicę wykrytych właściwości obiektów. Użyj tablicy, aby uzyskać dostęp do konkretnych wartości właściwości poszczególnych obiektów.

Istnieje dziesięć właściwości, które są uwzględniane w każdym obiekcie przechowywanym w tablicy objects po użyciu takeSnapshot.

Wszystkie wartości właściwości, z wyjątkiem id i score opisują położenie i rozmiar wykrytego obiektu w polu widzenia czujnika AI Vision w momencie użycia funkcji takeSnapshot Wartości te są mierzone w pikselach, w oparciu o rozdzielczość czujnika wynoszącą 320 na 240 pikseli.

Syntax
AIVisionSensor.objects[index].property

Components

Część

Opis

AIVisionSensor

Nazwa Twojej instancji czujnika AI Vision.

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

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

.szerokość#

.width zwraca szerokość wykrytego obiektu.

Dostęp

SensorName.objects[index].width

wartości zwracanych

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

Przykładów

// Approach an object until it's at least 100 pixels wide
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].width < 100) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.wysokość#

.height zwraca wysokość wykrytego obiektu.

Dostęp

SensorName.objects[index].height

wartości zwracanych

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

Przykładów

// Approach an object until it's at least 90 pixels tall
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

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

.centerX#

.centerX zwraca współrzędną x środka wykrytego obiektu.

Dostęp

SensorName.objects[index].centerX

wartości zwracanych

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

Przykładów

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].centerX > 140 && AIVision1.objects[0].centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(10, msec);
}

.centerY#

.centerY zwraca współrzędną y środka wykrytego obiektu.

Dostęp

SensorName.objects[index].centerY

wartości zwracanych

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

Przykładów

// Approach an object until it's close to the sensor
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

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

.kąt#

.angle zwraca orientację wykrytego kodu koloru lub identyfikatora AprilTag.

Dostęp

SensorName.objects[index].angle

wartości zwracanych

Zwraca wartość zmiennoprzecinkową float reprezentującą obrót wykrytego kodu koloru lub identyfikatora AprilTag 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) {
  AIVision1.takeSnapshot(AIVision1__redBlue);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].angle > 50 && AIVision1.objects[0].angle < 100) {
      Drivetrain.turn(right);
    }
    else if (AIVision1.objects[0].angle > 270 && AIVision1.objects[0].angle < 330) {
      Drivetrain.turn(left);
    }
    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ść int16_t int16_t reprezentującą współrzędną x początku pola ograniczającego obiektu w pikselach. Zakres wartości wynosi od 0 do 320.

Przykładów

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.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 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ść int16_t int16_t reprezentującą współrzędną y początku pola ograniczającego obiektu w pikselach. Zakres wartości wynosi od 0 do 240.

Przykładów

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].originY < 110) {
      Brain.Screen.print("Close");
    } else {
      Brain.Screen.print("Far");
    }
  }
  wait(100, msec);
}

.id#

.id zwraca wykryty identyfikator AprilTag lub identyfikator klasyfikacji AI.

Dostęp

SensorName.objects[index].id

wartości zwracanych

Zwraca wartość int32_t reprezentującą identyfikator wykrytego obiektu:

  • W przypadku klasyfikacji AI odpowiada to identyfikatorowi zdefiniowanemu przez wybrany model AI.

  • W przypadku identyfikatorów AprilTag oznacza to wykryty numer identyfikatora AprilTag (0–36).

Przykładów

// Move forward when AprilTag ID 1 is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].id == 1) {
      Drivetrain.drive(forward);
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.wynik#

.score zwraca wynik pewności wykrytej klasyfikacji sztucznej inteligencji.

Dostęp

SensorName.objects[index].score

wartości zwracanych

Zwraca int16_t oznaczającą wynik ufności wykrytej klasyfikacji AI w zakresie od 1 do 100.

Niższy wynik oznacza, że ​​czujnik ma mniejszą pewność co do wykrytego obiektu, natomiast wyższy wynik oznacza, że ​​czujnik ma większą pewność.

Przykładów

// Display if a score is confident
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    Brain.screen.clearScreen();
    Brain.screen.setCursor(1, 1);

    if (AIVision1.objects[0].score > 95) {
      Brain.Screen.print("Confident");
    } else {
      Brain.Screen.print("Not confident");
    }
  }
  wait(50, msec);
}