AI-visie#
Invoering#
De AI-visiesensor van de VEX AIM-codeerrobot detecteert en volgt objecten, kleuren en AprilTag-ID’s. Hierdoor kan de robot zijn omgeving analyseren, objecten volgen en reageren op basis van de gedetecteerde visuele gegevens.
De AI-visiesensor heeft een resolutie van 320×240 pixels. Het nulpunt (0, 0) bevindt zich in de linkerbovenhoek, waardoor het midden van de sensor op (160, 120) ligt, zoals weergegeven in het onderstaande diagram:

Hieronder vindt u een lijst van alle methoden en eigenschappen:
Acties — De AI Vision-camerabeelden weergeven of verbergen.
show_aivision— Toont de AI Vision-feed op het scherm van de robot.hide_aivision— Verbergt de AI Vision-feed van het scherm.tag_detection— Schakelt de AprilTag ID-detectie in of uit.
Getters — Detecteren of de robot een object vasthoudt.
get_data— Retourneert een tuple van gedetecteerde objecten voor een specifieke signatuur.has_sports_ball— Geeft aan of de robot een sportbal heeft.has_any_barrel— Geeft aan of de robot een vat van welk type dan ook heeft.has_blue_barrel— Geeft aan of de robot een blauw vat heeft.has_orange_barrel— Geeft aan of de robot een oranje vat heeft.
Eigenschappen — Objectgegevens geretourneerd door get_data.
exists— Geeft aan of het object in de huidige detectie bestaat, als een Booleaanse waarde.width— Breedte van het gedetecteerde object.height— Hoogte van het gedetecteerde object.centerX— X-positie van het middelpunt van het object.centerY— Y-positie van het middelpunt van het object.bearing— Horizontale hoek ten opzichte van de voorkant van de robot.rotation— Oriëntatie van het object.originX— X-positie van de linkerbovenhoek van het object.originY— Y-positie van de linkerbovenhoek van het object.id— Classificatie of tag-ID van het object.score— Vertrouwensscore voor AI-classificaties.type— Retourneert het type van het object (AI, Tag, Kleur of Code).
Constructors — Definieer kleursignaturen en -codes.
Een kleursignatuur maken — Hiermee wordt een nieuwe kleursignatuur gemaakt op basis van RGB- en tint-/verzadigingsbereiken.
Een kleurcode maken — Combineert meerdere kleursignaturen tot één kleurcode.
Acties#
show_aivision#
show_aivision geeft de live datafeed van de AI Vision Sensor weer op het scherm van de robot. De live datafeed bedekt alle andere afbeeldingen of tekst op het scherm.
Opmerking: Het scherm zal geen andere afbeeldingen of tekst weergeven, tenzij hide_aivision wordt gebruikt om de feed te verbergen.
Usage:
robot.screen.show_aivision()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision verwijdert de live datafeed van de AI Vision Sensor van het scherm van de robot.
Usage:
robot.screen.hide_aivision()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# 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 schakelt de AprilTag ID-detectie in of uit, waarbij de status een Booleaanse waarde is.
De sensor kan AprilTag ID’s 0 tot en met 36 uit de Circle21h7-familie detecteren.
Usage:
robot.vision.tag_detection(state)
Parameters |
Beschrijving |
|---|---|
|
De waarden zijn: |
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 filtert gegevens uit het frame van de AI Vision Sensor naar een enkele signatuur — een opgeslagen beschrijving van iets dat de sensor kan herkennen, zoals een vooraf getraind object, een AprilTag ID of een geconfigureerde kleursignatuur of kleurcode — en retourneert een tuple.
Kleursignaturen en Kleurcodes moeten eerst in de AI Vision Utility worden geconfigureerd voordat ze met deze methode kunnen worden gebruikt.
De tuple slaat objecten op, geordend van groot naar klein op basis van breedte, beginnend bij index 0. De eigenschappen van elk object kunnen worden benaderd via de index. Er wordt een lege tuple geretourneerd als er geen overeenkomende objecten worden gevonden.
Usage:
robot.vision.get_data(signature, count)
Parameters |
Beschrijving |
|---|---|
|
Filtert de dataset zodat alleen gegevens met de opgegeven handtekening worden opgenomen. Beschikbare signaturen zijn:
|
|
Optioneel. Hiermee stelt u het maximale aantal objecten in dat kan worden geretourneerd, van 1 tot 24 (standaard: 8). |
Opmerking: AprilTag-ID’s 5 tot en met 37 kunnen worden verkregen door gebruik te maken van de afgedrukte AprilTag-ID’s van 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)
Opmerking: De geretourneerde tuple kan worden gesorteerd op elke eigenschap, niet alleen op breedte, met behulp van de Python-functie sorted Bijvoorbeeld, sorteren op 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)
Of sorteren op hoogte:
# 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)
Gegevens bekijken#
Het afdrukken van de tuple die wordt geretourneerd door get_data geeft een lijst weer van alle eigenschappen van alle gedetecteerde objecten:
# 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-classificaties#
De AIM AI Vision Sensor kan de volgende AI-classificaties detecteren:
ID-nummer |
AI-classificatie |
Handtekening |
|---|---|---|
0 |
Bal |
|
1 |
Blauwe Ton |
|
2 |
Oranje vat |
|
3 |
AIM-robot |
|
Kleursignaturen#
Een kleursignatuur is een unieke kleur die de AI Vision Sensor kan herkennen. Deze signaturen stellen de sensor in staat objecten te detecteren en te volgen op basis van hun kleur. Zodra een kleursignatuur is geconfigureerd, kan de sensor objecten met die specifieke kleur in zijn gezichtsveld identificeren. Kleursignaturen worden gebruikt met get_data om gekleurde objecten in realtime te verwerken en te detecteren.

# 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!")
Kleurcodes#
Een kleurcode is een gestructureerd patroon dat bestaat uit 2 tot 4 kleursignaturen die in een specifieke volgorde zijn gerangschikt. Deze codes stellen de AI-visiesensor in staat om vooraf gedefinieerde kleurpatronen te herkennen. Kleurcodes zijn nuttig voor het identificeren van complexe objecten of het creëren van unieke markeringen voor autonome navigatie.

# 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 retourneert een Booleaanse waarde die aangeeft of de robot momenteel een sportbal heeft.
True— De robot heeft een sportbal.False— De robot heeft geen sportbal.
Usage:
robot.has_sports_ball()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# 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 retourneert een Booleaanse waarde die aangeeft of de robot momenteel een vat van welk type dan ook heeft.
True— De robot heeft een vat.False— De robot heeft geen loop.
Usage:
robot.has_any_barrel()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# 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 retourneert een Booleaanse waarde die aangeeft of de robot momenteel een blauw vat heeft.
True— De robot heeft een blauwe loop.False— De robot heeft geen blauwe loop.
Usage:
robot.has_blue_barrel()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# 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 retourneert een Booleaanse waarde die aangeeft of de robot momenteel een oranje vat heeft.
True— De robot heeft een oranje vat.False— De robot heeft geen oranje vat.
Usage:
robot.has_orange_barrel()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Eigenschappen#
Er zijn twaalf eigenschappen die worden opgenomen bij elk object dat in een tuple wordt opgeslagen nadat de methode robot.vision.get_data is gebruikt.
Alle eigenschapswaarden, behalve .id, .score, en .type , beschrijven de positie, grootte, oriëntatie of richting van het gedetecteerde object op het moment dat robot.vision.get_data werd gebruikt. Deze waarden worden gemeten in pixels of graden, gebaseerd op de resolutie van de sensor van 320 bij 240 pixels.

.exists#
.exists retourneert een Booleaanse waarde die aangeeft of de index in de tuple voorkomt of niet.
True— De index bestaat.False— De index bestaat niet.
# 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 retourneert de breedte van het gedetecteerde object in pixels, wat een geheel getal is tussen 1 en 320.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert de hoogte van het gedetecteerde object in pixels, wat een geheel getal is tussen 1 en 240.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert de x-coördinaat van het middelpunt van het gedetecteerde object in pixels, een geheel getal tussen 0 en 320.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert de y-coördinaat van het middelpunt van het gedetecteerde object in pixels, een geheel getal tussen 0 en 240.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert een decimaal (float) dat aangeeft hoe ver een object zich links of rechts van het midden van het gezichtsveld van de AI Vision Sensor bevindt, uitgedrukt in graden. Een waarde van 0 betekent dat het object in het midden staat, positieve waarden betekenen dat het object zich rechts bevindt en negatieve waarden betekenen dat het object zich links bevindt.
# 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 geeft de oriëntatie van het object op het weergavevlak van de AI Vision Sensor terug, gemeten in graden van 0 tot 359. Een kleurcode is 0° wanneer de kleuren in een horizontale lijn zijn gerangschikt (bijvoorbeeld rood-blauw). Als de kleuren worden gedraaid, verandert de hoek (bijvoorbeeld blauw-rood geeft 180° terug).
In het onderstaande voorbeeld is de kleurcode zo ingesteld dat rood links en blauw rechts staat.
In deze afbeelding komt het plaatsen van blauw bovenop rood overeen met het 270 graden naar rechts draaien van de oorspronkelijke kleurcode.

# 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 retourneert de x-coördinaat van de linkerbovenhoek van de begrenzingsbox van het gedetecteerde object in pixels, wat een geheel getal tussen 0 en 320 is.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert de y-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object in pixels, wat een geheel getal tussen 0 en 240 is.
Opmerking: Pixelwaarden zijn relatief ten opzichte van het coördinatensysteem van de sensor. Zie het diagram in de Inleiding ter referentie.

# 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 retourneert de ID van de gedetecteerde AI-classificatie of AprilTag-ID als een geheel getal.
Voor een AprilTag ID vertegenwoordigt de eigenschap .id het gedetecteerde AprilTag ID-nummer in het bereik van 0 tot 37. Voor een AI-classificatie komt de eigenschap .id overeen met de vooraf gedefinieerde ID in de sectie AI-classificaties.
# 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 retourneert de betrouwbaarheidsscore van de gedetecteerde AI-classificatie als een geheel getal tussen 1 en 100.
Een lagere score betekent dat de sensor minder zeker is van het gedetecteerde object, terwijl een hogere score betekent dat de sensor meer zeker is.
# 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 retourneert een geheel getal dat het type van het gedetecteerde object aangeeft. U kunt deze waarde vergelijken met behulp van het typenummer of de overeenkomstige benoemde constante:
Objecttype |
Inbegrepen objecten |
|---|---|
|
— Sportballen |
|
— AprilTag ID’s |
|
— Kleursignaturen |
|
— Kleurcodes |
# 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)
Constructeurs#
Creating a Color Signature#
Een nieuwe kleursignatuur wordt aangemaakt met behulp van de Colordesc constructor en vervolgens geregistreerd bij de AI Vision Sensor met behulp van de color_description methode. Een Colordesc object definieert 1 van maximaal 7 detecteerbare kleursignaturen voor de sensor, maar deze moet expliciet worden ingesteld met behulp van color_description om effect te sorteren.
Kleurbeschrijvingsgebruik:
Colordesc(index, red, green, blue, hangle, hdsat)
Parameter |
Beschrijving |
|---|---|
|
Een geheel getal van 1 tot 7 dat de index van de kleursignatuur vertegenwoordigt. Als twee kleursignaturen dezelfde index gebruiken, heeft de tweede voorrang op de eerste. |
|
Een geheel getal van 0 tot 255 voor het rode component van de kleur. |
|
Een geheel getal van 0 tot 255 voor de groene component van de kleur. |
|
Een geheel getal van 0 tot 255 voor het blauwe component van de kleur. |
|
Een zwevendekommagetal van 1 tot 40 dat het kleurbereik in graden weergeeft. |
|
Een zwevendekommagetal tussen 0,10 en 1,00 dat het verzadigingsbereik aangeeft. |
kleurbeschrijving Gebruik:
robot.vision.color_description(object)
Parameter |
Beschrijving |
|---|---|
|
Het object |
# 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#
Een nieuwe kleurcode wordt aangemaakt met behulp van de Codedesc constructor en vervolgens geactiveerd met behulp van de code_description methode. Een kleurcode groepeert 2 tot 4 bestaande Colordesc objecten in één enkele identifier die de AI Vision Sensor als een reeks kan detecteren, maar deze moet expliciet worden ingesteld met behulp van code_description om effect te sorteren.
Gebruik van Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Parameter |
Beschrijving |
|---|---|
|
De index van de kleurcode, van 1 tot 8. Let op: als u twee objecten van het type |
|
Het eerste |
|
Het tweede |
|
Optioneel. Een derde |
|
Optioneel. Een vierde |
code_description Gebruik:
robot.vision.code_description(object)
Parameter |
Beschrijving |
|---|---|
|
Een |
# 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)