Wizja#

Wstęp#

Czujnik wizyjny drona VEX AIR wykrywa i śledzi identyfikatory AprilTag. Dzięki temu dron może analizować otoczenie, śledzić obiekty i reagować na podstawie wykrytych danych wizualnych. Poniżej znajduje się lista wszystkich dostępnych metod i właściwości:

Gettery – wykrywają, czy dron trzyma jakiś obiekt.

  • get_data – Zwraca krotkę wykrytych obiektów dla określonego podpisu.

Właściwości – dane obiektu zwrócone z get_data.

  • exists – Czy obiekt istnieje w bieżącym wykryciu.

  • width – Szerokość wykrytego obiektu.

  • height – Wysokość wykrytego obiektu.

  • centerX – pozycja X środka obiektu.

  • centerY – pozycja Y środka obiektu.

  • bearing – Kąt obiektu względem przedniego czujnika wizyjnego lub liczba stopni potrzebna, aby dron był skierowany w stronę obiektu.

  • rotation – Orientacja obiektu.

  • originX – Pozycja X lewego górnego rogu obiektu.

  • originY – Pozycja Y lewego górnego rogu obiektu.

  • id – Identyfikator tagu obiektu.

  • type – Zwraca typ obiektu.

Getters#

get_data#

get_data filtruje dane z ramki czujnika wizyjnego do pojedynczego podpisu — zapisanego opisu czegoś, co czujnik może rozpoznać, na przykład identyfikatora AprilTag — i zwraca krotkę.

Krotka przechowuje obiekty uporządkowane od największego do najmniejszego według szerokości, zaczynając od indeksu 0. Dostęp do właściwości każdego obiektu jest możliwy za pomocą jego indeksu. Jeśli nie zostaną wykryte żadne pasujące obiekty, zwracana jest pusta krotka.

Usage:
drone.vision.get_data(camera, signature, count)

Parametry

Opis

camera

Kamera, z której mają zostać pobrane dane: albo DOWNWARD_CAMERA albo FORWARD_CAMERA.

signature

Filtruje zbiór danych, aby zawierał tylko dane o podanym podpisie. Dostępne podpisy to:

  • ALL_TAGS – Wszystkie identyfikatory AprilTag
  • TAG0 do TAG37 – Pojedynczy identyfikator AprilTag od 0 do 37

count

Opcjonalnie. Ustawia maksymalną liczbę obiektów, które można zwrócić, od 1 do 24 (domyślnie: 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)

Właściwości#

Każdy obiekt przechowywany w krotce zawiera wiele właściwości po użyciu get_data.

Wszystkie wartości właściwości z wyjątkiem .id i .type opisują położenie, rozmiar, orientację lub azymut wykrytego obiektu w momencie użycia get_data. Wartości te są mierzone w pikselach lub stopniach. Każdy czujnik wizyjny ma inną rozdzielczość:

  • Do przodu: 640 x 480 pikseli

  • Skierowany w dół: 640 x 400 pikseli

.exists#

.exists zwraca wartość logiczną wskazującą, czy indeks istnieje w krotce. Zwraca błąd, jeśli nie wykryto żadnych obiektów.

  • True – Indeks istnieje.

  • False – Indeks nie istnieje.

# 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 zwraca szerokość wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca wysokość wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca współrzędną x środka wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca współrzędną y środka wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca kąt wskazujący położenie obiektu względem drona. Zachowanie zależy od użytego czujnika wizyjnego.

Wartość 0° oznacza, że ​​środek obiektu i czujnik są wyrównane. Wartości dodatnie oznaczają, że obiekt znajduje się po prawej stronie, a wartości ujemne – po lewej stronie.

Transduktor

Zwroty

Zniżkowy

Zakres kątów, o jakie musi obrócić się przód drona, aby wyrównać się ze środkiem obiektu, od –180º do 180º.

Do przodu

Stopnie, o jakie obiekt jest przesunięty w lewo lub prawo od środka czujnika wizyjnego, 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#

.rotation zwraca orientację wykrytego identyfikatora AprilTag jako liczbę całkowitą w stopniach 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 zwraca współrzędną x lewego górnego rogu ograniczającego pola wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca współrzędną y lewego górnego rogu ograniczającego pola wykrytego obiektu w pikselach jako liczbę całkowitą 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 zwraca numer identyfikacyjny wykrytego identyfikatora AprilTag jako liczbę całkowitą 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 zwraca typ wykrytego obiektu. Zwróci on następujące informacje:

Typ obiektu

Wartość liczbowa

Dołączone obiekty

drone.vision.TAG_OBJECT

8

Identyfikatory AprilTag

drone.vision.COLOR_OBJECT

1

Sygnatury kolorów – Wkrótce!

drone.vision.CODE_OBJECT

2

Kody kolorów – Już wkrótce!

# 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)