Czujnik wizji#

Wstęp#

Czujnik wizyjny to czujnik oparty na kamerze, który może wykrywać i śledzić sygnatury kolorów i kody kolorów. Umożliwia robotowi analizę otoczenia i reagowanie na bodźce wizualne.

W poniższych przykładach skonfigurowany czujnik wizyjny będzie nosił nazwę vision_1, a skonfigurowane obiekty podpisu kolorów, takie jak RED_BOX, będą używane we wszystkich kolejnych przykładach w tej dokumentacji API podczas odwoływania się do metod klasy Vision.

Poniżej znajduje się lista wszystkich metod:

Gettery — pobieranie danych z czujnika wizyjnego.

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

  • largest_object — Natychmiast wybierz największy obiekt ze migawki czujnika wizyjnego.

  • .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.

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

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

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

  • Vision — Tworzy czujnik wizji.

  • Signature — Tworzy podpis koloru.

  • Code — Tworzy kod koloru.

Getters#

take_snapshot#

take_snapshot filtruje dane z ramki czujnika wizyjnego do pojedynczego podpisu — zapisanego opisu czegoś, co czujnik może rozpoznać, na przykład 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:
vision_1.take_snapshot(SIGNATURE)

Parametry

Opis

SIGNATURE

Filtruje zbiór danych, aby zawierał tylko dane o podanym podpisie. Dostępne podpisy to:

  • Podpisy kolorów lub kody kolorów – nazwa czujnika wizyjnego, dwa podkreślenia, a następnie nazwa podpisu koloru lub kodu koloru. Na przykład: vision_1__RED_BOX.

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

Sygnatury kolorów#

Sygnatura koloru to unikalny kolor, który czujnik wizyjny może rozpoznać. Sygnatury te umożliwiają czujnikowi wizyjnemu wykrywanie i śledzenie obiektów na podstawie ich koloru. Po skonfigurowaniu Sygnatury koloru czujnik może identyfikować obiekty o tym konkretnym 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 składać się z nazwy czujnika wizyjnego, dwóch znaków podkreślenia, a następnie nazwy podpisu koloru. Na przykład: 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 = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color signature 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 umożliwiają czujnikowi wizyjnemu rozpoznawanie predefiniowanych wzorców 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 składać się z nazwy czujnika, dwóch znaków podkreślenia, a następnie nazwy kodu koloru. Na przykład: 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 = vision_1.take_snapshot(vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)

installed#

installed zwraca wartość logiczną wskazującą, czy czujnik wizyjny jest obecnie podłączony do mózgu IQ (2. generacja).

  • True — Czujnik wizji jest połączony z mózgiem IQ (2. generacja).

  • False — Czujnik wizji nie jest połączony z mózgiem IQ (2. generacja).

Usage:
vision_1.installed()

Parametry

Opis

Ta metoda nie ma żadnych parametrów.

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

Właściwości#

largest_object#

largest_object pobiera największy wykryty obiekt, z którego można pobrać dane w krotce zwróconej z ostatniego użycia take_snapshot.

Metodę tę można stosować zawsze w celu uzyskania największego obiektu z krotki, bez konieczności określania indeksu.

Usage:
vision_1.largest_object()

# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box[0].exists:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

Tuple Properties#

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

Wszystkie wartości właściwości opisują położenie i rozmiar wykrytego obiektu w polu widzenia czujnika wizyjnego w momencie użycia polecenia take_snapshot Wartości te są mierzone w pikselach, w oparciu o rozdzielczość czujnika wynoszącą 316 na 212 pikseli.

.istnieje#

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

  • True — Indeks istnieje.

  • False — Indeks nie istnieje.

# Check if at least one red objects is detected
# You will receive an error if no objects are detected

while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    red_objects = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_objects[0].exists:
        brain.screen.print("At least 1")
            
    else:
        brain.screen.print("No red objects")

    wait(0.5, SECONDS)

.szerokość#

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

# Move towards a blue object until its width is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].width < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.wysokość#

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

# Move towards a blue object until its height is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].height < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    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 316.

# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if 140 < vision_1.largest_object().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 212.

# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].centerY < 140:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.kąt#

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

# Turn left or right depending on how a
# configured box code is rotated
while True: 
    box_code = vision_1.take_snapshot(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 pola wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 316.

# Display if a red object is to the
# left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    
    if red_box[0].exists:
        if red_box[0].originX < 160:
            brain.screen.print("To the left!")
        else: 
            brain.screen.print("To the right!")

    wait(50, MSEC)

.originY#

.originY zwraca współrzędną y lewego górnego rogu ograniczającego pole wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 212.

# Display if a red object is close or far
# from the robot
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

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

    wait(50, MSEC)

Konstruktorzy#

Konstruktory służą do ręcznego tworzenia obiektów Vision, Signature, i Code , które są niezbędne do konfigurowania czujników poza VEXcode.

Vision Sensor#

Vision tworzy czujnik wizyjny.

Stosowanie

Vision(port, brightness, sigs)

Parametry

Opis

port

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

brightness

Opcjonalnie. Wartość jasności czujnika wizyjnego od 1 do 100.

sigs

Opcjonalnie. Nazwa jednego lub większej liczby obiektów Sygnatura koloru lub Kod koloru.

Przykład

# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

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

Color Signature#

Signature tworzy Sygnaturę Koloru. Na czujniku wizyjnym można zapisać jednocześnie do siedmiu różnych Sygnatur Koloru.

Stosowanie:

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

Parametr

Opis

index

Indeks obiektu Signature od 1 do 7. Uwaga: Utworzenie dwóch obiektów Signature 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 Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

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

Color Code#

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

Stosowanie:

Code(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 = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(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 = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, 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 = vision_1.take_snapshot(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)