Vidění#
Zavedení#
Vizuální senzor dronu VEX AIR detekuje a sleduje identifikátory AprilTag. To umožňuje dronu analyzovat okolí, sledovat objekty a reagovat na základě detekovaných vizuálních dat. Níže je uveden seznam všech dostupných metod a vlastností:
Gettery – Detekují, zda dron drží nějaký předmět.
get_data– Vrátí n-tici detekovaných objektů pro specifický podpis.
Vlastnosti – Data objektu vrácená z get_data.
exists– Zda objekt existuje v aktuální detekci.width– Šířka detekovaného objektu.height– Výška detekovaného objektu.centerX– Pozice středu objektu na souřadnici X.centerY– Pozice středu objektu v ose Y.bearing– Úhel objektu vzhledem k přednímu vizuálnímu senzoru nebo stupně potřebné k tomu, aby se dron natočil k objektu.rotation– Orientace objektu.originX– Pozice X levého horního rohu objektu.originY– Pozice Y levého horního rohu objektu.id– ID tagu objektu.type– Vrátí typ objektu.
Gettery#
get_data#
Funkce get_data filtruje data z rámce Vision Sensor do jediného podpisu – uloženého popisu něčeho, co senzor dokáže rozpoznat, například ID AprilTag – a vrací n-tici.
N-tice ukládá objekty seřazené od největší po nejmenší podle šířky, počínaje indexem 0. K vlastnostem properties každého objektu lze přistupovat pomocí jeho indexu. Pokud nejsou detekovány žádné odpovídající objekty, vrátí se prázdná n-tice.
Usage:
drone.vision.get_data(camera, signature, count)
Parametry |
Popis |
|---|---|
|
Kamera, ze které se mají načítat data: buď |
|
Filtruje datovou sadu tak, aby obsahovala pouze data daného podpisu. Dostupné podpisy jsou:
|
|
Volitelné. Nastavuje maximální počet objektů, které lze vrátit, od 1 do 24 (výchozí: 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)
Nemovitosti#
Každý objekt uložený v n-tici tuple po použití funkce get_data obsahuje několik vlastností.
Všechny hodnoty vlastností kromě .id a .type popisují polohu, velikost, orientaci nebo azimut detekovaného objektu v okamžiku, kdy byla použita funkce get_data. Tyto hodnoty se měří v pixelech nebo stupních. Každý kamerový senzor má jiné rozlišení:
Přední displej: 640 x 480 pixelů
Směr dolů: 640 x 400 pixelů
.exists#
.exists vrací booleovskou hodnotu, která indikuje, zda index v n-tici existuje. Vrátí chybu, pokud nejsou detekovány žádné objekty.
True– Index existuje.False– Index neexistuje.
# 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 vrací šířku detekovaného objektu v pixelech jako celé číslo od 1 do 640.
# 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 vrací výšku detekovaného objektu v pixelech jako celé číslo od 1 do 480.
# 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 vrací souřadnici x středu detekovaného objektu v pixelech jako celé číslo od 1 do 640.
# 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 vrací souřadnici y středu detekovaného objektu v pixelech jako celé číslo od 1 do 480.
# 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 vrací úhel označující polohu objektu vzhledem k dronu. Chování závisí na použitém vizuálním senzoru.
Hodnota 0° značí, že střed objektu a senzor jsou zarovnány. Kladné hodnoty znamenají, že objekt je vpravo, zatímco záporné hodnoty znamenají, že objekt je vlevo.
Senzor |
Vrácení zboží |
|---|---|
Dolů |
Úhly, o které se musí přední část dronu otočit, aby se zarovnala se středem objektu, od –180º do 180º. |
Vpřed |
Úhel posunutí objektu doleva nebo doprava od středu obrazového senzoru od –180º do 180º. |
# 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#
Funkce .rotation vrací orientaci detekovaného ID AprilTag jako celé číslo ve stupních od 1 do 359.
# 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 vrací souřadnici x levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech jako celé číslo od 1 do 640.
# 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 vrací souřadnici y levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech jako celé číslo od 1 do 480.
# 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 vrací identifikační číslo detekovaného ID AprilTag jako celé číslo od 0 do 37.
# 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 vrací typ detekovaného objektu. Vrátí následující:
Typ objektu |
Číselná hodnota |
Zahrnuté objekty |
|---|---|---|
|
8 |
ID tagů April |
|
1 |
Barevné podpisy - Již brzy! |
|
2 |
Barevné kódy - Již brzy! |
# 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)