AI-vision#
Introduktion#
VEX AIM-kodningsrobotens AI-visionssensor detekterar och spårar objekt, färger och AprilTag-ID:n. Detta gör att roboten kan analysera sin omgivning, följa objekt och reagera baserat på detekterad visuell data.
AI-visionssensorn har en upplösning på 320×240 pixlar. Origon (0, 0) är placerat i det övre vänstra hörnet, vilket placerar sensorns mittpunkt vid (160, 120), som visas i diagrammet nedan:

Nedan följer en lista över alla metoder och egenskaper:
Åtgärder — Visa eller dölj AI Vision-kameraflödet.
show_aivision— Visar AI Vision-flödet på robotens skärm.hide_aivision— Döljer AI Vision-flödet från skärmen.tag_detection— Aktiverar eller inaktiverar AprilTag ID-detektering.
Getters — Detekterar om roboten håller ett föremål.
get_data— Returnerar en tupel av detekterade objekt för en specifik signatur.has_sports_ball— Returnerar om roboten har en sportboll.has_any_barrel— Returnerar om roboten har någon typ av tunna.has_blue_barrel— Returnerar om roboten har en blå tunna.has_orange_barrel— Returnerar om roboten har en orange tunna.
Egenskaper — Objektdata returnerad från get_data.
exists— Om objektet existerar i den aktuella detekteringen som ett booleskt värde.width— Bredden på det detekterade objektet.height— Höjden på det detekterade objektet.centerX— X-positionen för objektets centrum.centerY— Y-positionen för objektets centrum.bearing— Horisontell vinkel i förhållande till robotens framsida.rotation— Objektets orientering.originX— X-positionen för objektets övre vänstra hörn.originY— Y-positionen för objektets övre vänstra hörn.id— Klassificering eller tagg-ID för objektet.score— Konfidenspoäng för AI-klassificeringar.type— Returnerar objektets typ (AI, Tagg, Färg eller Kod).
Konstruktörer — Definiera färgsignaturer och koder.
Skapa en färgsignatur — Skapar en ny färgsignatur baserad på RGB och nyans-/mättnadsområden.
Skapa en färgkod — Kombinerar flera färgsignaturer till en enda färgkod.
Åtgärder#
show_aivision#
show_aivision visar AI-visionssensorns livedataflöde på robotens skärm. Livedataflödet kommer att täcka alla andra bilder eller text på skärmen.
Obs: Skärmen visar inga andra bilder eller text om inte hide_aivision används för att dölja flödet.
Usage:
robot.screen.show_aivision()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision tar bort AI-visionssensorns livedataflöde från robotens skärm.
Usage:
robot.screen.hide_aivision()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# 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 aktiverar eller inaktiverar AprilTag ID-detektering, där tillståndet är ett booleskt värde.
Sensorn kan detektera AprilTag-ID:n 0 till 36 från Circle21h7-familjen.
Usage:
robot.vision.tag_detection(state)
Parametrar |
Beskrivning |
|---|---|
|
Värdena är: |
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 filtrerar data från AI Vision Sensor-ramen till en enda signatur — en sparad beskrivning av något som sensorn kan känna igen, till exempel ett förtränat objekt, ett AprilTag-ID eller en konfigurerad färgsignatur eller färgkod — och returnerar en tupel.
Färgsignaturer och Färgkoder måste först konfigureras i AI Vision Utility innan de kan användas med den här metoden.
Tupeln lagrar objekt sorterade från störst till minst efter bredd, med början vid index 0. Varje objekts egenskaper kan nås med hjälp av dess index. En tom tupel returneras om inga matchande objekt upptäcks.
Usage:
robot.vision.get_data(signature, count)
Parametrar |
Beskrivning |
|---|---|
|
Filtrerar datamängden så att den endast inkluderar data från den givna signaturen. Tillgängliga signaturer är:
|
|
Valfritt. Anger det maximala antalet objekt som kan returneras från 1 till 24 (standard: 8). |
Obs! AprilTag-ID:n 5 till 37 kan erhållas med hjälp av de utskrivna AprilTag-ID:na från 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)
Obs! Den returnerade tupeln kan sorteras efter valfri egenskap, inte bara bredd, med hjälp av Pythons sorted funktion. Till exempel, sortering efter 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)
Eller sortera efter höjd istället:
# 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)
Visar data#
Om du skriver ut tupeln som returneras av get_data visas en lista över alla egenskaper för alla upptäckta 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)

AI-klassificeringar#
AIM AI Vision Sensor kan upptäcka dessa AI-klassificeringar:
ID-nummer |
AI-klassificering |
Signatur |
|---|---|---|
0 |
Boll |
|
1 |
Blå fat |
|
2 |
Orange fat |
|
3 |
AIM-roboten |
|
Färgsignaturer#
En färgsignatur är en unik färg som AI-visionssensorn kan känna igen. Dessa signaturer gör det möjligt för sensorn att upptäcka och spåra objekt baserat på deras färg. När en färgsignatur har konfigurerats kan sensorn identifiera objekt med den specifika färgen i sitt synfält. Färgsignaturer används med get_data för att bearbeta och upptäcka färgade objekt i realtid.

# 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!")
Färgkoder#
En färgkod är ett strukturerat mönster som består av 2 till 4 färgsignaturer arrangerade i en specifik ordning. Dessa koder gör det möjligt för AI-visionssensorn att känna igen fördefinierade färgmönster. Färgkoder är användbara för att identifiera komplexa objekt eller skapa unika markörer för autonom navigering.

# 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 returnerar ett booleskt värde som anger om roboten för närvarande har en sportboll.
True— Roboten har en sportboll.False— Roboten har ingen sportboll.
Usage:
robot.has_sports_ball()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# 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 returnerar ett booleskt värde som anger om roboten för närvarande har någon typ av tunna.
True— Roboten har en tunna.False— Roboten har ingen pipa.
Usage:
robot.has_any_barrel()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# 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 returnerar ett booleskt värde som anger om roboten för närvarande har en blå tunna.
True— Roboten har en blå pipa.False— Roboten har ingen blå pipa.
Usage:
robot.has_blue_barrel()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# 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 returnerar ett booleskt värde som anger om roboten för närvarande har en orange tunna.
True— Roboten har en orange pipa.False— Roboten har ingen orange pipa.
Usage:
robot.has_orange_barrel()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Fastigheter#
Det finns tolv egenskaper som ingår i varje objekt som lagras i en tupel efter att metoden robot.vision.get_data har använts.
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 returnerar ett booleskt värde som anger om indexet finns i tupeln eller inte.
True— Indexet finns.False— Indexet finns inte.
# 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 returnerar bredden på det detekterade objektet i pixlar, vilket är ett heltal mellan 1 och 320.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar höjden på det detekterade objektet i pixlar, vilket är ett heltal mellan 1 och 240.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar x-koordinaten för det detekterade objektets centrum i pixlar, vilket är ett heltal mellan 0 och 320.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar y-koordinaten för det detekterade objektets centrum i pixlar, vilket är ett heltal mellan 0 och 240.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar ett decimaltal (float) som representerar hur långt ett objekt är till vänster eller höger om AI-visionssensorns vy, uttryckt i grader. Värdet 0 betyder att det är centrerat, positiva värden betyder att objektet är till höger och negativa värden betyder att objektet är till vänster.
# 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 returnerar objektets orientering på AI-visionssensorns synplan, mätt i grader från 0 till 359. En färgkod är 0° när dess färger är arrangerade i en horisontell linje (t.ex. röd–blå). Om färgerna roteras ändras vinkeln (t.ex. om man arrangerar blå-röd returneras 180°).
För exemplet nedan har färgkoden konfigurerats med rött till vänster och blått till höger.
I den här bilden motsvarar det att rotera den ursprungliga färgkoden 270 grader åt höger om man lägger blått ovanpå rött.

# 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 returnerar x-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram i pixlar, vilket är ett heltal mellan 0 och 320.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar y-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram i pixlar, vilket är ett heltal mellan 0 och 240.
Obs! Pixelvärdena är relativa till sensorns koordinatsystem. Se diagrammet i inledningen som referens.

# 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 returnerar ID:t för den detekterade AI-klassificeringen eller AprilTag-ID:t som ett heltal.
För ett AprilTag-ID representerar egenskapen .id det detekterade AprilTag-ID-numret i intervallet 0 till 37. För en AI-klassificering motsvarar egenskapen .id det fördefinierade ID:t i avsnittet AI-klassificeringar.
# 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 returnerar konfidenspoängen för den detekterade AI-klassificeringen som ett heltal mellan 1 och 100.
En lägre poäng innebär att sensorn är mindre säker på det detekterade objektet, medan en högre poäng innebär att sensorn är mer säker.
# 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 returnerar ett heltal som anger vilken typ av objekt som upptäckts. Du kan jämföra detta värde med antingen typnumret eller motsvarande namngivna konstant:
Objekttyp |
Inkluderade objekt |
|---|---|
|
— Sportbollar |
|
— AprilTag-ID:n |
|
— Färgsignaturer |
|
— Färgkoder |
# 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örer#
Creating a Color Signature#
En ny färgsignatur skapas med hjälp av konstruktorn Colordesc och registreras sedan hos AI Vision Sensor med hjälp av metoden color_description . Ett Colordesc objekt definierar 1 av upp till 7 detekterbara färgsignaturer för sensorn, men det måste ställas in explicit med hjälp av color_description för att träda i kraft.
Användning av Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Parameter |
Beskrivning |
|---|---|
|
Ett heltal från 1 till 7 som representerar färgsignaturindexet. Om två färgsignaturer använder samma index, kommer den andra att åsidosätta den första. |
|
Ett heltal från 0 till 255 för den röda komponenten av färgen. |
|
Ett heltal från 0 till 255 för den gröna komponenten av färgen. |
|
Ett heltal från 0 till 255 för den blå komponenten av färgen. |
|
Ett flyttal från 1 till 40 som representerar nyansintervallet i grader. |
|
Ett flyttal från 0,10 till 1,00 som representerar mättnadsintervallet. |
färgbeskrivning Användning:
robot.vision.color_description(object)
Parameter |
Beskrivning |
|---|---|
|
|
# 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#
En ny färgkod skapas med hjälp av konstruktorn Codedesc och aktiveras sedan med metoden code_description . En färgkod grupperar 2 till 4 befintliga Colordesc objekt till en enda identifierare som AI-visionssensorn kan detektera som en sekvens, men den måste explicit anges med hjälp av code_description för att träda i kraft.
Användning av Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Parameter |
Beskrivning |
|---|---|
|
Indexet för färgkoden, från 1 till 8. Obs: Om du skapar två |
|
Det första |
|
Det andra |
|
Valfritt. Ett tredje |
|
Valfritt. Ett fjärde |
kodbeskrivning Användning:
robot.vision.code_description(object)
Parameter |
Beskrivning |
|---|---|
|
Ett |
# 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)