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 |
|---|---|---|
|
|
Inteligentny port, do którego podłączony jest czujnik AI Vision, zapisany jako |
|
|
Jeden lub więcej typów wykrywania do zarejestrowania w czujniku:
|
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 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
Konkurs robotyki VEX V5 o wysoką stawkę
Numer identyfikacyjny |
Klasyfikacja AI |
|---|---|
0 |
|
1 |
|
2 |
|
Odrzucenie konkursu robotycznego VEX V5
Numer identyfikacyjny |
Klasyfikacja AI |
|---|---|
0 |
|
1 |
|
Zawody robotyczne VEX V5 Override
Numer identyfikacyjny |
Klasyfikacja AI |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
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.zainstalowano
installed— 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 );
Parameters6 — Wykonuje migawkę przy użyciu deskryptora obiektu.
int32_t takeSnapshot( const objdesc &desc, int32_t count = 8 );
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Identyfikator obiektu do wykrycia podczas używania funkcji
Uwaga: W VEXcode nazwy klasyfikacji AI (takie jak blueBall) mogą być używane bezpośrednio. W VS Code należy użyć numerycznego identyfikatora. |
|
|
Określa kategorię obiektu powiązanego z
|
|
|
Deskryptor służący do wykrywania konkretnego obiektu. Przekazywany bezpośrednio do
|
|
|
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
objectsjest 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 przeztakeSnapshot..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ą.
AIVisionSensor.objectCount
Część |
Opis |
|---|---|
|
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.
AIVisionSensor.largestObject
Część |
Opis |
|---|---|
|
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.
AIVisionSensor.objects[index].property
Część |
Opis |
|---|---|
|
Nazwa Twojej instancji czujnika AI Vision. |
|
Indeks obiektu w tablicy. Indeks zaczyna się od |
|
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);
}
