Vize umělé inteligence#
Zavedení#
Senzor obrazu s umělou inteligencí kódovacího robota VEX AIM detekuje a sleduje objekty, barvy a identifikátory AprilTag. To umožňuje robotovi analyzovat své okolí, sledovat objekty a reagovat na základě detekovaných vizuálních dat.
Snímač AI Vision má rozlišení 320×240 pixelů. Počátek (0, 0) se nachází v levém horním rohu, střed snímače je v bodě (160, 120), jak je znázorněno na obrázku níže:

Níže je uveden seznam všech metod a vlastností:
Akce – Zobrazení nebo skrytí obrazu z kamery AI Vision.
show_aivision— Zobrazí obraz z AI Vision na obrazovce robota.hide_aivision— Skryje obraz AI Vision z obrazovky.tag_detection— Zapne nebo vypne detekci ID AprilTag.
Gettery – Zjišťují, zda robot drží předmět.
get_data— Vrátí n-tici detekovaných objektů pro konkrétní signaturu.has_sports_ball— Vrátí, zda má robot sportovní míč.has_any_barrel— Vrátí, zda má robot nějaký typ hlavně.has_blue_barrel— Vrátí, zda má robot modrý sud.has_orange_barrel— Vrátí, zda má robot oranžový sud.
Vlastnosti — Data objektu vrácená z get_data.
exists— Zda objekt existuje v aktuální detekci jako booleovská hodnota.width— Šířka detekovaného objektu.height— Výška detekovaného objektu.centerX— Pozice středu objektu na souřadnici X.centerY— Pozice středu objektu v ose Y.bearing— Horizontální úhel vzhledem k přední části robota.rotation— Orientace objektu.originX— Pozice X levého horního rohu objektu.originY— Pozice Y levého horního rohu objektu.id— Klasifikace nebo ID tagu objektu.score— Skóre spolehlivosti pro klasifikace umělé inteligence.type— Vrátí typ objektu (AI, Tag, Color nebo Code).
Konstruktory – Definují barevné signatury a kódy.
Vytvořit barevný podpis – Vytvoří nový barevný podpis na základě RGB a rozsahů odstínu/sytosti.
Vytvořit barevný kód – Spojí více barevných podpisů do jednoho barevného kódu.
Akce#
show_aivision#
show_aivision zobrazuje živá data z AI Vision Sensor na obrazovce robota. Živá data překryjí všechny ostatní obrázky nebo text na obrazovce.
Poznámka: Na obrazovce se nezobrazí žádné další obrázky ani text, pokud se pro skrytí kanálu nepoužije parametr hide_aivision.
Usage:
robot.screen.show_aivision()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision odstraní živý přenos dat z AI Vision Sensor z obrazovky robota.
Usage:
robot.screen.hide_aivision()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# 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 povoluje nebo zakazuje detekci ID AprilTag, kde stav je booleovská hodnota.
Senzor dokáže detekovat ID AprilTag 0 až 36 z rodiny Circle21h7.
Usage:
robot.vision.tag_detection(state)
Parametry |
Popis |
|---|---|
|
Hodnoty jsou: |
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)
Gettery#
get_data#
Funkce get_data filtruje data z rámce senzoru AI Vision do jediného podpisu – uloženého popisu něčeho, co senzor dokáže rozpoznat, například předtrénovaného objektu, ID AprilTag nebo nakonfigurovaného barevného podpisu či barevného kódu – a vrací tuple.
Barevné podpisy a Barevné kódy musí být nejprve nakonfigurovány v nástroji AI Vision Utility, než je bude možné použít s touto metodou.
Objekt tuple ukládá objekty seřazené od největšího po nejmenší podle šířky, počínaje indexem 0. K vlastnostem properties každého objektu lze přistupovat pomocí jeho indexu. Pokud nejsou detekovány žádné odpovídající objekty, vrátí se prázdná n-tica.
Usage:
robot.vision.get_data(signature, count)
Parametry |
Popis |
|---|---|
|
Filtruje datovou sadu tak, aby obsahovala pouze data daného podpisu. Dostupné signatury jsou:
|
|
Volitelné. Nastavuje maximální počet objektů, které lze vrátit, od 1 do 24 (výchozí: 8). |
Poznámka: ID AprilTag 5 až 37 lze získat pomocí vytištěných ID 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)
Poznámka: Vrácenou n-tici lze seřadit podle libovolné vlastnosti property, nejen podle šířky, pomocí funkce Pythonu sorted Například řazení podle ID 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)
Nebo seřazení podle výšky:
# 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)
Zobrazení dat#
Výpis n-tice vrácené funkcí get_data zobrazí seznam všech vlastností všech detekovaných objektů:
# 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)

Klasifikace umělé inteligence#
Snímač obrazu AIM AI dokáže detekovat tyto klasifikace umělé inteligence:
Číslo průkazu totožnosti |
Klasifikace umělé inteligence |
Podpis |
|---|---|---|
0 |
Míč |
|
1 |
Modrý sud |
|
2 |
Pomerančový sud |
|
3 |
Robot AIM |
|
Barevné podpisy#
Barevný podpis je jedinečná barva, kterou dokáže senzor AI Vision Sensor rozpoznat. Díky těmto podpisům může senzor detekovat a sledovat objekty na základě jejich barvy. Jakmile je barevný podpis nakonfigurován, může senzor identifikovat objekty s danou barvou ve svém zorném poli. Barevné podpisy se používají s funkcí get_data ke zpracování a detekci barevných objektů v reálném čase.

# 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!")
Barevné kódy#
Barevný kód je strukturovaný vzor složený ze 2 až 4 barevných podpisů uspořádaných v určitém pořadí. Tyto kódy umožňují senzoru AI Vision Sensor rozpoznávat předdefinované barevné vzory. Barevné kódy jsou užitečné pro identifikaci složitých objektů nebo vytváření jedinečných značek pro autonomní navigaci.

# 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 vrací booleovskou hodnotu, která indikuje, zda robot aktuálně má sportovní míč.
True— Robot má sportovní míč.False— Robot nemá sportovní míč.
Usage:
robot.has_sports_ball()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# 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 vrací booleovskou hodnotu, která indikuje, zda robot aktuálně má nějaký typ sudu.
True— Robot má sud.False— Robot nemá sud.
Usage:
robot.has_any_barrel()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# 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 vrací booleovskou hodnotu, která indikuje, zda má robot aktuálně modrý sud.
True— Robot má modrý sud.False— Robot nemá modrý sud.
Usage:
robot.has_blue_barrel()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# 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 vrací booleovskou hodnotu, která indikuje, zda má robot aktuálně oranžový sud.
True— Robot má oranžový sud.False— Robot nemá oranžový sud.
Usage:
robot.has_orange_barrel()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Nemovitosti#
Každý objekt uložený v n-tici po použití metody robot.vision.get_data obsahuje dvanáct vlastností.
All property values except .id, .score, and .type describe the detected object’s position, size, orientation, or bearing at the moment robot.vision.get_data was used. These values are measured in pixels or degrees, based on the sensor’s 320 by 240 pixel resolution.

.exists#
.exists vrací booleovskou hodnotu, která indikuje, zda index v n-tici existuje či nikoli.
True— Index existuje.False— Index neexistuje.
# 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 vrací šířku detekovaného objektu v pixelech, což je celé číslo mezi 1 a 320.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací výšku detekovaného objektu v pixelech, což je celé číslo mezi 1 a 240.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací souřadnici x středu detekovaného objektu v pixelech, což je celé číslo mezi 0 a 320.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací souřadnici y středu detekovaného objektu v pixelech, což je celé číslo mezi 0 a 240.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací desetinné číslo (float) vyjadřující, jak daleko se objekt nachází vlevo nebo vpravo od středu pohledu senzoru AI Vision ve stupních. Hodnota 0 znamená, že je objekt vycentrován, kladné hodnoty znamenají, že je objekt vpravo, a záporné hodnoty znamenají, že je objekt vlevo.
# 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 vrací orientaci objektu v rovině pohledu senzoru AI Vision, měřenou ve stupních od 0 do 359. Barevný kód je 0°, pokud jsou jeho barvy uspořádány vodorovně (např. červená–modrá). Pokud jsou barvy otočeny, úhel se změní (např. uspořádání modrá–červená vrátí 180°).
V níže uvedeném příkladu byl barevný kód nakonfigurován s červenou barvou vlevo a modrou vpravo.
Na tomto obrázku je umístění modré na červenou ekvivalentní otočení původního barevného kódu o 270 stupňů doprava.

# 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 vrací souřadnici x levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech, což je celé číslo mezi 0 a 320.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací souřadnici y levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech, což je celé číslo mezi 0 a 240.
Poznámka: Hodnoty pixelů jsou relativní vzhledem k souřadnicovému systému senzoru. Viz diagram v úvodu pro referenci.

# 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 vrací ID detekované klasifikace AI nebo ID AprilTag jako celé číslo.
For an AprilTag ID, the .id property represents the detected AprilTag ID number in the range of 0 to 37. For an AI Classification, the .id property corresponds to the predefined ID in the AI Classifications section.
# 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 vrací skóre spolehlivosti detekované klasifikace AI jako celé číslo mezi 1 a 100.
Nižší skóre znamená, že si je senzor méně jistý detekovaným objektem, zatímco vyšší skóre znamená, že si je senzor jistější.
# 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 vrací celé číslo, které označuje typ detekovaného objektu. Tuto hodnotu můžete porovnat buď pomocí čísla typu, nebo odpovídající pojmenované konstanty:
Typ objektu |
Zahrnuté objekty |
|---|---|
|
— Sportovní míče |
|
— ID značek April |
|
— Barevné podpisy |
|
— Barevné kódy |
# 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)
Konstruktéři#
Creating a Color Signature#
Nový barevný podpis se vytvoří pomocí konstruktoru Colordesc a poté se zaregistruje u AI Vision Sensor pomocí metody color_description Objekt Colordesc definuje 1 z až 7 detekovatelných barevných podpisů pro senzor, ale aby se projevil, musí být explicitně nastaven pomocí color_description.
Použití popisu barev:
Colordesc(index, red, green, blue, hangle, hdsat)
Parametr |
Popis |
|---|---|
|
Celé číslo od 1 do 7 představující index barevné signatury. Pokud dvě barevné signatury používají stejný index, druhá z nich přepíše první. |
|
Celé číslo od 0 do 255 pro červenou složku barvy. |
|
Celé číslo od 0 do 255 pro zelenou složku barvy. |
|
Celé číslo od 0 do 255 pro modrou složku barvy. |
|
Číslo s plovoucí desetinnou čárkou od 1 do 40 představující rozsah odstínu ve stupních. |
|
Číslo s plovoucí desetinnou čárkou od 0,10 do 1,00 představující rozsah nasycení. |
Použití popisu barvy:
robot.vision.color_description(object)
Parametr |
Popis |
|---|---|
|
Objekt |
# 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#
Nový barevný kód se vytvoří pomocí konstruktoru Codedesc a poté se aktivuje pomocí metody code_description Barevný kód seskupuje 2 až 4 existující objekty Colordesc do jednoho identifikátoru, který dokáže AI Vision Sensor detekovat jako sekvenci, ale aby se projevil, musí být explicitně nastaven pomocí code_description.
Použití kódu:
Codedesc(index, c1, c2, c3, c4, c5)
Parametr |
Popis |
|---|---|
|
Index barevného kódu od 1 do 8. Poznámka: Pokud vytvoříte dva objekty |
|
První objekt |
|
Druhý objekt |
|
Volitelné. Třetí objekt typu |
|
Volitelné. Čtvrtý objekt typu |
Použití code_description:
robot.vision.code_description(object)
Parametr |
Popis |
|---|---|
|
Objekt typu |
# 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)