Wizja#
Wstęp#
Czujnik wizyjny VEX EXP wykrywa i śledzi sygnatury kolorów i kody kolorów. Dzięki temu czujnik wizyjny może analizować otoczenie i reagować na podstawie wykrytych danych wizualnych.
Na tej stronie użyto nazw vision_1, RED_BOXi BOX_CODE jako przykładowych nazw odpowiednio: Vision Sensor, Color Signature i Color Code. W razie potrzeby zastąp je własnymi, skonfigurowanymi nazwami.
Poniżej znajduje się lista wszystkich metod:
Gettery – pobieranie danych z czujnika wizyjnego.
take_snapshot– Przechwytuje dane dla określonego podpisu koloru lub kodu koloru.largest_object– Wybierz największy obiekt ze migawki.zainstalowano
installed– Czy czujnik wizyjny jest podłączony do mózgu EXP.
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..originX– Pozycja X lewego górnego rogu obiektu..originY– Pozycja Y lewego górnego rogu obiektu.
Konstruktorzy – ręcznie zainicjuj i skonfiguruj czujnik wizyjny i jego sygnatury.
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 |
|---|---|
|
Filtruje zbiór danych, aby zawierał tylko dane o podanym podpisie. Dostępne podpisy to:
|
# 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 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 wizyjnego, 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)
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)
installed#
installed zwraca wartość logiczną wskazującą, czy czujnik wizyjny jest obecnie podłączony do mózgu EXP.
True– Czujnik wizji jest podłączony do mózgu EXP.False– Czujnik wizji nie jest podłączony do mózgu EXP.
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("Vision Sensor Installed!")
Właściwości#
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.
.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 one red object 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)
.width#
.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)
.height#
.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)
.angle#
.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 70 < box_code[0].angle < 110:
drivetrain.turn_for(RIGHT, 45, DEGREES)
elif 250 < box_code[0].angle < 290:
drivetrain.turn_for(LEFT, 45, DEGREES)
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 konfiguracji czujnika wizji poza VEXcode.
Vision#
Vision tworzy czujnik wizyjny.
Stosowanie
Vision(smartport, brightness, sigs)
Parametry |
Opis |
|---|---|
|
Inteligentny port, do którego podłączony jest czujnik wizyjny, zapisany jako |
|
Opcjonalnie. Wartość jasności czujnika wizyjnego od 1 do 100. |
|
Opcjonalnie. Nazwa jednego lub większej liczby obiektów Sygnatura koloru lub Kod koloru rozdzielona przecinkami ( |
# Create the Color Signatures
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 the Color Code
BOX_CODE = Code(RED_BOX, BLUE_BOX)
"""
Create a Vision Sensor with the following values:
- Port 1
- brightness: 80
- RED_BOX and BOX_CODE signatures
"""
vision_1 = Vision(Ports.PORT1, 80, RED_BOX, BOX_CODE)
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 |
|---|---|
|
Indeks obiektu |
|
Wartość od |
|
Wartość od |
|
Wartość od |
|
Wartość od |
|
Wartość od |
|
Wartość od |
|
Wartość od |
|
Wartość z |
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.
"""
Create a Color Signature with the following values:
- index: 1
- uMin: 10121
- uMax: 10757
- uMean: 10439
- vMin: -1657
- vMax: -1223
- vMean: -1440
- rgb: 2.5
- type: 1
"""
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
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 |
|---|---|
|
Wcześniej utworzony Sygnatura koloru. |
|
Wcześniej utworzony Sygnatura koloru. |
|
Opcjonalnie. Wcześniej utworzony Sygnatura koloru. |
|
Opcjonalnie. Wcześniej utworzony Sygnatura koloru. |
|
Opcjonalnie. Wcześniej utworzony Sygnatura koloru. |
# Create the Color Signatures
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 with the Color Signatures
BOX_CODE = Code(RED_BOX, BLUE_BOX)