Czujnik wizyjny AI#

Wstęp#

Czujnik wizyjny IQ AI potrafi wykrywać i śledzić obiekty, kolory oraz identyfikatory AprilTag. Dzięki temu robot może analizować otoczenie, śledzić obiekty i reagować na podstawie wykrytych danych wizualnych.

W poniższych przykładach skonfigurowany czujnik IQ AI Vision będzie nosił nazwę ai_vision_1, a skonfigurowane obiekty Color Signature, takie jak RED_BOX, będą używane we wszystkich kolejnych przykładach w tej dokumentacji API podczas odwoływania się do metod klasy AiVision.

Poniżej znajduje się lista wszystkich metod:

Getters — pobiera dane z czujnika IQ AI Vision.

Właściwości — dane obiektu zwrócone z take_snapshot.

  • .exists — Czy obiekt istnieje w bieżącym wykryciu.

  • .width — Szerokość wykrytego obiektu.

  • .height — Wysokość wykrytego obiektu.

  • .centerX — Pozycja X środka obiektu.

  • .centerY — Pozycja Y środka obiektu.

  • .angle — Orientacja kodu koloru lub identyfikatora AprilTag.

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

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

  • .id — Klasyfikacja lub identyfikator tagu obiektu.

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

Konstruktory — ręczna inicjalizacja i konfiguracja czujników.

Getters#

take_snapshot#

take_snapshot filtruje dane z ramki czujnika IQ AI Vision do pojedynczego podpisu — zapisanego opisu czegoś, co czujnik może rozpoznać, na przykład wstępnie wyszkolonego obiektu, identyfikatora AprilTag lub skonfigurowanego podpisu koloru lub kodu koloru — i zwraca krotkę.

Aby można było używać tej metody, najpierw należy skonfigurować Sygnatury kolorów i Kody kolorów w narzędziu Vision Utility.

Krotka przechowuje obiekty uporządkowane od największego do najmniejszego według szerokości, zaczynając od indeksu 0. Dostęp do właściwości każdego obiektu jest możliwy za pomocą jego indeksu. Jeśli nie zostaną wykryte żadne pasujące obiekty, zwracana jest pusta krotka.

Usage:
ai_vision_1.take_snapshot(SIGNATURE)

Parametry

Opis

SIGNATURE

Filtruje zbiór danych, aby zawierał tylko dane o podanym podpisie. Dostępne są następujące podpisy:

  • Sygnatury kolorów lub kody kolorów – nazwa czujnika IQ AI Vision, dwa podkreślenia, a następnie nazwa podpisu koloru lub kodu koloru. Na przykład: ai_vision_1__RED_BOX.
  • AiVision.ALL_AIOBJS – wszystkie wykryte klasyfikacje AI w zależności od modelu skonfigurowanego w narzędziu AI Vision Utility.
  • AiVision.ALL_TAGS – wszystkie identyfikatory AprilTag.

count

Opcjonalnie. Ustawia maksymalną liczbę obiektów, które można zwrócić, od 1 do 24 (domyślnie: 8).

# Move forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    wait(50, MSEC)

Uwaga: Zwróconą krotkę można posortować według dowolnej właściwości, nie tylko szerokości, za pomocą funkcji Pythona sorted Na przykład sortowanie według identyfikatora AprilTag:

# Print each detected AprilTag ID in ascending order by ID
while True:
    apriltags = sorted(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=id)
    for tag in apriltags:
        print(tag.id)
    wait(1, SECONDS)

Lub sortowanie według wzrostu:

# Print each detected AprilTag ID in ascending order by height
while True:
    apriltags_by_height = sorted(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=lambda tag: tag.height)
    for tag in apriltags_by_height:
        print(tag.height)
    wait(1, SECONDS)

Klasyfikacje AI#

Czujnik wizyjny AI IQ może wykrywać różne obiekty w ramach określonych klasyfikacji AI. W zależności od modelu klasyfikacji AI wybranego podczas konfiguracji czujnika wizyjnego AI w oknie Urządzenia, wykrywane będą różne obiekty. Obecnie dostępne modele to:

Obiekty klasowe

Numer identyfikacyjny

Klasyfikacja AI

0

ClassroomElements.BLUE_BALL

1

ClassroomElements.GREEN_BALL

2

ClassroomElements.RED_BALL

3

ClassroomElements.BLUE_RING

4

ClassroomElements.GREEN_RING

5

ClassroomElements.RED_RING

6

ClassroomElements.BLUE_CUBE

7

ClassroomElements.GREEN_CUBE

8

ClassroomElements.RED_CUBE

Konkurs robotyki VEX IQ Mix & Match

Numer identyfikacyjny

Klasyfikacja AI

0

GameElementsMixAndMatch.BEAM

1

GameElementsMixAndMatch.BLUE_PIN

2

GameElementsMixAndMatch.RED_PIN

3

GameElementsMixAndMatch.ORANGE_PIN

Wzrost poziomu konkursu robotyki VEX IQ

Numer identyfikacyjny

Klasyfikacja AI

0

GameElementsLevelUp.BLUE_BEANBAG

1

GameElementsLevelUp.RED_BEANBAG

2

GameElementsLevelUp.YELLOW_BEANBAG

Sygnatury kolorów#

Sygnatura koloru to unikalny kolor, który czujnik wizyjny IQ AI potrafi rozpoznać. Sygnatury te umożliwiają czujnikowi wizyjnemu IQ AI wykrywanie i śledzenie obiektów na podstawie ich koloru. Po skonfigurowaniu Sygnatury koloru czujnik może identyfikować obiekty o tym kolorze w swoim polu widzenia. Sygnatury kolorów są używane z funkcją take_snapshot do przetwarzania i wykrywania kolorowych obiektów w czasie rzeczywistym.

Aby użyć skonfigurowanego podpisu koloru w projekcie, jego nazwa musi być nazwą czujnika, dwoma znakami podkreślenia, a następnie nazwą podpisu koloru. Na przykład: ai_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 = ai_vision_1.take_snapshot(ai_vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color detected!")
        wait(100, MSEC)

Kody kolorów#

Kod koloru to uporządkowany wzór składający się z sygnatur kolorów ułożonych w określonej kolejności. Kody te pozwalają czujnikowi wizyjnemu IQ AI rozpoznawać predefiniowane wzorce kolorów. Kody kolorów są przydatne do identyfikacji złożonych obiektów lub tworzenia unikalnych znaczników do autonomicznej nawigacji.

Aby użyć skonfigurowanego kodu koloru w projekcie, jego nazwa musi być nazwą czujnika, dwoma znakami podkreślenia, a następnie nazwą kodu koloru. Na przykład: ai_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 = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)

installed#

installed zwraca wartość logiczną wskazującą, czy czujnik IQ AI Vision jest obecnie połączony z mózgiem IQ (2. generacji).

  • True — Czujnik wizyjny IQ AI jest połączony z mózgiem IQ (2. generacji).

  • False — Czujnik wizyjny IQ AI nie jest połączony z mózgiem IQ (2. generacji).

Usage:
ai_vision_1.installed()

Parametry

Opis

Ta metoda nie ma żadnych parametrów.

# Display a message if the AI Vision Sensor is connected
if ai_vision_1.installed():
    brain.screen.print("Installed!")

Właściwości#

Każdy obiekt przechowywany w krotce zawiera dziesięć właściwości po użyciu take_snapshot.

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 IQ AI Vision w momencie użycia polecenia take_snapshot Wartości te są mierzone w pikselach, w oparciu o rozdzielczość czujnika wynoszącą 320 na 240 pikseli.

.exists#

.exists zwraca wartość logiczną wskazującą, czy indeks istnieje w krotce, czy nie.

  • True — Indeks istnieje.

  • False — Indeks nie istnieje.

# Check if at least two objects are detected
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[1].exists:
            brain.screen.print("At least 2")

        else:
            brain.screen.print("Less than 2")
    wait(50, MSEC)

.width#

.width zwraca szerokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 320.

# Approach an object until it's at least 100 pixels wide
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].width < 100:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.height#

.height zwraca wysokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 240.

# Approach an object until it's at least 90 pixels tall
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].height < 90:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.centerX#

.centerX zwraca współrzędną x środka wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 0 do 320.

# Turn until an object is directly in front of the sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 140 < objects[0].centerX < 180:
            drivetrain.stop()
    wait(10,MSEC)

.centerY#

.centerY zwraca współrzędną y środka wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 0 do 240.

# Approach an object until the object's center is
# high enough in the field of view
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].centerY < 150:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.angle#

.angle zwraca orientację wykrytego kodu koloru lub identyfikatora AprilTag w stopniach, która jest liczbą całkowitą z przedziału od 0 do 359.

# Turn left or right depending on how a
# configured Color Code is rotated
while True:
    box_code = ai_vision_1.take_snapshot(ai_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 zwraca współrzędną x lewego górnego rogu ograniczającego pole wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 320.

# Display if an object is to the left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 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 ograniczającego pola wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 240.

# Display if an object is close or far
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originY < 110:
            brain.screen.print("Close")
        else:
            brain.screen.print("Far")

.id#

.id zwraca identyfikator wykrytej klasyfikacji AI lub identyfikator AprilTag jako liczbę całkowitą. Klasyfikacje AI zależą od modelu skonfigurowanego w narzędziu AI Vision Utility.

W przypadku identyfikatora AprilTag właściwość .id reprezentuje wykryty numer identyfikatora AprilTag z zakresu od 0 do 36. W przypadku klasyfikacji AI właściwość .id odpowiada wstępnie zdefiniowanemu identyfikatorowi w sekcji Klasyfikacje AI.

# Move forward when AprilTag ID 1 is detected
while True:
    apriltags = ai_vision_1.take_snapshot(AiVision.ALL_TAGS)

    if apriltags[0].exists:
        if apriltags[0].id == 1:
            robot.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.score#

.score zwraca wynik pewności wykrytej klasyfikacji sztucznej inteligencji jako liczbę całkowitą 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ść.

# Display if a score is confident
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    if objects[0].exists:
        if objects[0].score > 95:
            brain.screen.print("Confident")
    else:
        brain.screen.print("Not confident")

    wait(50, MSEC)

Konstruktorzy#

Konstruktory służą do ręcznego tworzenia obiektów AiVision, Colordesc, i Codedesc , które są niezbędne do konfiguracji czujnika IQ AI Vision poza VEXcode.

AI Vision Sensor#

AiVision tworzy czujnik wizyjny IQ AI.

Stosowanie

Vision(port, sigs)

Parametry

Opis

port

Do którego inteligentnego portu podłączony jest czujnik IQ AI Vision (od 1 do 12).

sigs

Opcjonalnie. Nazwa jednego lub większej liczby podpisów:

  • Podpis koloru
  • Kod koloru
  • AiVision.ALL_TAGS – Wszystkie identyfikatory AprilTag
  • AiVision.ALL_AIOBJS – Wszystkie klasyfikacje AI

Przykład

ai_vision_1 = AiVision(Ports.PORT1, AiVision.ALL_AIOBJS)

# Move forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    wait(50, MSEC)

Color Signature#

Colordesc tworzy sygnaturę kolorów. Na czujniku IQ AI Vision można zapisać jednocześnie do siedmiu różnych sygnatur kolorów.

Stosowanie:

Colordesc(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

Parametr

Opis

index

Indeks obiektu Colordesc od 1 do 7. Uwaga: Utworzenie dwóch obiektów Colordesc z tym samym numerem indeksu spowoduje, że obiekt utworzony jako drugi nadpisze pierwszy.

uMin

Wartość od uMin w narzędziu Vision Utility.

uMax

Wartość od uMax w narzędziu Vision Utility.

uMean

Wartość od uMean w narzędziu Vision Utility.

vMin

Wartość od vMin w narzędziu Vision Utility.

vMax

Wartość od vMax w narzędziu Vision Utility.

vMean

Wartość od vMean w narzędziu Vision Utility.

rgb

Wartość od rgb w narzędziu Vision Utility.

type

Wartość z type w narzędziu Vision Utility.

Aby uzyskać wartości potrzebne do utworzenia podpisu koloru, przejdź do Narzędzia Vision. Po skonfigurowaniu podpisu koloru skopiuj wartości parametrów z okna konfiguracji.

Przykład

# Create a new Signature RED_BOX with the Colordesc class
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX Signature.
ai_vision_1 = AiVision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = ai_vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

Codedesc tworzy kod koloru. Wymaga co najmniej dwóch zdefiniowanych wcześniej sygnatur kolorów, aby można było go użyć. Na czujniku wizyjnym można zapisać jednocześnie do ośmiu różnych kodów kolorów.

Stosowanie:

Codedesc(sig1, sig2, sig3, sig4, sig5)

Parametr

Opis

sig1

Wcześniej utworzony Sygnatura koloru.

sig2

Wcześniej utworzony Sygnatura koloru.

sig3

Opcjonalnie. Wcześniej utworzony Sygnatura koloru.

sig4

Opcjonalnie. Wcześniej utworzony Sygnatura koloru.

sig5

Opcjonalnie. Wcześniej utworzony Sygnatura koloru.

Przykład

# Create two new Signatures for a red and blue box
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Colordesc(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 = Codedesc(RED_BOX, BLUE_BOX)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX and BLUE_BOX Signatures.
ai_vision_1 = AiVision(Ports.PORT1, 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 = ai_vision_1.take_snapshot(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)