Penglihatan#

Perkenalan#

Sensor penglihatan pada drone VEX AIR mendeteksi dan melacak ID AprilTag. Hal ini memungkinkan drone untuk menganalisis lingkungan sekitarnya, mengikuti objek, dan bereaksi berdasarkan data visual yang terdeteksi. Berikut adalah daftar semua metode dan properti yang tersedia:

Pengambil – Mendeteksi apakah drone sedang memegang suatu objek.

  • get_data – Mengembalikan tuple objek yang terdeteksi untuk tanda tangan tertentu.

Properti – Data objek yang dikembalikan dari get_data.

  • exists – Apakah objek tersebut ada dalam deteksi saat ini.

  • width – Lebar objek yang terdeteksi.

  • height – Tinggi objek yang terdeteksi.

  • centerX – Posisi X dari pusat objek.

  • centerY – Posisi Y dari pusat objek.

  • bearing – Sudut objek relatif terhadap Sensor Visi depan atau derajat yang dibutuhkan agar drone menghadap objek.

  • rotation – Orientasi objek.

  • originX – Posisi X dari sudut kiri atas objek.

  • originY – Posisi Y dari sudut kiri atas objek.

  • id – ID Tag dari objek.

  • type – Mengembalikan tipe objek.

Pencari#

get_data#

get_data menyaring data dari frame Vision Sensor ke satu tanda tangan tunggal — deskripsi tersimpan tentang sesuatu yang dapat dikenali oleh sensor, seperti ID AprilTag — dan mengembalikan sebuah tuple.

Tuple menyimpan objek yang diurutkan dari yang terbesar hingga terkecil berdasarkan lebar, dimulai dari indeks 0. Properti setiap objek dapat diakses menggunakan indeksnya. Tuple kosong akan dikembalikan jika tidak ada objek yang cocok yang terdeteksi.

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

Parameter

Keterangan

camera

Kamera yang akan diambil datanya: baik DOWNWARD_CAMERA atau FORWARD_CAMERA.

signature

Memfilter dataset agar hanya menyertakan data dengan tanda tangan yang diberikan. Tanda tangan yang tersedia adalah:

  • ALL_TAGS - Semua ID AprilTag
  • TAG0 hingga TAG37 - Satu ID AprilTag dari 0 hingga 37

count

Opsional. Mengatur jumlah maksimum objek yang dapat dikembalikan dari 1 hingga 24 (default: 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)

Properti#

Terdapat beberapa properti yang disertakan dengan setiap objek yang disimpan dalam tuple setelah get_data digunakan.

Semua nilai properti kecuali .id dan .type menjelaskan posisi, ukuran, orientasi, atau bantalan objek yang terdeteksi pada saat get_data digunakan. Nilai-nilai ini diukur dalam piksel atau derajat. Setiap Sensor Visi memiliki resolusi yang berbeda:

  • Tampilan depan: 640 x 480 piksel

  • Menghadap ke bawah: 640 x 400 piksel

.exists#

.exists mengembalikan nilai Boolean yang menunjukkan apakah indeks tersebut ada dalam tuple. Mengembalikan kesalahan jika tidak ada objek yang terdeteksi.

  • True – Indeks tersebut ada.

  • False – Indeks tidak ada.

# 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 mengembalikan lebar objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan tinggi objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan koordinat x dari pusat objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan koordinat y dari pusat objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan sudut yang menunjukkan posisi objek relatif terhadap drone. Perilakunya bergantung pada Sensor Visi mana yang digunakan.

Nilai 0° menunjukkan bahwa pusat objek dan sensor sejajar. Nilai positif berarti objek berada di sebelah kanan, sedangkan nilai negatif berarti objek berada di sebelah kiri.

Sensor

Pengembalian

Ke bawah

Derajat putaran bagian depan drone agar sejajar dengan pusat objek, dari –180º hingga 180º.

Maju

Derajat pergeseran objek ke kiri atau ke kanan dari pusat Sensor Penglihatan, dari –180º hingga 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 mengembalikan orientasi ID AprilTag yang terdeteksi sebagai bilangan bulat dalam derajat dari 1 hingga 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 mengembalikan koordinat x dari sudut kiri atas kotak pembatas objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan koordinat y dari sudut kiri atas kotak pembatas objek yang terdeteksi dalam piksel sebagai bilangan bulat dari 1 hingga 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 mengembalikan nomor identifikasi dari ID AprilTag yang terdeteksi sebagai bilangan bulat dari 0 hingga 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 mengembalikan tipe objek yang terdeteksi. Ini akan mengembalikan hal berikut:

Jenis Objek

Nilai Numerik

Objek yang disertakan

drone.vision.TAG_OBJECT

8

ID AprilTag

drone.vision.COLOR_OBJECT

1

Tanda tangan warna - Segera Hadir!

drone.vision.CODE_OBJECT

2

Kode warna - Segera Hadir!

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