Wizja AI#
Wstęp#
Czujnik wizyjny AI robota VEX AIM Coding Robot 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.
Czujnik wizyjny AI ma rozdzielczość 320×240 pikseli. Początek układu współrzędnych (0, 0) znajduje się w lewym górnym rogu, co oznacza, że środek czujnika znajduje się w punkcie (160, 120), jak pokazano na poniższym schemacie:

Poniżej znajduje się lista wszystkich metod i właściwości:
Akcje — pokaż lub ukryj obraz z kamery AI Vision.
show_aivision— Wyświetla obraz AI Vision na ekranie robota.hide_aivision— Ukrywa kanał AI Vision na ekranie.tag_detection— Włącza lub wyłącza wykrywanie identyfikatorów AprilTag.
Getter — wykrywa, czy robot trzyma obiekt.
get_data— Zwraca krotkę wykrytych obiektów dla określonego podpisu.has_sports_ball— Zwraca informację, czy robot ma piłkę sportową.has_any_barrel— Zwraca informację, czy robot ma jakikolwiek typ beczki.has_blue_barrel— Zwraca informację, czy robot ma niebieską beczkę.has_orange_barrel— Zwraca informację, czy robot ma pomarańczową beczkę.
Właściwości — dane obiektu zwrócone z get_data.
exists— Czy obiekt istnieje w bieżącym wykryciu jako wartość logiczna.width— Szerokość wykrytego obiektu.height— Wysokość wykrytego obiektu.centerX— Pozycja X środka obiektu.centerY— Pozycja Y środka obiektu.bearing— Kąt poziomy względem przodu robota.rotation— Orientacja obiektu.originX— Pozycja X lewego górnego rogu obiektu.originY— Pozycja Y lewego górnego rogu obiektu.id— Klasyfikacja lub identyfikator tagu obiektu.score— Wynik pewności dla klasyfikacji AI.type— Zwraca typ obiektu (AI, Tag, Color lub Code).
Konstruktory — definiują sygnatury i kody kolorów.
Utwórz sygnaturę koloru — Tworzy nową sygnaturę koloru na podstawie zakresów RGB i odcienia/nasycenia.
Utwórz kod koloru — łączy wiele sygnatur kolorów w jeden kod koloru.
Akcje#
show_aivision#
show_aivision wyświetla na ekranie robota obraz z czujnika AI Vision na żywo. Obraz na żywo zasłania wszystkie inne obrazy i tekst na ekranie.
Uwaga: Na ekranie nie będą wyświetlane żadne inne obrazy ani tekst, chyba że użyto funkcji hide_aivision w celu ukrycia kanału.
Usage:
robot.screen.show_aivision()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision usuwa transmisję danych na żywo z czujnika AI Vision z ekranu robota.
Usage:
robot.screen.hide_aivision()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection włącza lub wyłącza wykrywanie identyfikatora AprilTag, gdzie stan jest wartością logiczną.
Czujnik może wykrywać identyfikatory AprilTag od 0 do 36 z rodziny Circle21h7.
Usage:
robot.vision.tag_detection(state)
Parametry |
Opis |
|---|---|
|
Wartości: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
Getters#
get_data#
get_data filtruje dane z ramki czujnika 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 AI Vision Utility.
Krotka Tuple 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 można uzyskać za pomocą jego indeksu. Jeśli nie wykryto żadnych pasujących obiektów, zwracana jest pusta krotka.
Usage:
robot.vision.get_data(signature, count)
Parametry |
Opis |
|---|---|
|
Filtruje zbiór danych tak, aby zawierał tylko dane o określonym podpisie. Dostępne są następujące podpisy:
|
|
Opcjonalnie. Ustawia maksymalną liczbę obiektów, które można zwrócić, od 1 do 24 (domyślnie: 8). |
Uwaga: Identyfikatory AprilTag od 5 do 37 można uzyskać, korzystając z wydrukowanych identyfikatorów AprilTag z AIM Printables.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
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(robot.vision.get_data(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(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
Wyświetlanie danych#
Wydrukowanie krotki zwróconej przez get_data wyświetla listę wszystkich właściwości wszystkich wykrytych obiektów:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

Klasyfikacje AI#
Czujnik wizyjny AIM AI potrafi wykrywać następujące klasyfikacje sztucznej inteligencji:
Numer identyfikacyjny |
Klasyfikacja AI |
Podpis |
|---|---|---|
0 |
Piłka |
|
1 |
Niebieska beczka |
|
2 |
Pomarańczowa beczka |
|
3 |
Robot AIM |
|
Sygnatury kolorów#
Sygnatura koloru to unikalny kolor, który czujnik wizyjny AI potrafi 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ą get_data do przetwarzania i wykrywania kolorowych obiektów w czasie rzeczywistym.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
Kody kolorów#
Kod koloru to uporządkowany wzór składający się z 2 do 4 sygnatur kolorów ułożonych w określonej kolejności. Kody te pozwalają czujnikowi wizyjnemu 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.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball zwraca wartość logiczną wskazującą, czy robot aktualnie posiada piłkę sportową.
True— Robot ma piłkę sportową.False— Robot nie ma piłki sportowej.
Usage:
robot.has_sports_ball()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel zwraca wartość logiczną wskazującą, czy robot aktualnie posiada jakikolwiek typ beczki.
True— Robot ma beczkę.False— Robot nie ma lufy.
Usage:
robot.has_any_barrel()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel zwraca wartość logiczną wskazującą, czy robot aktualnie posiada niebieską beczkę.
True— Robot ma niebieską beczkę.False— Robot nie ma niebieskiej beczki.
Usage:
robot.has_blue_barrel()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel zwraca wartość logiczną wskazującą, czy robot aktualnie posiada pomarańczową beczkę.
True— Robot ma pomarańczową beczkę.False— Robot nie ma pomarańczowej beczki.
Usage:
robot.has_orange_barrel()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Właściwości#
Każdy obiekt przechowywany w krotce zawiera dwanaście właściwości po użyciu metody robot.vision.get_data.
Wszystkie wartości właściwości, z wyjątkiem .id, .score, i .type opisują położenie, rozmiar, orientację lub azymut wykrytego obiektu w momencie użycia robot.vision.get_data . Wartości te są mierzone w pikselach lub stopniach, 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:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width zwraca szerokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 320.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height zwraca wysokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 240.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
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.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
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.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing zwraca wartość dziesiętną (float) reprezentującą odległość obiektu na lewo lub prawo od środka pola widzenia czujnika AI Vision w stopniach. Wartość 0 oznacza, że obiekt jest wyśrodkowany, wartości dodatnie oznaczają, że obiekt znajduje się po prawej stronie, a wartości ujemne oznaczają, że obiekt znajduje się po lewej stronie.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
.rotation zwraca orientację obiektu na płaszczyźnie widzenia czujnika AI Vision, mierzoną w stopniach od 0 do 359. Kod koloru ma wartość 0°, gdy jego kolory są ułożone w linii poziomej (np. czerwony–niebieski). Obrócenie kolorów powoduje zmianę kąta (np. ułożenie niebieski–czerwony zwraca 180°).
W poniższym przykładzie kod kolorów został skonfigurowany tak, że kolor czerwony znajduje się po lewej stronie, a niebieski po prawej.
Na tym obrazku nałożenie koloru niebieskiego na czerwony jest równoznaczne z obróceniem oryginalnego kodu kolorów o 270 stopni w prawo.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
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.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, 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.
Uwaga: Wartości pikseli są względne względem układu współrzędnych czujnika. Patrz schemat we Wprowadzeniu w celach informacyjnych.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.id#
.id zwraca identyfikator wykrytej klasyfikacji AI lub identyfikator AprilTag jako liczbę całkowitą.
W przypadku identyfikatora AprilTag właściwość .id reprezentuje wykryty numer identyfikatora AprilTag w zakresie od 0 do 37. 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 = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
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ść.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
.type zwraca liczbę całkowitą wskazującą typ wykrytego obiektu. Możesz porównać tę wartość, używając numeru typu lub odpowiadającej mu stałej nazwanej:
Typ obiektu |
Dołączone obiekty |
|---|---|
|
— Piłki sportowe |
|
— Identyfikatory AprilTag |
|
— Sygnatury kolorów |
|
— Kody kolorów |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
Konstruktorzy#
Creating a Color Signature#
Nowy podpis koloru jest tworzony za pomocą konstruktora Colordesc , a następnie rejestrowany w czujniku AI Vision za pomocą metody color_description Obiekt Colordesc definiuje jedną z maksymalnie siedmiu wykrywalnych sygnatur kolorów dla czujnika, ale musi zostać jawnie ustawiony za pomocą metody color_description , aby zaczął obowiązywać.
Użycie Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Parametr |
Opis |
|---|---|
|
Liczba całkowita od 1 do 7 reprezentująca indeks Sygnatury Koloru. Jeśli dwie Sygnatury Koloru używają tego samego indeksu, druga nadpisze pierwszy. |
|
Liczba całkowita od 0 do 255 określająca składową czerwoną koloru. |
|
Liczba całkowita od 0 do 255 określająca zielony składnik koloru. |
|
Liczba całkowita od 0 do 255 określająca niebieski składnik koloru. |
|
Liczba zmiennoprzecinkowa od 1 do 40, reprezentująca zakres odcienia w stopniach. |
|
Wartość zmiennoprzecinkowa od 0,10 do 1,00 reprezentująca zakres nasycenia. |
color_description Zastosowanie:
robot.vision.color_description(object)
Parametr |
Opis |
|---|---|
|
Obiekt |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
Nowy kod koloru jest tworzony za pomocą konstruktora Codedesc , a następnie aktywowany za pomocą metody code_description Kod koloru grupuje od 2 do 4 istniejących obiektów Colordesc w pojedynczy identyfikator, który czujnik wizyjny AI może wykryć jako sekwencję, ale musi zostać jawnie ustawiony za pomocą metody code_description , aby zaczął obowiązywać.
Użycie Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Parametr |
Opis |
|---|---|
|
Indeks kodu koloru od 1 do 8. Uwaga: jeśli utworzysz dwa obiekty Codedesc |
|
|
|
Drugi obiekt |
|
Opcjonalnie. Trzeci obiekt |
|
Opcjonalnie. Czwarty obiekt |
code_description Zastosowanie:
robot.vision.code_description(object)
Parametr |
Opis |
|---|---|
|
Obiekt |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)