FIRA Air – Autonomous Race Simulation · U14 / U19

Autonomous Air Simulation

نسخه‌ی شبیه‌سازی‌شده‌ی مسابقه‌ی FIRA Air Autonomous Race. هر تیم برای یک DJI Tello مجازی برنامه می‌نویسد که بدون خلبان انسانی از سکوی برخاست بلند شود، به‌ترتیب از دروازه‌ها عبور کند، به هیچ‌چیز نخورد و روی سکوی فرود «H» بنشیند. همان کد و همان کتابخانه‌ی Tello واقعی (DJITelloPy) کار می‌کند؛ بدون پهپاد، بدون سالن پرواز، بدون خطر سقوط.

پهپاد در حال عبور از دروازه
یک تلاش در حال اجرا: «Gate 1 passed»، تصویر دوربین Tello (۶۴۰×۴۸۰)، تله‌متری و گزارش زمان‌دار داور
این لیگ چیست

یک پهپاد، یک پیست، ۱۵ دقیقه

پیست یک سالن سه‌بعدی است با سکوی برخاست، تعدادی دروازه‌ی رنگی با نشانگر AprilTag زیر هر دروازه، یک یا چند ناحیه‌ی امتیازی و یک یا چند سکوی فرود. هر تیم یک جلسه‌ی رسمی ۱۵ دقیقه‌ای دارد و در این مدت می‌تواند هر تعداد تلاش انجام دهد؛ هر تلاش ناموفق (برخورد، جا انداختن دروازه، ترتیب اشتباه، خروج از محدوده، فرود بیرون سکو) یک امتیاز منفی دارد.

تکمیل کامل مسیر ۲۵ امتیاز پایه دارد. امتیاز نهایی S = (B − P) × Ka است که B بهترین امتیاز پایه، P تعداد تلاش‌های ناموفق و Ka = 1 (پردازش خارج از پهپاد). در U19 رتبه‌بندی با امتیاز و سپس کمترین زمان؛ در U14 دو پهپاد هم‌زمان در دو مسیر یکسان (Lane A و Lane B) مسابقه می‌دهند، با مسیر ساده‌تر و سکوی فرود ثابت.

DJI Telloمدل مجازی رسمی، یکسان برای همه
۱۵ دقیقهجلسه‌ی رسمی با تلاش نامحدود
۲۵ امتیازبیشینه‌ی امتیاز پایه، −۱ هر تلاش ناموفق
PythonDJITelloPy + OpenCV + pupil-apriltags
AprilTag 36h11نشانگرهای ثابت زیر دروازه‌ها
U14 · U19U14 دومسیره، U19 پیست کامل
مهارت‌هایی که یاد می‌گیرید: Python، بینایی ماشین (OpenCV و AprilTag)، کنترل پرواز، برنامه‌ریزی گام‌به‌گام مسیر، مدیریت ریسک و توضیح کد. همین کد را بعدها می‌توان روی Tello واقعی آزمود.
محیط شبیه‌ساز

FIRA Air Studio چه شکلی است؟

تصاویر از نسخه‌ی رسمی Windows (FIRA Air Studio 0.0.1) گرفته شده‌اند.

راهنمای اجرا

چطور شبیه‌ساز را باز کنیم و کد را روی پهپاد اجرا کنیم؟

نصب Python و کتابخانه‌ها

Python 3.10 یا جدیدتر را نصب کنید (در نصب، گزینه‌ی Add to PATH را بزنید). سپس در ترمینال:

python -m pip install djitellopy pupil-apriltags opencv-python

DJITelloPy فرمان‌های واقعی Tello را با متدهای ساده می‌فرستد؛ pupil-apriltags نشانگرها را تشخیص می‌دهد؛ OpenCV تصویر را پردازش می‌کند.

دانلود و باز کردن FIRA Air Studio

فایل FIRA-Air-Studio-0.0.1.exe (حدود ۲۰۰ مگابایت) را دانلود کنید و اجرا کنید. اگر ویندوز پیام «Windows protected your PC» داد: More info ← Run anyway. برنامه کاملاً آفلاین کار می‌کند. در اولین اجرا، Studio به‌طور خودکار Python نصب‌شده روی سیستم را پیدا می‌کند («بررسی محیط»)؛ اگر خطایی گزارش داد، نصب Python را بررسی کنید.

Practice: اولین پرواز

روی Practice بزنید تا صفحه‌ی پیست باز شود. پهپاد روی سکوی H داخل Safe Zone است. تا وقتی پهپاد از Safe Zone بیرون نرفته، پروازهای تمرینی به‌عنوان تلاش رسمی شمرده نمی‌شوند.

بارگذاری و اجرای کد

با Open file فایل Python خود (مثلاً first_flight.py) یا با Open folder پوشه‌ی پروژه را باز کنید و اجرا کنید. کد شما دقیقاً مثل یک Tello واقعی با Tello() و connect() وصل می‌شود؛ Studio ارتباط شبکه را به پهپاد مجازی هدایت می‌کند (شبکه‌ی پهپاد مجازی، VDN). لازم نیست هیچ کد شبکه‌ای بنویسید یا آدرس IP تغییر دهید.

تلاش رسمی و داوری

در جلسه‌ی مسابقه، پیش از هر تلاش Start attempt [Space] را بزنید (اعلام تلاش). داور داخلی عبور از دروازه‌ها، برخورد، فرود و زمان را ثبت می‌کند و امتیاز را با فرمول S = (B − P) × Ka نشان می‌دهد. Judge a match همین حالت را برای داوران فراهم می‌کند. Import package بسته‌ی کد تحویلی یک تیم را بارگذاری می‌کند.

اولین پرواز: first_flight.py

from djitellopy import Tello

drone = Tello()
drone.connect()
print("Battery:", drone.get_battery(), "%")
try:
    drone.takeoff()
    drone.move_forward(100)   # 100 cm
    drone.land()
finally:
    drone.end()

تشخیص AprilTag: find_apriltag.py

from djitellopy import Tello
from pupil_apriltags import Detector
import cv2

drone = Tello()
detector = Detector(families="tag36h11")
drone.connect()
drone.streamon()
try:
    camera = drone.get_frame_read()
    while True:
        frame = camera.frame
        if frame is None:
            continue
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        for tag in detector.detect(gray):
            x, y = map(int, tag.center)
            print("AprilTag ID:", tag.tag_id)
            cv2.circle(frame, (x, y), 5, (0, 255, 0), -1)
        cv2.imshow("AprilTag Detector", frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
finally:
    drone.end()
    cv2.destroyAllWindows()
هشدار مهم: به سمت مرکز AprilTag پرواز نکنید! نشانگر زیر دهانه‌ی دروازه نصب شده؛ اگر پهپاد به مرکز تگ نشانه برود به قاب پایینی می‌خورد. باید از فضای باز دروازه با فاصله‌ی کافی برای کل بدنه‌ی پهپاد عبور کنید.
کد پایه

کد پایه‌ی Air — چهار برنامه‌ی آماده برای FIRA Air Studio

از اولین برخاستن تا اسکلت یک تلاش کامل مسابقه. همه با DJITelloPy نوشته شده‌اند و بدون هیچ تغییری روی Tello واقعی هم کار می‌کنند.

نصب

python -m pip install -r requirements.txt

سه کتابخانه: djitellopy، pupil-apriltags، opencv-python.

اجرا

FIRA Air Studio را باز کنید و Practice را بزنید، سپس فایل را با Open file در Studio یا با python first_flight.py در ترمینال اجرا کنید. Studio ارتباط Tello را خودش به پهپاد مجازی وصل می‌کند.

مسیر مسابقه

در race_base.py لیست ROUTE را با اندازه‌های پیست رسمی پر کنید (U14 همین کافی است). برای U19، USE_VISION = True و شناسه‌ی AprilTag هر دروازه را در GATE_TAG_IDS بنویسید تا پیش از هر دروازه با دوربین تراز شود.

فایلچه کار می‌کنددرس
first_flight.pyبرخاستن، ۱۰۰ سانتی‌متر جلو، فرود۱
telemetry.pyخواندن باتری/ارتفاع/yaw و نگه داشتن ارتفاع با حلقه‌ی تناسبی و send_rc_control۳
camera_apriltag.pyنمایش دوربین، تشخیص AprilTag 36h11 و محاسبه‌ی خطای افقی۴–۶
race_base.pyاسکلت تلاش مسابقه: مسیر دستوری + تراز اختیاری با AprilTag + فرود ایمن در خطا۷–۱۱
طرح درس

طرح درس Air — از اولین برخاستن تا مسابقه‌ی آزمایشی ۱۵ دقیقه‌ای

بر پایه‌ی «راهنمای برنامه‌نویسی دانش‌آموزی FIRA Air Simulation، نسخه‌ی ۱.۱ (اکتبر ۲۰۲۶)». هر جلسه حدود ۹۰ دقیقه. U14 می‌تواند با دنباله‌ی ثابت فرمان‌ها مسیر را کامل کند؛ U19 بینایی ماشین و تصحیح خودکار را اضافه می‌کند.

۱مبانی پهپاد و مدل فرمان Tello؛ اولین پروازکدنویسی
مفاهیم
  • چهار محور حرکت: چپ/راست، جلو/عقب، بالا/پایین، چرخش (yaw).
  • مدل فرمان Tello: رایانه فرمان می‌فرستد و وضعیت دریافت می‌کند؛ برنامه روی رایانه اجرا می‌شود (پردازش خارج از پهپاد، Ka = 1).
  • Tello()، connect()، takeoff()، move_forward(cm)، land()، end().
  • فرمان‌های حرکتی ۲۰ تا ۵۰۰ سانتی‌متر می‌پذیرند؛ move_forward(5) معتبر نیست.
تمرین
  • چالش ۱: برخاستن، ۱۰۰ سانتی‌متر جلو، فرود. مقدار ۱۰۰ را به ۶۰ تغییر دهید و مقایسه کنید.
  • در حین اجرا پنل تله‌متری را تماشا کنید: ارتفاع، tof، سرعت، زمان پرواز.
۲حرکت در هر جهت، چرخش و سرعتکدنویسی
مفاهیم
  • move_back / move_left / move_right / move_up / move_down بر حسب سانتی‌متر؛ جهت نسبت به روی پهپاد است: بعد از چرخش، «جلو» عوض می‌شود.
  • rotate_clockwise(90) چرخش ۹۰ درجه، نه ۹۰ سانتی‌متر؛ set_speed(30) سرعت پیش‌فرض به cm/s (۱۰ تا ۱۰۰).
drone.move_up(50)
drone.rotate_clockwise(90)
drone.move_forward(80)
drone.rotate_counter_clockwise(90)
drone.set_speed(30)
تمرین
  • چالش ۲: ارتفاع را ۵۰ سانتی‌متر تغییر دهید و ایمن برگردید. چالش ۳: ۹۰ درجه بچرخید و جلو بروید؛ توضیح دهید چرا جهت حرکت عوض شد.
  • مسیر «راست ۶۰، جلو ۸۰، چپ ۶۰، فرود» را اول روی کاغذ بکشید، بعد پرواز کنید.
۳خواندن تله‌متری و پرواز پایدارکدنویسی
مفاهیم
  • get_battery()، get_height()، get_yaw()، get_flight_time(). این مقادیر تقریبی‌اند و مختصات پنهان شبیه‌ساز را نشان نمی‌دهند.
  • عبور yaw از +۱۷۹ به −۱۷۹ یعنی چرخش بزرگ نیست.
  • U19: کنترل پیوسته با send_rc_control(lr, fb, ud, yaw) در یک حلقه؛ حلقه‌ی تناسبی ساده برای نگه داشتن ارتفاع: ud = k * (target - height).
تمرین
  • ارتفاع را قبل و بعد از move_up و yaw را قبل و بعد از چرخش چاپ کنید.
  • U19: سه مقدار k را آزمایش کنید (کند، خوب، نوسانی) و ثبت کنید.
۴دوربین Tello و OpenCVبینایی
مفاهیم
  • streamon() و get_frame_read().frame تصویر دوربین جلو را می‌دهد (در Studio ۶۴۰×۴۸۰؛ همیشه frame.shape را بخوانید).
  • تصویر دوربین چیزی است که پهپاد می‌بیند، نه نقشه‌ی کامل سالن.
تمرین
  • چالش ۴: تصویر دوربین را نمایش دهید و اندازه‌ی آن را چاپ کنید.
  • پهپاد را نزدیک یک دروازه نگه دارید و ببینید اندازه‌ی ظاهری دروازه با نزدیک شدن چطور تغییر می‌کند.
۵AprilTag چیست و چطور تشخیص می‌دهیمبینایی
مفاهیم
  • AprilTag یک مربع سیاه‌وسفید با شناسه‌ی عددی است؛ آشکارساز، ID، چهار گوشه و مرکز را در تصویر می‌دهد. خانواده‌ی پیشنهادی tag36h11.
  • نشانگرها ثابت و متعلق به برگزارکننده‌اند؛ تیم‌ها نمی‌توانند آن‌ها را تغییر دهند. AprilTag با Mission Pad فرق دارد.
  • تشخیص تگ به‌خودی‌خود امتیاز نمی‌دهد؛ داور فقط عبور کامل از دروازه را می‌شمارد.
تمرین
  • چالش ۵: یک AprilTag ثابت را تشخیص دهید، ID آن را چاپ کنید و مرکزش را روی تصویر علامت بزنید.
  • از فاصله‌های مختلف آزمایش کنید و ببینید تشخیص کی ناپایدار می‌شود.
۶از پیکسل به تصمیم: خطای افقی و هدف‌گیری دهانهکنترل
مفاهیم
  • خطای نرمال‌شده: (tag_x - width/2) / (width/2)؛ منفی یعنی تگ سمت چپ تصویر.
  • هدف، مرکز فضای باز بالای تگ است، نه خود تگ.
  • منطق: شناسایی دروازه‌ی بعدی ← پیدا کردن تگ یا قاب رنگی ← تخمین مرکز دهانه ← حرکت در گام‌های کوچک ← عبور کامل ← دروازه‌ی بعد.
def horizontal_error(tag_x, image_width):
    center_x = image_width / 2
    return (tag_x - center_x) / center_x
تمرین
  • U14: عبور از یک دروازه با دنباله‌ی اندازه‌گیری‌شده‌ی فرمان‌ها. U19: تصحیح کوچک افقی بر اساس خطای تصویر پیش از عبور.
۷ماشین حالت دروازه: نزدیک شدن، هم‌راستایی، عبورکنترل
مفاهیم
  • حالت‌های APPROACH، ALIGN، PASS، NEXT برای هر دروازه؛ شرط خروج روشن از هر حالت.
  • اگر دروازه گم شد: بالا برو، آرام بچرخ، دوباره جست‌وجو کن (بازیابی).
تمرین
  • دو دروازه‌ی متوالی را با یک ماشین حالت رد کنید و تعداد دفعات بازیابی را ثبت کنید.
۸کل پیست: ترتیب دروازه‌ها، نواحی امتیازی و Safe Zoneراهبرد
مفاهیم
  • دروازه‌ها باید به ترتیب رد شوند؛ ورود به ناحیه‌ی امتیازی فقط بعد از عبور از همه‌ی دروازه‌های قبلی امتیاز دارد.
  • Safe Zone دور سکوی برخاست: تمرین داخل آن آزاد است؛ خروج از مرز عمودی آن = تلاش رسمی. «Start attempt» را عمداً و آگاهانه بزنید.
  • دروازه‌ی باریک‌شده: نوارهای پرتضاد بخشی از دهانه را می‌بندند؛ فقط فضای باز باقی‌مانده معتبر است.
تمرین
  • با Random track [N] پیست‌های مختلف بسازید و برنامه را روی آن‌ها آزمایش کنید.
۹فرود روی سکوی اعلام‌شدهکنترل
مفاهیم
  • U19: اگر چند سکوی فرود باشد، داور بعد از برخاستن یکی را اعلام می‌کند (مثلاً L2). فرود روی سکوی دیگر مسیر را کامل نمی‌کند.
  • U14: سکوی فرود ثابت و از قبل اعلام‌شده.
  • سکوها ۰٫۵ × ۰٫۵ متر با «H» آبی؛ کل پهپاد باید داخل سکو بنشیند.
تمرین
  • برنامه پیام داور را بخواند/سکو را با دوربین پیدا کند و فرود را تمام کند؛ ۵ بار اجرا و درصد موفقیت را ثبت کنید.
۱۰امتیازدهی و تاکتیک تلاش‌هاراهبرد
مفاهیم
  • S = (B − P) × Ka با Ka = 1. مثال: رسیدن به ناحیه‌ی ۲ (۱۰ امتیاز) با سه شکست = ۷. تکمیل مسیر در تلاش سوم بعد از دو شکست = ۲۳.
  • شکست‌های بعدی پیشرفت قبلی را پاک نمی‌کنند؛ اما هر تلاش ناموفق یک امتیاز کم می‌کند. چه زمانی ارزش دارد دوباره تلاش کنیم؟
  • U14: دو مسیر موازی، امتیاز مستقل، سپس جدول حذفی رودررو. تساوی: اول امتیاز، بعد کمترین زمان معتبر.
تمرین
  • برای سه سناریو (مسیر آسان، متوسط، سخت) تصمیم بگیرید کی تلاش مجدد کنید و کی بس کنید.
۱۱مسابقه‌ی آزمایشی: یک جلسه‌ی واقعی ۱۵ دقیقه‌ایمسابقه
فعالیت
  • New session بزنید؛ تایمر ۱۵ دقیقه شروع می‌شود و برای آماده‌سازی و ریست متوقف نمی‌شود.
  • هر تلاش را با Start attempt اعلام کنید؛ هیچ کنترل دستی در طول تلاش مجاز نیست.
  • در پایان، گزارش رویدادها و امتیاز را با فرمول دستی مقایسه کنید؛ هر عضو بخشی از کد را توضیح دهد.
رایج‌ترین مشکلات
  • وصل نمی‌شود: Studio باز است؟ برنامه‌ی دیگری به پهپاد وصل نیست؟
  • بلند نمی‌شود: connect() موفق بوده؟ از قبل در پرواز نیست؟ پیام خطا را بخوانید.
  • فرمان حرکت رد می‌شود: فاصله خارج از ۲۰ تا ۵۰۰؟
  • دوربین سیاه است: streamon() صدا زده شده؟
  • به دروازه می‌خورد: دیدن تگ کافی نیست؛ دهانه را هدف بگیرید.

متدهای کاربردی DJITelloPy

Tello(), connect(), end()
takeoff(), land()
move_forward(cm), move_back(cm), move_left(cm), move_right(cm), move_up(cm), move_down(cm)
rotate_clockwise(deg), rotate_counter_clockwise(deg), set_speed(cm_per_s)
get_battery(), get_height(), get_yaw(), get_flight_time()
streamon(), get_frame_read(), streamoff()
send_rc_control(left_right, forward_back, up_down, yaw)   # پیشرفته
emergency()   # فقط توقف اضطراری موتور؛ فرود ایمن نیست
قوانین

خلاصه‌ی قوانین مسابقه (نسخه‌ی ۱.۰ — ۲۰۲۶)

متن کامل (PDF) را از بخش دانلود بگیرید. رده‌ی U19 از قوانین FIRA Air – Autonomous Race (U19) مورخ ۵ دسامبر ۲۰۲۵ پیروی می‌کند، با تطبیق برای شبیه‌سازی.

کلی
پهپاد و رابطفقط DJI Tello مجازی رسمی، یکسان برای همه. تغییر اندازه، جرم، موتور، دینامیک یا مدل برخورد ممنوع. کنترل فقط از طریق رابط سازگار با Tello SDK؛ تغییر مستقیم مختصات ممنوع. GPS خارجی و دسترسی به وضعیت پنهان شبیه‌ساز ممنوع.
FA-1
ساختار مسابقهبرخاستن از سکو، عبور به‌ترتیب از دروازه‌ها بدون برخورد، فرود روی سکوی H. جلسه‌ی ۱۵ دقیقه‌ای پیوسته با تلاش نامحدود؛ تایمر برای آماده‌سازی و ریست متوقف نمی‌شود. تلاش ناموفق: برخورد، جا انداختن یا ترتیب اشتباه دروازه، خروج از محدوده، سقوط، فرود بیرون سکو، توقف پیش از اتمام. هر تلاش ناموفق حداکثر یک امتیاز منفی.
FA-1
Safe Zone و اعلام تلاشتمرین اعلام‌نشده فقط داخل Safe Zone دور سکوی برخاست مجاز است. تلاش رسمی با رویه‌ی Start Attempt یا با عبور پرواز تمرینی از مرز Safe Zone آغاز می‌شود. تلاش جدید فقط پس از پایان تلاش قبلی و بازگشت پهپاد به حالت اولیه.
FA-2
زمینسکوی برخاست، یک یا چند سکوی فرود ۰٫۵×۰٫۵ متر با H آبی، دنباله‌ی دروازه‌ها (قاب ۵ سانتی‌متر، حداقل ۱ متر فاصله) و AprilTagهای ثابت زیر دروازه‌ها. اگر چند سکوی فرود باشد، هدف پس از برخاستن تصادفی انتخاب می‌شود. دروازه فقط وقتی رد شده که کل حجم پهپاد از دهانه‌ی معتبر، در جهت و ترتیب درست، بدون تماس عبور کند.
FA-3
تعداد پهپاددر هر مسیر فقط یک پهپاد. U19 یک پهپاد؛ U14 دو پهپاد هم‌زمان در دو مسیر مجاور یکسان و مستقل. تغییر کد بین تلاش‌ها مجاز، تغییر مدل یا فیزیک پهپاد ممنوع.
FA-4
خودمختاریفقط کنترل خودمختار خارج از پهپاد (off-board). ضریب Ka = 1 برای هر دو رده؛ پاداش پردازش روی پهپاد وجود ندارد.
FA-5
امتیازدهیبیشینه‌ی امتیاز پایه ۲۵ برای تکمیل کامل. تکمیل جزئی = دورترین ناحیه‌ی معتبر پس از عبور از دروازه‌های قبلی (پیش‌فرض ۱۰ برای یک ناحیه‌ی میانی). S = (B − P) × Ka؛ نتیجه‌ی منفی هم معتبر است. U19: رتبه با امتیاز، سپس کمترین زمان تا بالاترین ناحیه.
FA-6
سندو رده‌ی مجزا: U14 و U19. تاریخ مبنا طبق مقررات عمومی رویداد. مربی بزرگسال مجاز است اما کد و تصمیم‌های پرواز باید کار اعضای دانش‌آموز باشد.
FA-7
U14 دومسیرهدو مسیر یکسان A و B؛ مسیر ساده‌تر از U19 (چیدمان، نه فیزیک یا فرمول). دنباله‌ی از پیش برنامه‌ریزی‌شده‌ی فرمان‌ها مجاز؛ بینایی پیشرفته اجباری نیست. سکوی فرود ثابت و اعلام‌شده. مقدماتی: دو تیم هم‌زمان با جلسه‌های مستقل ۱۵ دقیقه‌ای؛ رتبه‌بندی همه‌ی تیم‌ها. فینال: جدول حذفی رودررو، امتیاز بالاتر صعود می‌کند. تساوی: کمترین زمان معتبر؛ سپس دور تساوی‌شکن زیر نظر داور.
FA-8
مقررات شبیه‌سازیهمه با یک نسخه‌ی تأییدشده‌ی شبیه‌ساز. ضریب سرعت ثابت (معمولاً ۱×). خواندن مختصات پنهان، تغییر فایل صحنه یا تزریق وضعیت ممنوع. تغییر دوربین تماشا مجاز است ولی کنترل دستی نه. خلبان نمایشی (dummy pilot) در تلاش رسمی ممنوع. Reset / New session / Auto-retry شکست‌ها و زمان قبلی را پاک نمی‌کند. خرابی تأییدشده‌ی شبیه‌ساز = بازی مجدد بدون جریمه؛ خطای کد تیم = خیر.
دانلود

FIRA Air Studio، قوانین و راهنمای برنامه‌نویسی

پیش‌نیاز: Python 3.10+ و pip install djitellopy pupil-apriltags opencv-python. به‌روزترین نسخه‌ی فایل‌ها همیشه ابتدا در کانال کمیته داوران منتشر می‌شود.

کانال لیگ

کانال تلگرام و بله لیگ Autonomous Air

برای دریافت فایل‌ها، اطلاعیه‌ها و پرسیدن سؤال از کمیته داوران جوین شوید.