Mākslīgā intelekta vīzija#
Ievads#
VEX AIM kodēšanas robota mākslīgā intelekta redzes sensors nosaka un izseko objektus, krāsas un AprilTag ID. Tas ļauj robotam analizēt apkārtni, sekot objektiem un reaģēt, pamatojoties uz noteiktajiem vizuālajiem datiem.
Mākslīgā intelekta redzes sensora izšķirtspēja ir 320 × 240 pikseļi. Sākotnējais punkts (0, 0) atrodas augšējā kreisajā stūrī, novietojot sensora centru punktā (160, 120), kā parādīts tālāk redzamajā diagrammā:

Zemāk ir visu metožu un īpašību saraksts:
Darbības — Rādīt vai paslēpt AI Redzēšanas kameras plūsmu.
show_aivision— Parāda AI redzes plūsmu robota ekrānā.hide_aivision— Paslēpj AI Vision plūsmu ekrānā.tag_detection— Ieslēdz vai izslēdz AprilTag ID noteikšanu.
Geters — Nosaka, vai robots tur priekšmetu.
get_data— Atgriež noteikta paraksta noteikto objektu sarakstu.has_sports_ball— Atgriež, vai robotam ir sporta bumba.has_any_barrel— Atgriež, vai robotam ir kāda veida muca.has_blue_barrel— Atgriež, vai robotam ir zila muca.has_orange_barrel— Atgriež, vai robotam ir oranža muca.
Īpašības — No get_data atgrieztie objekta dati.
exists— Vai objekts pašreizējā noteikšanā pastāv kā Būla vērtība.width— Noteiktā objekta platums.height— Noteiktā objekta augstums.centerX— objekta centra X pozīcija.centerY— objekta centra Y pozīcija.bearing— Horizontālais leņķis attiecībā pret robota priekšpusi.rotation— Objekta orientācija.originX— objekta augšējā kreisā stūra X pozīcija.originY— objekta augšējā kreisā stūra Y pozīcija.id— Objekta klasifikācijas vai birkas ID.score— AI klasifikāciju ticamības rādītājs.type— Atgriež objekta tipu (AI, Birka, Krāsa vai Kods).
Konstruktori — definējiet krāsu parakstus un kodus.
Izveidot krāsas parakstu — Izveido jaunu krāsas parakstu, pamatojoties uz RGB un nokrāsas/piesātinājuma diapazoniem.
Izveidot krāsu kodu — Apvieno vairākus krāsu parakstus vienā krāsu kodā.
Darbības#
show_aivision#
show_aivision robota ekrānā attēlo mākslīgā intelekta redzes sensora tiešraides datu plūsmu. Tiešraides datu plūsma aizsegs visus pārējos attēlus vai tekstu ekrānā.
Piezīme: Ekrānā netiks rādīti citi attēli vai teksts, ja vien plūsmas paslēpšanai netiks izmantota funkcija hide_aivision.
Usage:
robot.screen.show_aivision()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision noņem AI redzes sensora tiešraides datu plūsmu no robota ekrāna.
Usage:
robot.screen.hide_aivision()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# 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 iespējo vai atspējo AprilTag ID noteikšanu, kur stāvoklis ir Būla vērtība.
Sensors var noteikt AprilTag ID no 0 līdz 36 no Circle21h7 saimes.
Usage:
robot.vision.tag_detection(state)
Parametri |
Apraksts |
|---|---|
|
Vērtības ir: |
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)
Getteri#
get_data#
get_data filtrē datus no AI redzes sensora kadra līdz vienam parakstam — saglabātam aprakstam par kaut ko tādu, ko sensors var atpazīt, piemēram, iepriekš apmācītu objektu, AprilTag ID vai konfigurētu krāsas parakstu vai krāsas kodu — un atgriež tuple.
Krāsu paraksti un Krāsu kodi vispirms ir jākonfigurē AI Vision Utility, pirms tos var izmantot ar šo metodi.
Kortežs tuple saglabā objektus, kas sakārtoti no lielākā līdz mazākajam pēc platuma, sākot ar indeksu 0. Katra objekta properties var piekļūt, izmantojot tā indeksu. Ja netiek atrasti atbilstoši objekti, tiek atgriezts tukšs kortežs.
Usage:
robot.vision.get_data(signature, count)
Parametri |
Apraksts |
|---|---|
|
Filtrē datu kopu, lai tajā tiktu iekļauti tikai dotā paraksta dati. Pieejamie paraksti ir:
|
|
Neobligāti. Iestata maksimālo atgriezto objektu skaitu no 1 līdz 24 (pēc noklusējuma: 8). |
Piezīme: AprilTag ID no 5 līdz 37 var iegūt, izmantojot izdrukātos AprilTag ID no 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)
Piezīme: Atgriezto kortežu var kārtot pēc jebkuras īpašības, ne tikai pēc platuma, izmantojot Python sorted funkciju. Piemēram, kārtojot pēc 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)
Vai arī kārtot pēc augstuma:
# 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)
Datu skatīšana#
Izdrukājot get_data atgriezto kortežu, tiek parādīts visu atrasto objektu īpašību saraksts:
# 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)

Mākslīgā intelekta klasifikācijas#
AIM AI redzes sensors var noteikt šādas AI klasifikācijas:
ID numurs |
Mākslīgā intelekta klasifikācija |
Paraksts |
|---|---|---|
0 |
Bumba |
|
1 |
Zilā muca |
|
2 |
Oranža muca |
|
3 |
AIM robots |
|
Krāsu paraksti#
Krāsas paraksts ir unikāla krāsa, ko spēj atpazīt mākslīgā intelekta redzes sensors. Šie paraksti ļauj sensoram noteikt un izsekot objektus, pamatojoties uz to krāsu. Kad krāsas paraksts ir konfigurēts, sensors var identificēt objektus ar šo konkrēto krāsu tā redzes laukā. Krāsu paraksti tiek izmantoti kopā ar get_data, lai apstrādātu un noteiktu krāsainus objektus reāllaikā.

# 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!")
Krāsu kodi#
Krāsu kods ir strukturēts raksts, kas sastāv no 2 līdz 4 krāsu parakstiem, kas sakārtoti noteiktā secībā. Šie kodi ļauj mākslīgā intelekta redzes sensoram atpazīt iepriekš definētus krāsu modeļus. Krāsu kodi ir noderīgi sarežģītu objektu identificēšanai vai unikālu marķieru izveidei autonomai navigācijai.

# 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 atgriež Būla vērtību, kas norāda, vai robotam pašlaik ir sporta bumba.
True— Robotam ir sporta bumba.False— Robotam nav sporta bumbas.
Usage:
robot.has_sports_ball()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# 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 atgriež Būla vērtību, kas norāda, vai robotam pašlaik ir kāda veida muca.
True— Robotam ir muca.False— Robotam nav mucas.
Usage:
robot.has_any_barrel()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# 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 atgriež Būla vērtību, kas norāda, vai robotam pašlaik ir zila muca.
True— Robotam ir zils muciņš.False— Robotam nav zila stobra.
Usage:
robot.has_blue_barrel()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# 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 atgriež Būla vērtību, kas norāda, vai robotam pašlaik ir oranža muca.
True— Robotam ir oranža muca.False— Robotam nav oranža mucas.
Usage:
robot.has_orange_barrel()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Īpašumi#
Pēc metodes robot.vision.get_data izmantošanas katrā objektā, kas tiek glabāts kortežā, ir iekļautas divpadsmit īpašības.
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 atgriež Būla vērtību, kas norāda, vai indekss eksistē kortežā vai nē.
True— Indekss pastāv.False— Indekss nepastāv.
# 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 atgriež noteiktā objekta platumu pikseļos, kas ir vesels skaitlis no 1 līdz 320.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež noteiktā objekta augstumu pikseļos, kas ir vesels skaitlis no 1 līdz 240.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež noteiktā objekta centra x koordinātu pikseļos, kas ir vesels skaitlis no 0 līdz 320.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež noteiktā objekta centra y koordinātu pikseļos, kas ir vesels skaitlis no 0 līdz 240.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež decimālskaitli (float), kas grādos norāda, cik tālu objekts atrodas pa kreisi vai pa labi no AI redzes sensora skata centra. Vērtība 0 nozīmē, ka tas ir centrēts, pozitīvas vērtības nozīmē, ka objekts atrodas pa labi, un negatīvas vērtības nozīmē, ka objekts atrodas pa kreisi.
# 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 atgriež objekta orientāciju mākslīgā intelekta redzes sensora skata plaknē, mērot grādos no 0 līdz 359. Krāsu kods ir 0°, ja tā krāsas ir sakārtotas horizontālā līnijā (piemēram, sarkana–zila). Ja krāsas tiek pagrieztas, leņķis mainās (piemēram, izkārtojums zils–sarkans atgriež 180°).
Tālāk redzamajā piemērā krāsu kods ir konfigurēts ar sarkanu krāsu kreisajā pusē un zilu krāsu labajā pusē.
Šajā attēlā zilās krāsas uzlikšana virs sarkanās ir līdzvērtīga sākotnējā krāsu koda pagriešanai par 270 grādiem pa labi.

# 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra x koordinātu pikseļos, kas ir vesels skaitlis no 0 līdz 320.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra y koordinātu pikseļos, kas ir vesels skaitlis no 0 līdz 240.
Piezīme: Pikseļu vērtības ir relatīvas attiecībā pret sensora koordinātu sistēmu. Atsaucei skatiet diagrammu ievadā.

# 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 atgriež noteiktās AI klasifikācijas ID vai AprilTag ID kā veselu skaitli.
AprilTag ID gadījumā īpašība .id apzīmē noteikto AprilTag ID numuru diapazonā no 0 līdz 37. AI klasifikācijas gadījumā īpašība .id atbilst iepriekš definētajam ID sadaļā AI klasifikācijas.
# 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 atgriež noteiktās AI klasifikācijas ticamības rādītāju kā veselu skaitli no 1 līdz 100.
Zemāks rādītājs nozīmē, ka sensors ir mazāk pārliecināts par noteikto objektu, savukārt augstāks rādītājs nozīmē, ka sensors ir pārliecinātāks.
# 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 atgriež veselu skaitli, kas norāda atrastā objekta tipu. Šo vērtību var salīdzināt, izmantojot tipa numuru vai atbilstošo nosaukto konstanti:
Objekta tips |
Iekļautie objekti |
|---|---|
|
— Sporta bumbas |
|
— AprilTag ID |
|
— Krāsu paraksti |
|
— Krāsu kodi |
# 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)
Konstruktori#
Creating a Color Signature#
Jauns krāsas paraksts tiek izveidots, izmantojot konstruktoru Colordesc , un pēc tam reģistrēts ar AI redzes sensoru, izmantojot metodi color_description Objekts Colordesc definē 1 no ne vairāk kā 7 nosakāmiem krāsu parakstiem sensoram, taču, lai tas stātos spēkā, tas ir skaidri jāiestata, izmantojot metodi color_description.
Krāsu apraksta lietojums:
Colordesc(index, red, green, blue, hangle, hdsat)
Parametrs |
Apraksts |
|---|---|
|
Vesels skaitlis no 1 līdz 7, kas apzīmē krāsas paraksta indeksu. Ja divi krāsas paraksti izmanto vienu un to pašu indeksu, otrais ignorēs pirmo. |
|
Vesels skaitlis no 0 līdz 255, kas apzīmē krāsas sarkano komponenti. |
|
Vesels skaitlis no 0 līdz 255, kas apzīmē krāsas zaļo komponenti. |
|
Vesels skaitlis no 0 līdz 255, kas apzīmē krāsas zilo komponenti. |
|
Pludiņskaitlis no 1 līdz 40, kas apzīmē nokrāsas diapazonu grādos. |
|
Pludiņskaitlis no 0,10 līdz 1,00, kas apzīmē piesātinājuma diapazonu. |
krāsas_apraksts Lietojums:
robot.vision.color_description(object)
Parametrs |
Apraksts |
|---|---|
|
|
# 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#
Jauns krāsu kods tiek izveidots, izmantojot konstruktoru Codedesc , un pēc tam aktivizēts, izmantojot metodi code_description Krāsu kods grupē 2 līdz 4 esošos Colordesc objektus vienā identifikatorā, ko AI redzes sensors var noteikt kā secību, taču, lai tas stātos spēkā, tas ir skaidri jāiestata, izmantojot code_description.
Codedesc lietojums:
Codedesc(index, c1, c2, c3, c4, c5)
Parametrs |
Apraksts |
|---|---|
|
Krāsu koda indekss no 1 līdz 8. Piezīme. Ja izveidojat divus |
|
Pirmais |
|
Otrais |
|
Neobligāti. Trešais objekts ar vērtību |
|
Neobligāti. Ceturtais objekts ar vērtību |
koda_apraksts Lietojums:
robot.vision.code_description(object)
Parametrs |
Apraksts |
|---|---|
|
|
# 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)