Vision#
Einführung#
Der Vision-Sensor der VEX AIR Drohne erkennt und verfolgt AprilTag-IDs. Dadurch kann die Drohne ihre Umgebung analysieren, Objekten folgen und auf Basis der erfassten visuellen Daten reagieren. Nachfolgend finden Sie eine Liste aller verfügbaren Methoden und Eigenschaften:
Getter – Erkennen, ob die Drohne ein Objekt hält.
get_data– Gibt ein Tupel erkannter Objekte für eine bestimmte Signatur zurück.
Eigenschaften – Objektdaten, die von get_data zurückgegeben werden.
exists– Gibt an, ob das Objekt in der aktuellen Erkennung existiert.width– Breite des erkannten Objekts.height– Höhe des erkannten Objekts.centerX– X-Position des Objektmittelpunkts.centerY– Y-Position des Objektmittelpunkts.bearing– Winkel des Objekts relativ zum vorderen Sichtsensor oder die Gradzahl, die erforderlich ist, damit die Drohne auf das Objekt ausgerichtet ist.rotation– Orientierung des Objekts.originX– X-Position der oberen linken Ecke des Objekts.originY– Y-Position der oberen linken Ecke des Objekts.id– Tag-ID des Objekts.type– Gibt den Typ des Objekts zurück.
Getter#
get_data#
get_data filtert Daten aus dem Vision Sensor-Frame zu einer einzelnen Signatur – einer gespeicherten Beschreibung von etwas, das der Sensor erkennen kann, wie z. B. eine AprilTag-ID – und gibt ein Tupel zurück.
The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.
Usage:
drone.vision.get_data(camera, signature, count)
Parameter |
Beschreibung |
|---|---|
|
Die Kamera, von der Daten abgerufen werden sollen: entweder die |
|
Filtert den Datensatz so, dass nur Daten der angegebenen Signatur enthalten sind. Verfügbare Signaturen sind:
|
|
Optional. Legt die maximale Anzahl der zurückzugebenden Objekte zwischen 1 und 24 fest (Standardwert: 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)
Eigenschaften#
Es gibt mehrere Eigenschaften, die zu jedem Objekt gehören, das in einem Tupel gespeichert wird, nachdem get_data verwendet wurde.
Alle Eigenschaftswerte außer .id und .type beschreiben Position, Größe, Ausrichtung oder Richtung des erkannten Objekts zum Zeitpunkt der Verwendung von get_data. Diese Werte werden in Pixeln oder Grad gemessen. Jeder Bildsensor hat eine andere Auflösung.
Frontansicht: 640 x 480 Pixel
Nach unten gerichtet: 640 x 400 Pixel
.exists#
.exists gibt einen booleschen Wert zurück, der angibt, ob der Index im Tupel existiert. Gibt einen Fehler zurück, wenn keine Objekte gefunden wurden.
True– Der Index existiert.False– Der Index existiert nicht.
# 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 gibt die Breite des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 640 zurück.
# 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 gibt die Höhe des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 480 zurück.
# 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 gibt die x-Koordinate des Mittelpunkts des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 640 zurück.
# 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 gibt die y-Koordinate des Mittelpunkts des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 480 zurück.
# 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 gibt einen Winkel zurück, der die Position eines Objekts relativ zur Drohne angibt. Das Verhalten hängt vom verwendeten Sichtsensor ab.
Ein Wert von 0° bedeutet, dass Objekt und Sensor deckungsgleich sind. Positive Werte bedeuten, dass sich das Objekt rechts befindet, negative Werte bedeuten, dass es sich links befindet.
Sensor |
Rücksendungen |
|---|---|
Nach unten |
Gradzahl, um die sich die Vorderseite der Drohne drehen muss, um mit dem Mittelpunkt des Objekts übereinzustimmen, von –180º bis 180º. |
Nach vorne |
Gradzahl, in der das Objekt von der Mitte des Bildsensors nach links oder rechts versetzt ist, von –180º bis 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#
.rotation gibt die Orientierung der erkannten AprilTag-ID als ganze Zahl in Grad von 1 bis 359 zurück.
# 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 gibt die x-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 640 zurück.
# 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 gibt die y-Koordinate der oberen linken Ecke des Begrenzungsrahmens des erkannten Objekts in Pixeln als ganze Zahl von 1 bis 480 zurück.
# 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 gibt die Identifikationsnummer der erkannten AprilTag-ID als ganze Zahl von 0 bis 37 zurück.
# 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 erkannten Objekts zurück. Es wird Folgendes zurückgegeben:
Objekttyp |
Zahlenwert |
Eingeschlossene Objekte |
|---|---|---|
|
8 |
AprilTag-IDs |
|
1 |
Farbsignaturen – Demnächst verfügbar! |
|
2 |
Farbcodes – Demnächst verfügbar! |
# 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)