দৃষ্টি#

ভূমিকা#

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 ভিশন সেন্সর ফ্রেম থেকে ডেটা ফিল্টার করে একটি একক সিগনেচারে—যা সেন্সর দ্বারা শনাক্তযোগ্য কোনো কিছুর একটি সংরক্ষিত বিবরণ, যেমন একটি এপ্রিলট্যাগ আইডি—পরিণত করে এবং একটি টাপল রিটার্ন করে।

টাপলটি অবজেক্টগুলিকে প্রস্থ অনুসারে বৃহত্তম থেকে ক্ষুদ্রতম ক্রমে সংরক্ষণ করে, যা সূচক 0 থেকে শুরু হয়। প্রতিটি অবজেক্টের বৈশিষ্ট্য তার সূচক ব্যবহার করে অ্যাক্সেস করা যেতে পারে। যদি কোনও মিলে যাওয়া অবজেক্ট সনাক্ত করা না যায় তবে একটি খালি টাপল ফেরত দেওয়া হয়।

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

প্যারামিটার

বর্ণনা

camera

যে ক্যামেরা থেকে ডেটা সংগ্রহ করতে হবে: হয় DOWNWARD_CAMERA অথবা FORWARD_CAMERA।

signature

প্রদত্ত সিগনেচারের ডেটা অন্তর্ভুক্ত করার জন্য ডেটাসেটটি ফিল্টার করে। উপলব্ধ সিগনেচারগুলো হলো:

  • ALL_TAGS - সমস্ত এপ্রিলট্যাগ আইডি
  • TAG0 থেকে TAG37 - ০ থেকে ৩৭ পর্যন্ত একটি একক এপ্রিলট্যাগ আইডি

count

ঐচ্ছিক। ১ থেকে ২৪ পর্যন্ত ফেরতযোগ্য অবজেক্টের সর্বোচ্চ সংখ্যা নির্ধারণ করে (ডিফল্ট: ৮)।

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

বৈশিষ্ট্য#

get_data ব্যবহার করার পরে tuple তে সংরক্ষিত প্রতিটি অবজেক্টের সাথে একাধিক বৈশিষ্ট্য অন্তর্ভুক্ত থাকে।

.id এবং .type ব্যতীত সমস্ত প্রপার্টি মান get_data ব্যবহার করার মুহূর্তে সনাক্ত করা বস্তুর অবস্থান, আকার, অভিমুখ বা দিক বর্ণনা করে। এই মানগুলি পিক্সেল বা ডিগ্রিতে পরিমাপ করা হয়। প্রতিটি ভিশন সেন্সরের একটি ভিন্ন রেজোলিউশন রয়েছে:

  • সম্মুখমুখী: ৬৪০ x ৪৮০ পিক্সেল

  • নিম্নমুখী: ৬৪০ x ৪০০ পিক্সেল

.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 শনাক্তকৃত অবজেক্টের প্রস্থ পিক্সেলে ১ থেকে ৬৪০ পর্যন্ত একটি পূর্ণসংখ্যা হিসেবে ফেরত দেয়।

# 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 শনাক্তকৃত বস্তুটির উচ্চতা পিক্সেলে ১ থেকে ৪৮০ পর্যন্ত একটি পূর্ণসংখ্যা হিসেবে ফেরত দেয়।

# 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 শনাক্তকৃত বস্তুর কেন্দ্রের x-স্থানাঙ্ককে পিক্সেলে 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 ড্রোনটির সাপেক্ষে কোনো বস্তুর অবস্থান নির্দেশকারী একটি কোণ ফেরত দেয়। এর আচরণ ব্যবহৃত ভিশন সেন্সরের উপর নির্ভর করে।

০° মান নির্দেশ করে যে বস্তু এবং সেন্সরের কেন্দ্র একই সরলরেখায় রয়েছে। ধনাত্মক মানের অর্থ হলো বস্তুটি ডানদিকে, আর ঋণাত্মক মানের অর্থ হলো বস্তুটি বামদিকে।

সেন্সর

ফেরত

নিচের দিকে

বস্তুটির কেন্দ্রের সাথে সারিবদ্ধ হতে ড্রোনটির সামনের অংশকে –১৮০º থেকে ১৮০º পর্যন্ত কত ডিগ্রি ঘোরাতে হবে।

ফরোয়ার্ড

ভিশন সেন্সরের কেন্দ্র থেকে বস্তুটি বাম বা ডান দিকে –১৮০º থেকে ১৮০º পর্যন্ত কত ডিগ্রিতে সরে আছে।

# 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 ID-র অভিমুখ 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 শনাক্তকৃত বস্তুর বাউন্ডিং বক্সের উপরের-বাম কোণার x-স্থানাঙ্ককে পিক্সেলে 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-এর শনাক্তকরণ নম্বরটি ০ থেকে ৩৭-এর মধ্যে একটি পূর্ণসংখ্যা হিসেবে ফেরত দেয়।

# 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

৮

এপ্রিলট্যাগ আইডি

drone.vision.COLOR_OBJECT

১

রঙিন স্বাক্ষর - শীঘ্রই আসছে!

drone.vision.CODE_OBJECT

২

রঙের কোড - শীঘ্রই আসছে!

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