رؤية#

مقدمة#

يكتشف مستشعر الرؤية في طائرة VEX AIR بدون طيار ويتتبع معرّفات AprilTag. يُمكّن هذا الطائرة من تحليل محيطها، ومتابعة الأجسام، والتفاعل بناءً على البيانات المرئية المكتشفة. فيما يلي قائمة بجميع الطرق والخصائص المتاحة:

أجهزة الالتقاط – الكشف عما إذا كانت الطائرة بدون طيار تحمل جسماً ما.

  • get_data – تُرجع مجموعة من الكائنات المكتشفة لتوقيع معين.

الخصائص – بيانات الكائن المُعادة من get_data.

  • exists – ما إذا كان الكائن موجودًا في عملية الكشف الحالية.

  • width – عرض الكائن المكتشف.

  • height – ارتفاع الكائن المكتشف.

  • centerX – موضع مركز الكائن على المحور X.

  • centerY – موضع مركز الكائن على المحور Y.

  • bearing – زاوية الجسم بالنسبة لمستشعر الرؤية الأمامي أو الدرجات اللازمة للطائرة بدون طيار لمواجهة الجسم.

  • rotation – اتجاه الكائن.

  • originX – موضع X للزاوية العلوية اليسرى للكائن.

  • originY – موضع Y للزاوية العلوية اليسرى للكائن.

  • id – معرف الوسم للكائن.

  • type – يُرجع نوع الكائن.

المحصلون#

get_data#

get_data يقوم بتصفية البيانات من إطار مستشعر الرؤية إلى توقيع واحد - وصف محفوظ لشيء يمكن للمستشعر التعرف عليه، مثل معرف AprilTag - ويعيد مجموعة.

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)

حدود

وصف

camera

الكاميرا التي سيتم استرجاع البيانات منها: إما الكاميرا DOWNWARD_CAMERA أو الكاميرا FORWARD_CAMERA.

signature

يقوم هذا الإجراء بتصفية مجموعة البيانات بحيث لا تتضمن إلا البيانات التي تحمل التوقيع المحدد. التوقيعات المتاحة هي:

  • ALL_TAGS - جميع معرّفات AprilTag
  • TAG0 إلى TAG37 - معرّف AprilTag واحد من 0 إلى 37

count

اختياري. يحدد الحد الأقصى لعدد العناصر التي يمكن إرجاعها من 1 إلى 24 (الافتراضي: 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)

ملكيات#

هناك خصائص متعددة يتم تضمينها مع كل كائن مخزن في tuple بعد استخدام get_data.

All property values except .id and .type describe the detected object’s position, size, orientation, or bearing at the moment get_data was used. These values are measured in pixels or degrees. Each Vision Sensor has a different resolution:

  • الشاشة الأمامية: 640 × 480 بكسل

  • موجه للأسفل: 640 × 400 بكسل

.exists#

.exists تُرجع قيمة منطقية تُشير إلى ما إذا كان الفهرس موجودًا في المجموعة. تُرجع خطأً في حال عدم وجود أي كائنات مُكتشفة.

  • True - الفهرس موجود.

  • False – الفهرس غير موجود.

# 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 تُرجع عرض الكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 تُرجع ارتفاع الكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 تُرجع الإحداثي السيني لمركز الكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 تُرجع إحداثيات y لمركز الكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 زاويةً تُشير إلى موقع الجسم بالنسبة للطائرة المسيّرة. ويعتمد سلوكها على نوع مستشعر الرؤية المُستخدم.

تشير قيمة 0° إلى أن مركز الجسم والمستشعر متطابقان. القيم الموجبة تعني أن الجسم يقع على اليمين، بينما القيم السالبة تعني أن الجسم يقع على اليسار.

مستشعر

المرتجعات

إلى الأسفل

يجب أن تدور مقدمة الطائرة بدون طيار بزاوية من -180 درجة إلى 180 درجة لتتماشى مع مركز الجسم.

إلى الأمام

الدرجات التي يتم إزاحة الجسم بها إلى اليسار أو اليمين من مركز مستشعر الرؤية من -180 درجة إلى 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 تُرجع اتجاه معرف AprilTag المكتشف كعدد صحيح بالدرجات من 1 إلى 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 تُرجع الإحداثي السيني للزاوية العلوية اليسرى من المربع المحيط بالكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 تُرجع إحداثيات y للزاوية العلوية اليسرى للمربع المحيط بالكائن المكتشف بالبكسل كعدد صحيح من 1 إلى 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 تُرجع رقم تعريف AprilTag ID المكتشف كعدد صحيح من 0 إلى 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 تُعيد نوع الكائن الذي تم اكتشافه. وستُعيد ما يلي:

نوع الكائن

القيمة العددية

الكائنات المضمنة

drone.vision.TAG_OBJECT

8

معرفات AprilTag

drone.vision.COLOR_OBJECT

1

التوقيعات اللونية - قريبًا!

drone.vision.CODE_OBJECT

2

رموز الألوان - قريبًا!

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