Dirbtinio intelekto vizija#
Įvadas#
VEX AIM kodavimo roboto dirbtinio intelekto regos jutiklis aptinka ir seka objektus, spalvas ir „AprilTag“ ID. Tai leidžia robotui analizuoti aplinką, sekti objektus ir reaguoti pagal aptiktus vaizdinius duomenis.
Dirbtinio intelekto vaizdo jutiklio skiriamoji geba yra 320 × 240 pikselių. Pradinis taškas (0, 0) yra viršutiniame kairiajame kampe, o jutiklio centras yra ties (160, 120), kaip parodyta toliau pateiktoje diagramoje:

Žemiau pateikiamas visų metodų ir savybių sąrašas:
Veiksmai – Rodyti arba slėpti dirbtinio intelekto kameros vaizdą.
show_aivision— Rodo dirbtinio intelekto vaizdo srautą roboto ekrane.hide_aivision— Paslepia dirbtinio intelekto vaizdo transliaciją ekrane.tag_detection— Įjungia arba išjungia „AprilTag“ ID aptikimą.
Geteris – aptinka, ar robotas laiko objektą.
get_data— Grąžina aptiktų objektų rinkinį, skirtą konkrečiam parašui.has_sports_ball— Grąžina, ar robotas turi sportinį kamuolį.has_any_barrel— Grąžina, ar robotas turi kokio nors tipo statinę.has_blue_barrel— Grąžina, ar robotas turi mėlyną statinę.has_orange_barrel— Grąžina, ar robotas turi oranžinę statinę.
Ypatybės — Objekto duomenys, grąžinti iš get_data.
exists– Ar objektas egzistuoja dabartiniame aptikime kaip loginė reikšmė.width— Aptikto objekto plotis.height— Aptikto objekto aukštis.centerX— objekto centro X padėtis.centerY— objekto centro Y padėtis.bearing— Horizontalus kampas roboto priekio atžvilgiu.rotation— Objekto orientacija.originX— objekto viršutinio kairiojo kampo X padėtis.originY— objekto viršutinio kairiojo kampo Y padėtis.id— Objekto klasifikacija arba žymės ID.score– DI klasifikacijų patikimumo balas.type— Grąžina objekto tipą (DI, ŽYMA, Spalva arba Kodas).
Konstruktoriai – apibrėžkite spalvų parašus ir kodus.
Sukurti spalvos parašą – Sukuria naują spalvos parašą, pagrįstą RGB ir atspalvio / sodrumo diapazonais.
Sukurti spalvos kodą – Sujungia kelis spalvų parašus į vieną spalvos kodą.
Veiksmai#
show_aivision#
show_aivision rodo dirbtinio intelekto regos jutiklio tiesioginius duomenis roboto ekrane. Tiesioginiai duomenys uždengs visus kitus ekrane esančius vaizdus ar tekstą.
Pastaba: Ekrane nebus rodomi jokie kiti vaizdai ar tekstas, nebent hide_aivision būtų naudojamas kanalui paslėpti.
Usage:
robot.screen.show_aivision()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision pašalina dirbtinio intelekto regėjimo jutiklio tiesioginius duomenis iš roboto ekrano.
Usage:
robot.screen.hide_aivision()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# 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 įjungia arba išjungia „AprilTag“ ID aptikimą, kur būsena yra loginė reikšmė.
Jutiklis gali aptikti „AprilTag“ ID nuo 0 iki 36 iš „Circle21h7“ šeimos.
Usage:
robot.vision.tag_detection(state)
Parametrai |
Aprašymas |
|---|---|
|
Reikšmės yra: |
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)
Getteriai#
get_data#
get_data filtruoja duomenis iš AI regėjimo jutiklio kadro į vieną parašą – išsaugotą aprašymą to, ką jutiklis gali atpažinti, pvz., iš anksto apmokytą objektą, „AprilTag“ ID arba sukonfigūruotą spalvos parašą arba spalvos kodą – ir grąžina tuple.
Prieš naudojant šį metodą, pirmiausia „AI Vision Utility“ programoje reikia sukonfigūruoti Spalvų parašus ir Spalvų kodus.
Tuple saugo objektus, surūšiuotus nuo didžiausio iki mažiausio pagal plotį, pradedant nuo indekso 0. Kiekvieno objekto properties galima pasiekti naudojant jo indeksą. Jei nerandama atitinkamų objektų, grąžinama tuščia seka.
Usage:
robot.vision.get_data(signature, count)
Parametrai |
Aprašymas |
|---|---|
|
Filtruoja duomenų rinkinį, kad būtų įtraukti tik nurodyto parašo duomenys. Galimi parašai:
|
|
Pasirinktinai. Nustato maksimalų grąžinamų objektų skaičių nuo 1 iki 24 (numatytasis: 8). |
Pastaba: „AprilTag“ ID nuo 5 iki 37 galima gauti naudojant atspausdintus „AprilTag“ ID iš 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)
Pastaba: Grąžintą rinkinį galima rūšiuoti pagal bet kurią savybę, ne tik pagal plotį, naudojant Python funkciją sorted Pavyzdžiui, rūšiuojant pagal AprilTag ID:
# 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)
Arba rūšiuoti pagal ūgį:
# 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)
Duomenų peržiūra#
Spausdinant get_data grąžintą rinkinį, rodomas visų aptiktų objektų savybių sąrašas:
# 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)

DI klasifikacijos#
AIM AI vaizdo jutiklis gali aptikti šias DI klasifikacijas:
ID numeris |
DI klasifikacija |
Parašas |
|---|---|---|
0 |
Kamuolys |
|
1 |
Mėlyna statinė |
|
2 |
Oranžinė statinė |
|
3 |
AIM robotas |
|
Spalvų parašai#
Spalvos parašas yra unikali spalva, kurią gali atpažinti dirbtinio intelekto regos jutiklis. Šie parašai leidžia jutikliui aptikti ir sekti objektus pagal jų spalvą. Sukonfigūravus spalvos parašą, jutiklis gali atpažinti objektus savo matymo lauke su ta konkrečia spalva. Spalvų parašai naudojami su get_data, kad būtų galima apdoroti ir aptikti spalvotus objektus realiuoju laiku.

# 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!")
Spalvų kodai#
Spalvų kodas yra struktūrizuotas raštas, sudarytas iš 2–4 spalvų parašų, išdėstytų tam tikra tvarka. Šie kodai leidžia dirbtinio intelekto regos jutikliui atpažinti iš anksto nustatytus spalvų raštus. Spalvų kodai yra naudingi norint identifikuoti sudėtingus objektus arba sukurti unikalius žymeklius autonominei navigacijai.

# 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 grąžina loginę reikšmę, nurodančią, ar robotas šiuo metu turi sportinį kamuolį.
True— Robotas turi sportinį kamuolį.False— Robotas neturi sportinio kamuolio.
Usage:
robot.has_sports_ball()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# 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 grąžina loginę reikšmę, nurodančią, ar robotas šiuo metu turi kokio nors tipo statinę.
True— Robotas turi statinę.False— Robotas neturi statinės.
Usage:
robot.has_any_barrel()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# 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 grąžina loginę reikšmę, nurodančią, ar robotas šiuo metu turi mėlyną statinę.
True— Robotas turi mėlyną vamzdį.False— Robotas neturi mėlyno cilindro.
Usage:
robot.has_blue_barrel()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# 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 grąžina loginę reikšmę, nurodančią, ar robotas šiuo metu turi oranžinę statinę.
True— Robotas turi oranžinį vamzdį.False— Robotas neturi oranžinio cilindro.
Usage:
robot.has_orange_barrel()
Parametrai |
Aprašymas |
|---|---|
Šis metodas neturi parametrų. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Ypatybės#
Kiekvienam objektui, saugomam rinkinyje panaudojus robot.vision.get_data, priskiriamos dvylika savybių.
Visos ypatybių reikšmės, išskyrus .id, .scoreir .type , apibūdina aptikto objekto padėtį, dydį, orientaciją arba kryptį tuo metu, kai buvo naudojamas robot.vision.get_data Šios reikšmės matuojamos pikseliais arba laipsniais, remiantis jutiklio 320 x 240 pikselių skiriamąja geba.

.exists#
.exists grąžina loginę reikšmę, nurodančią, ar indeksas egzistuoja rinkinyje, ar ne.
True— Indeksas yra.False— Indekso nėra.
# 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 grąžina aptikto objekto plotį pikseliais, kuris yra sveikasis skaičius nuo 1 iki 320.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina aptikto objekto aukštį pikseliais, kuris yra sveikasis skaičius nuo 1 iki 240.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina aptikto objekto centro x koordinatę pikseliais, kuri yra sveikasis skaičius nuo 0 iki 320.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina aptikto objekto centro y koordinatę pikseliais, kuri yra sveikasis skaičius nuo 0 iki 240.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina dešimtainį (float), rodantį, kiek objektas yra nutolęs į kairę arba į dešinę nuo DI vaizdo jutiklio matymo lauko centro laipsniais. 0 reikšmė reiškia, kad objektas yra centre, teigiamos reikšmės reiškia, kad objektas yra dešinėje, o neigiamos reikšmės reiškia, kad objektas yra kairėje.
# 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 grąžina objekto orientaciją dirbtinio intelekto vaizdo jutiklio žiūrėjimo plokštumoje, matuojamą laipsniais nuo 0 iki 359. Spalvos kodas yra 0°, kai jo spalvos išdėstytos horizontalioje linijoje (pvz., raudona–mėlyna). Jei spalvos pasukamos, kampas pasikeičia (pvz., išdėstymas mėlyna–raudona grąžina 180°).
Žemiau pateiktame pavyzdyje spalvų kodas sukonfigūruotas taip, kad raudona spalva būtų kairėje, o mėlyna – dešinėje.
Šiame paveikslėlyje mėlynos spalvos uždėjimas ant raudonos spalvos atitinka pradinio spalvų kodo pasukimą 270 laipsnių į dešinę.

# 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo x koordinatę pikseliais, kuri yra sveikasis skaičius nuo 0 iki 320.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo y koordinatę pikseliais, kurie yra sveikasis skaičius nuo 0 iki 240.
Pastaba: Pikselių vertės yra santykinės jutiklio koordinačių sistemos atžvilgiu. Žr. diagramą įvade.

# 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 grąžina aptiktos dirbtinio intelekto klasifikacijos ID arba „AprilTag“ ID kaip sveikąjį skaičių.
„AprilTag“ ID atveju savybė .id nurodo aptiktą „AprilTag“ ID numerį intervale nuo 0 iki 37. AI klasifikacijos atveju savybė „ .id atitinka iš anksto apibrėžtą ID skyriuje AI klasifikacijos.
# 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 grąžina aptiktos dirbtinio intelekto klasifikacijos patikimumo balą kaip sveikąjį skaičių nuo 1 iki 100.
Mažesnis balas reiškia, kad jutiklis mažiau pasitiki aptiktu objektu, o didesnis balas – kad jutiklis labiau pasitiki.
# 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 grąžina sveikąjį skaičių, nurodantį aptikto objekto tipą. Šią reikšmę galite palyginti naudodami tipo numerį arba atitinkamą įvardytąją konstantą:
Objekto tipas |
Įtraukti objektai |
|---|---|
|
— Sportiniai kamuoliai |
|
— AprilTag ID |
|
— Spalvų parašai |
|
— Spalvų kodai |
# 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)
Konstruktoriai#
Creating a Color Signature#
Naujas spalvos parašas sukuriamas naudojant konstruktorių Colordesc ir užregistruojamas dirbtinio intelekto regėjimo jutiklyje naudojant metodą color_description . Objektas Colordesc apibrėžia 1 iš iki 7 aptinkamų jutiklio spalvų parašų, tačiau, kad jis įsigaliotų, jis turi būti aiškiai nustatytas naudojant color_description.
Spalvos aprašymo naudojimas:
Colordesc(index, red, green, blue, hangle, hdsat)
Parametras |
Aprašymas |
|---|---|
|
Sveikasis skaičius nuo 1 iki 7, žymintis spalvos parašo indeksą. Jei du spalvų parašai naudoja tą patį indeksą, antrasis pakeis pirmąjį. |
|
Sveikasis skaičius nuo 0 iki 255, žymintis raudoną spalvos komponentą. |
|
Sveikasis skaičius nuo 0 iki 255, žymintis žalią spalvos komponentą. |
|
Sveikasis skaičius nuo 0 iki 255, žymintis mėlyną spalvos komponentą. |
|
Skaičius nuo 1 iki 40, žymintis atspalvių diapazoną laipsniais. |
|
Plūduriuojantis skaičius nuo 0,10 iki 1,00, rodantis prisotinimo diapazoną. |
color_description Usage:
robot.vision.color_description(object)
Parametras |
Aprašymas |
|---|---|
|
|
# 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#
Naujas spalvos kodas sukuriamas naudojant konstruktorių Codedesc ir aktyvuojamas naudojant metodą code_description . Spalvos kodas sugrupuoja Colordesc objektus į vieną identifikatorių, kurį dirbtinio intelekto regėjimo jutiklis gali aptikti kaip seką, tačiau, kad jis įsigaliotų, jis turi būti aiškiai nustatytas naudojant code_description.
Codedesc naudojimas:
Codedesc(index, c1, c2, c3, c4, c5)
Parametras |
Aprašymas |
|---|---|
|
Spalvos kodo indeksas nuo 1 iki 8. Pastaba: jei sukursite du |
|
Pirmasis |
|
Antrasis |
|
Pasirinktinai. Trečias |
|
Pasirinktinai. Ketvirtas |
code_description Usage:
robot.vision.code_description(object)
Parametras |
Aprašymas |
|---|---|
|
|
# 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)