Látomás#
Bevezetés#
A VEX AIR drón vizuális érzékelője érzékeli és nyomon követi az AprilTag azonosítókat. Ez lehetővé teszi a drón számára, hogy elemezze a környezetét, kövesse a tárgyakat, és a detektált vizuális adatok alapján reagáljon. Az alábbiakban felsoroljuk az összes elérhető módszert és tulajdonságot:
Getterek – Észlelik, ha a drón tart egy tárgyat.
get_data– Egy adott aláíráshoz tartozó észlelt objektumok egy tuple-jét adja vissza.
Tulajdonságok – A get_data függvényből visszaadott objektumadatok.
exists– Létezik-e az objektum az aktuális észlelésben.width– Az érzékelt objektum szélessége.height– Az érzékelt tárgy magassága.centerX– Az objektum középpontjának X pozíciója.centerY– Az objektum középpontjának Y pozíciója.bearing– A tárgy szöge az elülső vizuális érzékelőhöz képest, vagy az a fok, amely ahhoz szükséges, hogy a drón a tárgy felé forduljon.rotation– Az objektum orientációja.originX– Az objektum bal felső sarkának X pozíciója.originY– Az objektum bal felső sarkának Y pozíciója.id– Az objektum címkeazonosítója.type– Visszaadja az objektum típusát.
Getterek#
get_data#
get_data A Vision Sensor keretéből származó adatokat egyetlen aláírásra szűri – egy mentett leírásra, amit az érzékelő felismer, például egy AprilTag azonosítóra –, és egy tuple-t ad vissza.
A tuple a 0 indexszel kezdődően, szélesség szerint a legnagyobbtól a legkisebbig rendezve tárolja az objektumokat. Minden objektum properties tulajdonsága a hozzá tartozó index segítségével érhető el. Ha nem található egyező objektum, akkor egy üres tuple kerül visszaadásra.
Usage:
drone.vision.get_data(camera, signature, count)
Paraméterek |
Leírás |
|---|---|
|
A kamera, amelyről az adatokat lekérni kell: vagy a |
|
Úgy szűri az adathalmazt, hogy csak az adott aláírás adatait tartalmazza. Az elérhető aláírások:
|
|
Opcionális. Beállítja a visszaadható objektumok maximális számát 1 és 24 között (alapértelmezett: 8). |
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
Tulajdonságok#
Több tulajdonság is tartozik minden egyes objektumhoz, melyeket egy tuple tárolunk a get_data használata után.
.id és .type kivételével az összes tulajdonságérték a detektált objektum pozícióját, méretét, tájolását vagy irányát írja le a get_data használatának pillanatában. Ezeket az értékeket pixelben vagy fokban mérjük. Minden vizuális érzékelőnek más a felbontása:
Előre néző: 640 x 480 pixel
Lefelé néző: 640 x 400 pixel
.exists#
.exists Egy logikai értéket ad vissza, amely jelzi, hogy az index létezik-e a tuple-ben. Hibát ad vissza, ha nincsenek észlelt objektumok.
True– Az index létezik.False– Az index nem létezik.
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
.width#
.width Visszaadja a detektált objektum szélességét pixelben, 1 és 640 közötti egész számként.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].width > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.height#
.height A detektált objektum magasságát adja vissza pixelben, 1 és 480 közötti egész számként.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].height > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.centerX#
.centerX Visszaadja a detektált objektum középpontjának x koordinátáját pixelben, 1 és 640 közötti egész számként.
# Show if an AprilTag ID is to the left or the right of the camera
while True:
clear_console()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerX < 320:
print("To the left!")
else:
print("To the right!")
wait(0.2, SECONDS)
.centerY#
.centerY Visszaadja a detektált objektum középpontjának y koordinátáját pixelben, 1 és 480 közötti egész számként.
# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerY < 240:
print("Below the target!")
else:
print("Above the target!")
else:
print("No target found!")
.bearing#
.bearing egy szöget ad vissza, amely egy objektum drónhoz viszonyított helyzetét jelzi. A viselkedés attól függ, hogy melyik vizuális érzékelőt használják.
A 0° érték azt jelzi, hogy az objektum közepe és az érzékelő egy vonalban vannak. A pozitív értékek azt jelentik, hogy az objektum jobbra, míg a negatív értékek azt jelentik, hogy az objektum balra van.
Érzékelő |
Visszaküldések |
|---|---|
Lefelé |
Hány fokban kell a drón elejének elfordulnia, hogy a tárgy közepéhez igazodjon, -180º és 180º között. |
Előre |
Az objektumnak a vizuális érzékelő közepétől balra vagy jobbra eltolt szöge –180º és 180º között. |
# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if -20 < vision_data[0].bearing < 20:
# Hover once sensor is centered on AprilTag ID
drone.hover()
controller.sound.play(SUCCESS)
while controller.sound.is_active():
wait(50, MSEC)
elif vision_data[0].bearing < -21:
drone.turn(LEFT)
else:
drone.turn(RIGHT)
wait(5, MSEC)
.rotation#
.rotation A 0 függvény visszaadja az észlelt AprilTag azonosító tájolását egész számként, 1 és 359 közötti fokban.
# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if 240 < vision_data[0].rotation < 300:
drone.turn_for(LEFT, 90)
elif 60 < vision_data[0].rotation < 120:
drone.turn_for(RIGHT, 90)
else:
drone.hover()
wait(0.2, SECONDS)
.originX#
.originX Visszaadja az észlelt objektum határolókeretének bal felső sarkának x koordinátáját pixelben, 1 és 640 közötti egész számként.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.originY#
.originY Visszaadja az észlelt objektum határolókeretének bal felső sarkának y koordinátáját pixelben, 1 és 480 közötti egész számként.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.id#
.id A rendszer visszaadja az észlelt AprilTag ID azonosítószámát 0 és 37 közötti egész számként.
# Display the detected AprilTag ID
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
print(vision_data[0].id)
wait(0.2, SECONDS)
.type#
.type függvény visszaadja az észlelt objektum típusát. A következő értéket adja vissza:
Objektumtípus |
Numerikus érték |
Belefoglalt objektumok |
|---|---|---|
|
8 |
AprilTag azonosítók |
|
1 |
Színaláírások - Hamarosan! |
|
2 |
Színkódok - Hamarosan! |
# Display what AprilTag ID is detected
while True:
controller.screen.clear_screen()
controller.screen.set_cursor(1, 1)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].type == drone.vision.TAG_OBJECT:
controller.screen.print("AprilTag ID: ")
controller.screen.print(vision_data[0].id)
wait(0.1, SECONDS)