Beta · non-commercial learning project Beta · nichtkommerzielles Lernprojekt بتا · پروژه‌ی آموزشی و غیرتجاری

Learn: how a drone light show works Lernen: Wie eine Drohnen-Lichtshow funktioniert آموزش: نمایش نوری پهپادی چطور کار می‌کند

Nine short lessons, from the big picture to a simulated 20-drone flight. Everything here was actually run on a normal Linux PC with free, open-source tools (Skybrush, Blender, ArduPilot). The simulator only: no real aircraft were flown. This is learning material, not legal or safety advice for real flights. Translations are drafts; corrections are welcome. Neun kurze Lektionen, vom Überblick bis zum simulierten Flug mit 20 Drohnen. Alles wurde auf einem normalen Linux-PC mit freien Open-Source-Werkzeugen (Skybrush, Blender, ArduPilot) tatsächlich ausgeführt. Nur im Simulator: Es sind keine echten Fluggeräte geflogen. Dies ist Lernmaterial, keine Rechts- oder Sicherheitsberatung für echte Flüge. Die Übersetzungen sind Entwürfe; Korrekturen sind willkommen. نه درس کوتاه، از تصویر کلی تا پرواز شبیه‌سازی‌شده‌ی ۲۰ پهپاد. همه‌چیز واقعاً روی یک کامپیوتر لینوکس معمولی با ابزارهای آزاد و متن‌باز (Skybrush، Blender، ArduPilot) اجرا شده است. فقط در شبیه‌ساز؛ هیچ پهپاد واقعی پرواز نکرده. این مطالب آموزشی است و مشاوره‌ی حقوقی یا ایمنی برای پرواز واقعی نیست. ترجمه‌ها پیش‌نویس‌اند و اصلاحشان خوشحال‌مان می‌کند.

1. The big picture1. Das große Bild۱. تصویر کلی

A drone show is a computer-planned dance. Nobody steers the drones: each one gets its own pre-computed path and light program, then follows it using GPS (usually RTK for centimetre accuracy) and a shared start time.

Eine Drohnenshow ist ein am Computer geplanter Tanz. Niemand steuert die Drohnen: Jede erhält ihre eigene vorab berechnete Bahn und ihr Lichtprogramm und folgt ihr mit GPS (meist RTK für Zentimetergenauigkeit) und einer gemeinsamen Startzeit.

نمایش پهپادی یک رقص برنامه‌ریزی‌شده با کامپیوتر است. کسی پهپادها را هدایت نمی‌کند: هر پهپاد مسیر و برنامه‌ی نور از پیش‌محاسبه‌شده‌ی خودش را می‌گیرد و با GPS (معمولاً RTK برای دقت سانتی‌متری) و یک زمان شروع مشترک آن را دنبال می‌کند.

The open-source Skybrush suite has three parts you will meet in these lessons:

Die Open-Source-Suite Skybrush hat drei Teile, denen Sie in diesen Lektionen begegnen:

مجموعه‌ی متن‌باز Skybrush سه بخش دارد که در این درس‌ها با آنها کار می‌کنیم:

To practise without aircraft we use SITL (software in the loop): the real ArduPilot flight code runs on the PC as a "virtual drone". Skybrush cannot tell the difference, so everything you learn transfers to real hardware.

Zum Üben ohne Fluggerät nutzen wir SITL (Software in the Loop): Der echte ArduPilot-Flugcode läuft als „virtuelle Drohne“ auf dem PC. Skybrush merkt keinen Unterschied, deshalb lässt sich alles auf echte Hardware übertragen.

برای تمرین بدون پهپاد از SITL (نرم‌افزار در حلقه) استفاده می‌کنیم: کد پرواز واقعی ArduPilot روی کامپیوتر به‌صورت «پهپاد مجازی» اجرا می‌شود. Skybrush فرقی حس نمی‌کند، پس هرچه یاد می‌گیرید به سخت‌افزار واقعی هم منتقل می‌شود.

Blender + Studio  →  show.skyc  →  Skybrush Server  →  MAVLink (UDP 14550)  →  drones (SITL)
                                              ↑
                                       Skybrush Live (browser)

2. The .skyc show file2. Die .skyc-Showdatei۲. فایل نمایش .skyc

A .skyc file is just a ZIP archive. Open it with any unzip tool. Our 20-drone demo contains 42 files:

Eine .skyc-Datei ist einfach ein ZIP-Archiv. Öffnen Sie sie mit jedem Entpackprogramm. Unsere 20-Drohnen-Demo enthält 42 Dateien:

فایل .skyc فقط یک آرشیو ZIP است؛ با هر برنامه‌ی unzip باز می‌شود. دموی ۲۰ پهپادی ما ۴۲ فایل دارد:

show.json                       settings, environment, validation limits, list of drones
cues.json                       named time markers (e.g. the start cue)
drones/Drone 1/trajectory.json  the path
drones/Drone 1/lights.json      the light program
...  (the same pair for each of the 20 drones)

Trajectory. A list of points [time, [x, y, z], [control points]]. Between two points the path is a Bézier curve, so motion is smooth. Coordinates are local metres relative to the show origin (north, west, up). Example: [6.75, [-7.5, 10.0, 7.76], …] means "at second 6.75 be 7.76 m above the ground at this spot". The file also stores takeoffTime and landingTime (104.5 s in our demo).

Trajectory. Eine Liste von Punkten [Zeit, [x, y, z], [Kontrollpunkte]]. Zwischen zwei Punkten verläuft die Bahn als Bézier-Kurve, die Bewegung ist also weich. Koordinaten sind lokale Meter relativ zum Show-Ursprung (Nord, West, oben). Beispiel: [6.75, [-7.5, 10.0, 7.76], …] heißt „bei Sekunde 6,75 an dieser Stelle 7,76 m über dem Boden sein“. Die Datei enthält auch takeoffTime und landingTime (104,5 s in unserer Demo).

مسیر (trajectory). فهرستی از نقاط [زمان، [x, y, z], [نقاط کنترل]]. بین دو نقطه مسیر یک منحنی بزیه است، پس حرکت نرم می‌شود. مختصات، متر محلی نسبت به مبدأ نمایش است (شمال، غرب، بالا). مثال: [6.75, [-7.5, 10.0, 7.76], …] یعنی «در ثانیه‌ی ۶٫۷۵ در این نقطه ۷٫۷۶ متر بالای زمین باش». زمان برخاست و فرود (takeoffTime و landingTime) هم ذخیره می‌شود؛ در دموی ما ۱۰۴٫۵ ثانیه.

Lights. A tiny bytecode program (stored base64) that sets colours over time; the drone's LED runs it by itself, so light timing never depends on the radio link.

Lichter. Ein winziges Bytecode-Programm (base64), das Farben über die Zeit setzt; die LED der Drohne führt es selbst aus, das Lichttiming hängt also nie von der Funkstrecke ab.

نور (lights). یک برنامه‌ی بایت‌کد بسیار کوچک (ذخیره‌شده با base64) که رنگ را در طول زمان تعیین می‌کند؛ LED خود پهپاد آن را اجرا می‌کند، پس زمان‌بندی نور به لینک رادیویی بستگی ندارد.

Validation limits in show.json of our demo: minimum distance 3 m, max horizontal speed 10 m/s, max vertical speed 2 m/s, max acceleration 4 m/s², max altitude 150 m, minimum navigation altitude 2.5 m. We checked the finished file ourselves: the closest two drones ever got was 3.02 m.

Validierungsgrenzen in der show.json unserer Demo: Mindestabstand 3 m, max. horizontale Geschwindigkeit 10 m/s, max. vertikale 2 m/s, max. Beschleunigung 4 m/s², max. Höhe 150 m, minimale Navigationshöhe 2,5 m. Wir haben die fertige Datei selbst geprüft: Der geringste Abstand zweier Drohnen war 3,02 m.

حدود اعتبارسنجی در show.json دموی ما: حداقل فاصله ۳ متر، بیشینه‌ی سرعت افقی ۱۰ m/s، سرعت عمودی ۲ m/s، شتاب ۴ m/s²، ارتفاع بیشینه ۱۵۰ متر و کمینه‌ی ارتفاع ناوبری ۲٫۵ متر. فایل نهایی را خودمان بررسی کردیم: کمترین فاصله‌ی دو پهپاد ۳٫۰۲ متر بود.

unzip -l shows/demo-20-color.skyc
python3 scripts/check_skyc.py shows/demo-20.skyc

3. Design a show in Blender3. Eine Show in Blender entwerfen۳. طراحی نمایش در Blender

Skybrush Studio for Blender works with three ideas: formations (a set of target points, one per drone), a storyboard (which formation at which time) and transitions (the planner computes collision-free paths between formations). Light colours are keyframes.

Skybrush Studio für Blender arbeitet mit drei Ideen: Formationen (Zielpunkte, einer je Drohne), ein Storyboard (welche Formation wann) und Übergänge (der Planer berechnet kollisionsfreie Bahnen zwischen den Formationen). Lichtfarben sind Keyframes.

Skybrush Studio برای Blender سه مفهوم دارد: آرایش‌ها (مجموعه‌ی نقاط هدف، یکی برای هر پهپاد)، استوری‌بورد (کدام آرایش در چه زمانی) و گذارها (برنامه‌ریز مسیرهای بدون برخورد بین آرایش‌ها را حساب می‌کند). رنگ نور با کلیدفریم تعیین می‌شود.

Our demo has 20 drones: take-off grid → ring (12 drones) → star (15) → heart (14) → back to the grid → landing. Where there are fewer shape points than drones, the rest hover at the edge. Lessons we learned the hard way:

Unsere Demo hat 20 Drohnen: Start-Raster → Ring (12 Drohnen) → Stern (15) → Herz (14) → zurück zum Raster → Landung. Wo es weniger Formpunkte als Drohnen gibt, schweben die übrigen am Rand. Was wir auf die harte Tour gelernt haben:

دموی ما ۲۰ پهپاد دارد: شبکه‌ی برخاست ← حلقه (۱۲ پهپاد) ← ستاره (۱۵) ← قلب (۱۴) ← بازگشت به شبکه ← فرود. جایی که نقاط شکل از پهپادها کمترند، بقیه کنار شکل معلق می‌مانند. چند درس که به‌سختی یاد گرفتیم:

Studio's planner and exporter run on the Skybrush community server, so Blender needs internet (and, when started from a script, the --online-mode flag). The whole demo is built by one script:

Planer und Exporter von Studio laufen auf dem Skybrush-Community-Server; Blender braucht also Internet (und bei Start aus einem Skript das Flag --online-mode). Die ganze Demo entsteht aus einem Skript:

برنامه‌ریز و خروجی‌گیر Studio روی سرور اجتماعی Skybrush اجرا می‌شود، پس Blender اینترنت می‌خواهد (و اگر با اسکریپت اجرا شود، گزینه‌ی --online-mode). کل دمو با یک اسکریپت ساخته می‌شود:

scripts/blender.sh -b --factory-startup --online-mode \
    -P scripts/make_show.py -- shows/demo-20.skyc

4. Server and simulated swarm4. Server und simulierter Schwarm۴. سرور و ازدحام شبیه‌سازی‌شده

Start the Skybrush Server, then 20 simulated ArduCopters. The launcher places them in a 5×4 grid, 5 m apart, with a little position and yaw noise like real life. They send heartbeats to UDP 14550; the server listens there and exposes a Socket.IO API on port 5000.

Starten Sie den Skybrush Server, dann 20 simulierte ArduCopter. Der Launcher stellt sie in ein 5×4-Raster mit 5 m Abstand, mit etwas Positions- und Gierwinkel-Rauschen wie im echten Leben. Sie senden Heartbeats an UDP 14550; dort hört der Server zu und stellt eine Socket.IO-API auf Port 5000 bereit.

Skybrush Server را و بعد ۲۰ ArduCopter شبیه‌سازی‌شده را راه بیندازید. لانچر آنها را در شبکه‌ی ۵×۴ با فاصله‌ی ۵ متر می‌گذارد، با کمی نویز موقعیت و جهت مثل دنیای واقعی. پهپادها ضربان (heartbeat) را به UDP 14550 می‌فرستند؛ سرور آنجا گوش می‌دهد و یک API از نوع Socket.IO روی پورت 5000 دارد.

scripts/run-server.sh            # terminal 1
scripts/run-swarm.sh 20          # terminal 2
.tools/bin/python scripts/check_swarm.py   # terminal 3

Healthy output: "20 drones known to the server", each with gps_fix=6 (RTK fixed), mode=show and the note "No show data" — they are waiting for a show.

Gesunde Ausgabe: „20 drones known to the server“, jede mit gps_fix=6 (RTK fixed), mode=show und dem Hinweis „No show data“ — sie warten auf eine Show.

خروجی سالم: «20 drones known to the server» و برای هر پهپاد gps_fix=6 (RTK ثابت)، mode=show و یادداشت «No show data»؛ یعنی منتظر نمایش‌اند.

Mind your machine: 20 simulated drones are heavy. On a busy PC, limit them with CPU/memory caps and stop everything if the load climbs; a hung machine teaches nothing. Start with 5 or 10 drones.

Achten Sie auf Ihren Rechner: 20 simulierte Drohnen sind schwer. Auf einem ausgelasteten PC begrenzen Sie sie mit CPU-/Speicherlimits und beenden alles, wenn die Last steigt; ein hängender Rechner lehrt nichts. Beginnen Sie mit 5 oder 10 Drohnen.

مراقب کامپیوترتان باشید: ۲۰ پهپاد شبیه‌سازی‌شده سنگین است. روی کامپیوتر شلوغ با سقف CPU/حافظه محدودشان کنید و اگر بار بالا رفت همه‌چیز را خاموش کنید؛ کامپیوتر هنگ‌کرده چیزی یاد نمی‌دهد. با ۵ یا ۱۰ پهپاد شروع کنید.

5. Fly it with Skybrush Live5. Mit Skybrush Live fliegen۵. اجرا با Skybrush Live

Open Live (the web build runs in a browser on http://localhost:8080). Then, in this order:

Öffnen Sie Live (die Web-Version läuft im Browser unter http://localhost:8080). Dann in dieser Reihenfolge:

Live را باز کنید (نسخه‌ی وب در مرورگر روی http://localhost:8080 اجرا می‌شود). سپس به این ترتیب:

  1. Connect: plug icon → "Enter manually" → host localhost, port 5000, secure off.
  2. Verbinden: Steckersymbol → „Enter manually“ → Host localhost, Port 5000, secure aus.
  3. اتصال: آیکن دوشاخه ← «Enter manually» ← میزبان localhost، پورت 5000، secure خاموش.
  4. Drop the .skyc file into "Show control".
  5. Ziehen Sie die .skyc-Datei in „Show control“.
  6. فایل .skyc را در «Show control» بیندازید.
  7. "Setup environment" → magic wand (fit coordinate system): Live computes the show origin and orientation from where the drones actually stand.
  8. „Setup environment“ → Zauberstab (Koordinatensystem anpassen): Live berechnet Ursprung und Ausrichtung der Show aus den tatsächlichen Drohnenpositionen.
  9. «Setup environment» ← عصای جادویی (fit coordinate system): Live مبدأ و جهت نمایش را از جای واقعی پهپادها حساب می‌کند.
  10. "Upload show data" → wait until all 20 are green. Transfers over MAVLink can time out; just retry the few that failed.
  11. „Upload show data“ → warten, bis alle 20 grün sind. Übertragungen über MAVLink können in ein Timeout laufen; wiederholen Sie einfach die wenigen fehlgeschlagenen.
  12. «Upload show data» ← صبر کنید تا هر ۲۰ سبز شوند. انتقال روی MAVLink ممکن است تایم‌اوت بخورد؛ همان چند تای ناموفق را دوباره بفرستید.
  13. "Choose start time" (automatic start) and authorise.
  14. „Choose start time“ (automatischer Start) und freigeben.
  15. «Choose start time» (شروع خودکار) و سپس Authorize.
  16. "ARM ALL". At the start time the drones take off by themselves.
  17. „ARM ALL“. Zur Startzeit heben die Drohnen von selbst ab.
  18. «ARM ALL». در زمان شروع پهپادها خودشان بلند می‌شوند.

Our result: all 20 of 20 took off, the peak altitude was 39.4 m (as designed), the colours followed the plan (white, rainbow ring, gold, rose, soft white, off) and all landed.

Unser Ergebnis: Alle 20 von 20 hoben ab, die Maximalhöhe war 39,4 m (wie geplant), die Farben folgten dem Plan (Weiß, Regenbogenring, Gold, Rosé, sanftes Weiß, aus) und alle landeten.

نتیجه‌ی ما: هر ۲۰ از ۲۰ بلند شدند، بیشینه‌ی ارتفاع ۳۹٫۴ متر بود (مطابق طراحی)، رنگ‌ها طبق برنامه بودند (سفید، حلقه‌ی رنگین‌کمان، طلایی، صورتی، سفید ملایم، خاموش) و همه فرود آمدند.

Tip: the same steps can be scripted through the server's API (scripts/run_show.py), which is how we tested without a screen.

Tipp: Dieselben Schritte lassen sich über die Server-API skripten (scripts/run_show.py); so haben wir ohne Bildschirm getestet.

نکته: همین گام‌ها را می‌شود از طریق API سرور اسکریپت کرد (scripts/run_show.py)؛ ما هم همین‌طور بدون صفحه نمایش آزمایش کردیم.

.tools/bin/python scripts/run_show.py shows/demo-20-color.skyc --start-in 30

6. MAVLink: how the server talks to the drones6. MAVLink: Wie der Server mit den Drohnen spricht۶. MAVLink: سرور چطور با پهپادها حرف می‌زند

MAVLink is a small, open message protocol used by ArduPilot and PX4. Every message is a short binary packet with an ID, a sender and a payload. The drones send a HEARTBEAT about once a second plus telemetry (position, GPS state, battery, mode); the ground side sends commands and parameter changes. In our setup the simulated drones send to UDP port 14550, where the Skybrush Server listens, and the server broadcasts back on 14555.

MAVLink ist ein kleines, offenes Nachrichtenprotokoll, das ArduPilot und PX4 nutzen. Jede Nachricht ist ein kurzes Binärpaket mit ID, Absender und Nutzdaten. Die Drohnen senden etwa einmal pro Sekunde einen HEARTBEAT plus Telemetrie (Position, GPS-Zustand, Akku, Modus); die Bodenseite sendet Befehle und Parameteränderungen. In unserem Aufbau senden die simulierten Drohnen an UDP-Port 14550, wo der Skybrush Server lauscht; der Server sendet per Broadcast auf 14555 zurück.

MAVLink یک پروتکل پیام کوچک و آزاد است که ArduPilot و PX4 به کار می‌برند. هر پیام یک بسته‌ی باینری کوتاه با شناسه، فرستنده و داده است. پهپادها تقریباً هر ثانیه یک HEARTBEAT و بعد تله‌متری (موقعیت، وضعیت GPS، باتری، حالت) می‌فرستند؛ سمت زمین فرمان و تغییر پارامتر می‌فرستد. در چیدمان ما پهپادهای شبیه‌سازی‌شده به پورت UDP ‏14550 می‌فرستند که Skybrush Server آنجا گوش می‌دهد، و سرور روی 14555 پخش (broadcast) می‌کند.

What "upload the show" really does (from the server's MAVLink driver, per drone):

Was „Show hochladen“ tatsächlich tut (aus dem MAVLink-Treiber des Servers, pro Drohne):

«آپلود نمایش» در عمل چه می‌کند (از درایور MAVLink سرور، برای هر پهپاد):

  1. Converts the drone's trajectory, light program and optional return-to-home plan into one compact binary file, show.skyb.
  2. Wandelt Bahn, Lichtprogramm und optionalen Rückkehrplan der Drohne in eine kompakte Binärdatei show.skyb um.
  3. مسیر، برنامه‌ی نور و (اختیاری) برنامه‌ی بازگشت پهپاد را به یک فایل باینری فشرده به نام show.skyb تبدیل می‌کند.
  4. Sends it over MAVFTP (file transfer inside MAVLink) to /collmot/show.skyb on the drone.
  5. Schickt sie per MAVFTP (Dateiübertragung innerhalb von MAVLink) nach /collmot/show.skyb auf der Drohne.
  6. آن را با MAVFTP (انتقال فایل داخل MAVLink) به مسیر /collmot/show.skyb روی پهپاد می‌فرستد.
  7. Sets the show origin and orientation as ordinary ArduPilot parameters (SHOW_ORIGIN_LAT, SHOW_ORIGIN_LNG, SHOW_ORIENTATION, or the newer single-command form) and configures the geofence.
  8. Setzt Ursprung und Ausrichtung der Show als normale ArduPilot-Parameter (SHOW_ORIGIN_LAT, SHOW_ORIGIN_LNG, SHOW_ORIENTATION oder die neuere Ein-Befehl-Form) und konfiguriert den Geofence.
  9. مبدأ و جهت نمایش را مثل پارامترهای معمولی ArduPilot تنظیم می‌کند (SHOW_ORIGIN_LAT، SHOW_ORIGIN_LNG، SHOW_ORIENTATION یا شکل جدیدتر تک‌فرمانی) و ژئوفنس را پیکربندی می‌کند.
  10. Asks the drone to reload the show file.
  11. Bittet die Drohne, die Showdatei neu zu laden.
  12. از پهپاد می‌خواهد فایل نمایش را دوباره بارگذاری کند.

Starting is two more parameters: SHOW_START_AUTH (1 = the drone may take off by itself) and SHOW_START_TIME (when, as GPS time of week in whole seconds). Because every drone has the same GPS-based clock, they all start together without talking to each other. After ARM the drone waits in show mode, takes off at that second and flies its own file.

Zum Start gehören zwei weitere Parameter: SHOW_START_AUTH (1 = die Drohne darf selbstständig starten) und SHOW_START_TIME (wann, als GPS-Wochenzeit in ganzen Sekunden). Da alle Drohnen dieselbe GPS-basierte Uhr haben, starten sie gemeinsam, ohne miteinander zu sprechen. Nach dem ARM wartet die Drohne im Show-Modus, hebt in dieser Sekunde ab und fliegt ihre eigene Datei.

شروع دو پارامتر دیگر است: SHOW_START_AUTH (۱ یعنی پهپاد اجازه دارد خودش بلند شود) و SHOW_START_TIME (چه زمانی، به‌صورت زمان هفته‌ی GPS با ثانیه‌ی صحیح). چون همه‌ی پهپادها ساعت مشترک مبتنی بر GPS دارند، بدون حرف‌زدن با هم یک‌جا شروع می‌کنند. بعد از ARM پهپاد در حالت show منتظر می‌ماند، در همان ثانیه بلند می‌شود و فایل خودش را پرواز می‌کند.

Lesson from our runs: MAVFTP is the fragile step. Under heavy CPU load two or three of the 20 uploads timed out ("no response in time"). The fix is dull but effective: retry only the drones that failed, in rounds, until all report the show as loaded. On a real radio link uploads are also slower than on localhost.

Lehre aus unseren Läufen: MAVFTP ist der empfindliche Schritt. Unter hoher CPU-Last liefen zwei oder drei der 20 Uploads in ein Timeout („no response in time“). Die Lösung ist unspektakulär, aber wirksam: nur die fehlgeschlagenen Drohnen in Runden wiederholen, bis alle die Show als geladen melden. Über eine echte Funkstrecke sind Uploads außerdem langsamer als über localhost.

درسی از اجراهای ما: MAVFTP حساس‌ترین گام است. زیر بار سنگین CPU دو یا سه تا از ۲۰ آپلود تایم‌اوت خوردند («no response in time»). راه‌حل ساده ولی مؤثر است: فقط پهپادهای ناموفق را در دورهای مکرر دوباره بفرستید تا همه نمایش را «بارگذاری‌شده» گزارش کنند. روی لینک رادیویی واقعی هم آپلود کندتر از localhost است.

Because the show parameters are plain ArduPilot parameters, any MAVLink ground station can read them; Skybrush just automates the sequence. Light overrides from the ground (for example "all white" for a check) use a broadcast LED-control message, separate from the stored light program.

Da die Show-Parameter gewöhnliche ArduPilot-Parameter sind, kann sie jede MAVLink-Bodenstation lesen; Skybrush automatisiert nur die Abfolge. Licht-Overrides vom Boden (z. B. „alle weiß“ zur Kontrolle) laufen über eine Broadcast-LED-Steuernachricht, getrennt vom gespeicherten Lichtprogramm.

چون پارامترهای نمایش، پارامترهای معمولی ArduPilot هستند، هر ایستگاه زمینی MAVLink می‌تواند آنها را بخواند؛ Skybrush فقط ترتیب کار را خودکار می‌کند. تغییر دستی نور از زمین (مثلاً «همه سفید» برای بررسی) با یک پیام broadcast کنترل LED انجام می‌شود، جدا از برنامه‌ی نور ذخیره‌شده.

show.skyc → show.skyb → MAVFTP → /collmot/show.skyb
SHOW_ORIGIN_* , SHOW_ORIENTATION   (where the show is)
SHOW_START_AUTH = 1                (may take off)
SHOW_START_TIME = GPS time of week (when)
ARM → show mode → take-off → fly → land

7. Light: how the colours are programmed7. Licht: Wie die Farben programmiert werden۷. نور: رنگ‌ها چطور برنامه‌ریزی می‌شوند

Each drone's lights.json holds a few dozen bytes of base64 bytecode for a tiny virtual machine in the flight controller (libskybrush). No video, no per-frame data: just a short list of commands. That is why 20 drones with a 100-second show need only ~54 bytes of light program each.

Die lights.json jeder Drohne enthält wenige Dutzend Byte base64-Bytecode für eine winzige virtuelle Maschine im Flugcontroller (libskybrush). Kein Video, keine Daten pro Bild: nur eine kurze Befehlsliste. Darum brauchen 20 Drohnen bei einer 100-Sekunden-Show nur rund 54 Byte Lichtprogramm je Drohne.

فایل lights.json هر پهپاد چند ده بایت بایت‌کد base64 برای یک ماشین مجازی کوچک داخل کنترلر پرواز (libskybrush) دارد. نه ویدیو، نه داده‌ی هر فریم: فقط فهرست کوتاهی از دستورها. برای همین ۲۰ پهپاد در نمایش ۱۰۰ ثانیه‌ای فقط حدود ۵۴ بایت برنامه‌ی نور برای هر پهپاد لازم دارند.

The main commands (opcode, arguments; the last argument is a variable-length duration):

Die wichtigsten Befehle (Opcode, Argumente; das letzte Argument ist eine Dauer variabler Länge):

دستورهای اصلی (کد عملیات، آرگومان‌ها؛ آخرین آرگومان یک مدت با طول متغیر است):

0x00 END                         end of program
0x02 SLEEP    duration           keep the colour
0x04 SET_COLOR   r g b duration  jump to a colour
0x07 SET_WHITE   duration
0x06 SET_BLACK   duration
0x08 FADE_TO_COLOR r g b duration   smooth fade
0x09 FADE_TO_GRAY  gray duration
0x0A FADE_TO_BLACK duration
0x0C / 0x0D LOOP_BEGIN / LOOP_END
0x12 JUMP, 0x13 TRIGGERED_JUMP

Durations are variable-length integers: 7 bits per byte, the top bit says "more bytes follow", least significant group first. So d2 02 = 0x52 + (2 × 128) = 338. In our runs we read the unit as 1/50 s (50 ticks per second); the totals fit this, but treat it as an observation, not a quote from the spec.

Dauern sind Ganzzahlen variabler Länge: 7 Bit pro Byte, das oberste Bit bedeutet „es folgen weitere Bytes“, niederwertigste Gruppe zuerst. Also ist d2 02 = 0x52 + (2 × 128) = 338. In unseren Läufen haben wir die Einheit als 1/50 s gelesen (50 Ticks pro Sekunde); die Summen passen dazu, es ist aber eine Beobachtung, kein Zitat aus der Spezifikation.

مدت‌ها عدد صحیح با طول متغیر هستند: ۷ بیت در هر بایت، بیت بالا یعنی «بایت بعدی هم هست»، گروه کم‌ارزش اول. پس d2 02 = 0x52 + (2 × 128) = 338. ما در اجراهایمان واحد را ۱/۵۰ ثانیه (۵۰ تیک در ثانیه) خواندیم؛ جمع‌ها با آن جور درمی‌آید، ولی آن را مشاهده بدانید نه نقل‌قول از مشخصات.

Decode a real one. The first drone of our demo (demo-20-color.skyc) starts like this:

Ein echtes Programm entschlüsseln. Die erste Drohne unserer Demo (demo-20-color.skyc) beginnt so:

یک برنامه‌ی واقعی را رمزگشایی کنیم. پهپاد اول دموی ما (demo-20-color.skyc) این‌طور شروع می‌شود:

07 d2 02              SET_WHITE        338 ticks  (≈ 6.8 s, idle on the ground)
08 ff 00 00 fa 05     FADE_TO_COLOR    (255,0,0) red,     762 ticks
02 84 03              SLEEP            388 ticks
08 ff b8 26 e4 04     FADE_TO_COLOR    (255,184,38) gold, 612 ticks
02 84 03              SLEEP            388
08 ff 33 6b e4 04     FADE_TO_COLOR    (255,51,107) rose, 612
02 84 03              SLEEP            388
08 d9 eb ff e4 04     FADE_TO_COLOR    (217,235,255) soft white, 612
...                   a last fade to dim gray, then to black, then END

Drone 5 begins the same way but fades to cc ff 00 (lime) first. Nearly the same program, with a different first colour per drone (and a tiny timing offset): that is the rainbow ring. Add up Drone 1's durations: 5315 ticks ≈ 106 s, a little more than the 104.5 s flight because the program also covers the end of the landing.

Drohne 5 beginnt gleich, blendet aber zuerst auf cc ff 00 (Limette). Fast dasselbe Programm, je Drohne mit anderer Anfangsfarbe (und kleinem Zeitversatz): das ist der Regenbogenring. Addiert man die Dauern von Drohne 1, ergeben sich 5315 Ticks ≈ 106 s, etwas mehr als die 104,5 s Flugzeit, weil das Programm auch das Ende der Landung abdeckt.

پهپاد ۵ همین‌طور شروع می‌شود ولی اول به cc ff 00 (لیمویی) محو می‌شود. تقریباً همان برنامه، با رنگ اول متفاوت برای هر پهپاد (و اختلاف زمانی کوچک): این همان حلقه‌ی رنگین‌کمان است. اگر مدت‌های پهپاد ۱ را جمع کنید ۵۳۱۵ تیک ≈ ۱۰۶ ثانیه می‌شود، کمی بیشتر از پرواز ۱۰۴٫۵ ثانیه، چون برنامه پایان فرود را هم می‌پوشاند.

Designing light in Blender. You set colours with keyframes on each drone's light, or with light effects (a gradient over the formation, a wave, a pulse). Studio samples them and writes the compact program above. Practical tips: fade rather than jump so colours look smooth from far away; keep a short white or dim "idle" at the start so ground crews can see which drones are alive; avoid fast flashing (comfort and, at events, photosensitivity); remember daylight washes out dark colours, so check contrast at night values.

Licht in Blender gestalten. Farben setzt man mit Keyframes auf dem Licht jeder Drohne oder mit Light Effects (Verlauf über die Formation, Welle, Puls). Studio tastet sie ab und schreibt das obige kompakte Programm. Praktische Tipps: blenden statt springen, damit Farben aus der Ferne weich wirken; am Anfang ein kurzes Weiß oder gedimmtes „Idle“, damit das Bodenpersonal sieht, welche Drohnen leben; schnelles Blitzen vermeiden (Verträglichkeit und bei Veranstaltungen Photosensitivität); Tageslicht überstrahlt dunkle Farben, prüfen Sie den Kontrast daher mit Nachtwerten.

طراحی نور در Blender. رنگ را با کلیدفریم روی نور هر پهپاد یا با جلوه‌های نور (گرادیان روی آرایش، موج، ضربان) تعیین می‌کنید. Studio آنها را نمونه‌برداری می‌کند و برنامه‌ی فشرده‌ی بالا را می‌نویسد. نکته‌های عملی: به‌جای پرش، محو کنید تا رنگ‌ها از دور نرم دیده شوند؛ در ابتدا یک سفید کوتاه یا کم‌نور «آماده‌باش» بگذارید تا گروه زمینی ببیند کدام پهپادها زنده‌اند؛ از چشمک‌زدن تند بپرهیزید (آسایش بیننده و، در رویدادها، حساسیت نوری)؛ نور روز رنگ‌های تیره را کم‌رنگ می‌کند، پس تضاد را با مقادیر شب بسنجید.

Try it yourself: unzip the demo and decode your own drone's program.

Probieren Sie es selbst: Demo entpacken und das Programm einer eigenen Drohne entschlüsseln.

خودتان امتحان کنید: دمو را باز کنید و برنامه‌ی نور یکی از پهپادها را رمزگشایی کنید.

python3 - <<'EOF'
import zipfile, json, base64
z = zipfile.ZipFile("shows/demo-20-color.skyc")
data = json.loads(z.read("drones/Drone 1/lights.json"))["data"]
print(base64.b64decode(data).hex(" "))
EOF

8. Geofence and RTK8. Geofence und RTK۸. ژئوفنس و RTK

Geofence. A geofence is a virtual boundary stored on each drone, so it still works if the radio link drops. When a drone touches it, the flight controller reacts by itself. In a Skybrush show file the geofence is an optional block with: maxAltitude, minAltitude, maxDistance (a circle around the home point), optional polygons, and an action: report, return, land or stop (hover). The server also knows smartReturn and smartLand, but its ArduPilot driver rejects them.

Geofence. Ein Geofence ist eine virtuelle Grenze, die auf jeder Drohne gespeichert ist und deshalb auch bei Funkausfall wirkt. Berührt eine Drohne sie, reagiert der Flugcontroller selbst. In einer Skybrush-Showdatei ist der Geofence ein optionaler Block mit maxAltitude, minAltitude, maxDistance (Kreis um den Startpunkt), optional polygons und einer action: report, return, land oder stop (Schweben). Der Server kennt auch smartReturn und smartLand, doch sein ArduPilot-Treiber lehnt sie ab.

ژئوفنس. ژئوفنس یک مرز مجازی است که روی هر پهپاد ذخیره می‌شود و پس‌ازاین حتی اگر لینک رادیویی قطع شود کار می‌کند. وقتی پهپاد به آن برسد، کنترلر پرواز خودش واکنش نشان می‌دهد. در فایل نمایش Skybrush ژئوفنس یک بلوک اختیاری است با maxAltitude، minAltitude، maxDistance (دایره دور نقطه‌ی شروع)، polygons (اختیاری) و یک action: ‏report، return، land یا stop (توقف و معلق‌ماندن). سرور smartReturn و smartLand را هم می‌شناسد، ولی درایور ArduPilot آن‌ها را رد می‌کند.

On an ArduCopter drone the server translates this into plain parameters: FENCE_ALT_MIN (range −100…100 m), FENCE_ALT_MAX (10…1000 m), FENCE_RADIUS (30…10000 m), the polygon uploaded as a MAVLink mission, FENCE_ACTION (0 report, 1 return-or-land, 2 land, 4 brake-or-land), FENCE_TYPE (a bit field: 1 altitude, 2 circle, 4 polygon, 8 floor) and finally FENCE_ENABLE. Values outside the ranges are clamped, so a 20 m radius would silently become 30 m.

Auf einer ArduCopter-Drohne übersetzt der Server das in gewöhnliche Parameter: FENCE_ALT_MIN (Bereich −100…100 m), FENCE_ALT_MAX (10…1000 m), FENCE_RADIUS (30…10000 m), das Polygon als MAVLink-Mission, FENCE_ACTION (0 melden, 1 Rückkehr-oder-Landen, 2 landen, 4 bremsen-oder-landen), FENCE_TYPE (Bitfeld: 1 Höhe, 2 Kreis, 4 Polygon, 8 Boden) und zuletzt FENCE_ENABLE. Werte außerhalb der Bereiche werden begrenzt, aus 20 m Radius würden also stillschweigend 30 m.

روی پهپاد ArduCopter سرور این را به پارامترهای ساده ترجمه می‌کند: ‏FENCE_ALT_MIN (بازه‌ی ‎−۱۰۰ تا ۱۰۰ متر)، ‏FENCE_ALT_MAX (۱۰ تا ۱۰۰۰ متر)، ‏FENCE_RADIUS (۳۰ تا ۱۰۰۰۰ متر)، چندضلعی به‌صورت یک ماموریت MAVLink، ‏FENCE_ACTION (۰ فقط گزارش، ۱ بازگشت یا فرود، ۲ فرود، ۴ ترمز یا فرود)، ‏FENCE_TYPE (فیلد بیتی: ۱ ارتفاع، ۲ دایره، ۴ چندضلعی، ۸ کف) و در آخر FENCE_ENABLE. مقدار بیرون از بازه به مرز بازه می‌رسد، پس شعاع ۲۰ متر بی‌صدا ۳۰ متر می‌شود.

An honest gap in our demo: the 20-drone show file we built has no geofence block, and the simulation flew without one. For a real flight you would add the polygon of the permitted area plus a margin and choose the action together with your safety plan. A fence that is too tight triggers false alarms during normal formation moves; one that is too loose protects nothing. Test it in the simulator first by flying a drone deliberately toward the edge.

Eine ehrliche Lücke in unserer Demo: Die gebaute 20-Drohnen-Showdatei enthält keinen Geofence-Block, und die Simulation flog ohne. Für einen echten Flug würden Sie das Polygon des erlaubten Bereichs plus Puffer ergänzen und die Aktion zusammen mit Ihrem Sicherheitskonzept wählen. Ein zu enger Zaun löst bei normalen Formationsbewegungen Fehlalarme aus, ein zu weiter schützt nichts. Testen Sie ihn zuerst im Simulator, indem Sie eine Drohne absichtlich zum Rand fliegen lassen.

یک کمبود صادقانه در دموی ما: فایل نمایش ۲۰ پهپادی که ساختیم هیچ بلوک ژئوفنسی ندارد و شبیه‌سازی بدون آن پرواز کرد. برای پرواز واقعی چندضلعی محدوده‌ی مجاز را به‌اضافه‌ی حاشیه اضافه می‌کنید و عمل را همراه با طرح ایمنی انتخاب می‌کنید. حصار خیلی تنگ در حرکت‌های عادی آرایش هشدار کاذب می‌دهد و حصار خیلی گشاد از چیزی محافظت نمی‌کند. اول در شبیه‌ساز آزمایش کنید: عمداً یک پهپاد را به لبه ببرید.

RTK. Ordinary GPS is accurate to a few metres, which is not enough to keep drones 3 m apart in a tight shape. RTK (real-time kinematic) compares the satellite signal at the drone with a reference station at a known position and corrects it to centimetres. The corrections travel as RTCM3 messages. The Skybrush Server's RTK extension reads them from a source (a base station on a serial port, or a network service) and forwards them to the drones as MAVLink GPS_RTCM_DATA messages, split into fragments. Oversized RTCM packets are dropped, so keep the message set modest.

RTK. Normales GPS ist auf wenige Meter genau, zu wenig, um Drohnen in einer engen Form 3 m auseinander zu halten. RTK (Real-Time Kinematic) vergleicht das Satellitensignal an der Drohne mit einer Referenzstation an bekannter Position und korrigiert auf Zentimeter. Die Korrekturen reisen als RTCM3-Nachrichten. Die RTK-Erweiterung des Skybrush Servers liest sie aus einer Quelle (Basisstation an einer seriellen Schnittstelle oder ein Netzwerkdienst) und leitet sie als MAVLink-GPS_RTCM_DATA-Nachrichten in Fragmenten an die Drohnen weiter. Zu große RTCM-Pakete werden verworfen, halten Sie den Nachrichtensatz also schlank.

RTK. GPS معمولی چند متر دقت دارد و برای نگه‌داشتن فاصله‌ی ۳ متری پهپادها در یک شکل فشرده کافی نیست. RTK (جنبشی بلادرنگ) سیگنال ماهواره در پهپاد را با ایستگاه مرجع در نقطه‌ای با مختصات معلوم مقایسه می‌کند و تا سانتی‌متر اصلاح می‌کند. اصلاحات به‌صورت پیام‌های RTCM3 می‌رسند. افزونه‌ی RTK سرور Skybrush آنها را از یک منبع (ایستگاه پایه روی پورت سریال یا یک سرویس شبکه‌ای) می‌خواند و به‌صورت پیام‌های MAVLink از نوع GPS_RTCM_DATA و در تکه‌های کوچک به پهپادها می‌رساند. بسته‌ی RTCM بیش‌ازحد بزرگ دور ریخته می‌شود، پس مجموعه‌ی پیام را کوچک نگه دارید.

Two ways to get a reference: your own base station (for example a u-blox F9P module, set up once on the site) or a correction service. In Germany the state surveying offices run SAPOS; my earlier research found HEPS (the real-time centimetre service) at about 10 € per month per user ID plus a one-time 100 € registration, but prices differ by Land and change, so check the current fee list yourself. A service needs mobile internet at the field; a base station needs none but must be set up carefully. If you route corrections over a second radio link, the server's configuration has a routing option for that.

Zwei Wege zu einer Referenz: eine eigene Basisstation (z. B. ein u-blox-F9P-Modul, einmal am Einsatzort eingerichtet) oder ein Korrekturdienst. In Deutschland betreiben die Landesvermessungsämter SAPOS; meine frühere Recherche fand für HEPS (den Echtzeit-Zentimeterdienst) etwa 10 € pro Monat je Nutzerkennung plus einmalig 100 € Anmeldung, doch die Preise unterscheiden sich je Land und ändern sich, prüfen Sie also die aktuelle Gebührenliste selbst. Ein Dienst braucht mobiles Internet am Platz; eine Basisstation braucht keines, muss aber sorgfältig aufgebaut werden. Wenn Sie Korrekturen über eine zweite Funkstrecke führen, hat die Serverkonfiguration dafür die Option routing.

دو راه برای داشتن مرجع: ایستگاه پایه‌ی خودتان (مثلاً ماژول u-blox F9P که یک بار در محل راه‌اندازی می‌شود) یا یک سرویس تصحیح. در آلمان ادارات نقشه‌برداری ایالتی SAPOS را اداره می‌کنند؛ در پژوهش قبلی من HEPS (سرویس بلادرنگ سانتی‌متری) حدود ۱۰ یورو در ماه برای هر شناسه‌ی کاربر به‌اضافه‌ی ۱۰۰ یورو ثبت‌نام یک‌باره بود، ولی قیمت بین ایالت‌ها فرق می‌کند و تغییر می‌کند؛ فهرست تعرفه‌ی فعلی را خودتان ببینید. سرویس در محل اینترنت موبایل می‌خواهد؛ ایستگاه پایه نمی‌خواهد ولی باید با دقت برپا شود. اگر اصلاحات را روی لینک رادیویی دوم بفرستید، پیکربندی سرور گزینه‌ی routing برای آن دارد.

What the simulator does and does not teach. Our simulated drones report gps_fix=6 (RTK fixed) from the start, because the simulator hands them perfect positions; no corrections are involved. So SITL cannot teach you RTK setup, base-station placement, correction latency or fix loss. It only shows that the show logic works when the fix is good. In the real world, check the fix before every start: refuse to arm drones that are not in RTK fixed, and watch for fix loss in flight, because a drone that drifts by a metre can leave its slot.

Was der Simulator lehrt und was nicht. Unsere simulierten Drohnen melden von Beginn an gps_fix=6 (RTK fixed), weil der Simulator ihnen perfekte Positionen liefert; Korrekturen sind nicht beteiligt. SITL kann also weder RTK-Einrichtung noch Basisstationsstandort, Korrekturlatenz oder Fix-Verlust vermitteln. Es zeigt nur, dass die Showlogik bei gutem Fix funktioniert. In der Praxis prüfen Sie den Fix vor jedem Start: Drohnen ohne RTK fixed nicht armen, und im Flug auf Fix-Verlust achten, denn eine Drohne, die um einen Meter driftet, kann ihren Platz verlassen.

شبیه‌ساز چه چیزی یاد می‌دهد و چه چیزی نه. پهپادهای شبیه‌سازی‌شده‌ی ما از همان ابتدا gps_fix=6 (RTK ثابت) گزارش می‌کنند، چون شبیه‌ساز موقعیت کامل به آنها می‌دهد؛ هیچ تصحیحی در کار نیست. پس SITL راه‌اندازی RTK، جای ایستگاه پایه، تأخیر تصحیح یا از دست رفتن fix را یاد نمی‌دهد؛ فقط نشان می‌دهد منطق نمایش وقتی fix خوب است کار می‌کند. در دنیای واقعی fix را پیش از هر شروع بررسی کنید: پهپادی که RTK ثابت ندارد را آرم نکنید و در پرواز مراقب از دست رفتن fix باشید، چون پهپادی که یک متر منحرف شود می‌تواند از جایگاهش خارج شود.

show.json (geofence block, optional)
  maxAltitude, minAltitude, maxDistance, polygons[], action

→ FENCE_ALT_MAX / FENCE_ALT_MIN / FENCE_RADIUS
→ FENCE_ACTION (0 report · 1 return · 2 land · 4 stop)
→ FENCE_TYPE (bits) → FENCE_ENABLE

base station / SAPOS → RTCM3 → Server (rtk extension) → GPS_RTCM_DATA → drones

9. Safety and rules9. Sicherheit und Regeln۹. ایمنی و مقررات

A simulator cannot hurt anyone; real drones can. Before any real flight, learn the rules where you fly. In the EU, drone operations fall under Regulation (EU) 2019/947 (open, specific and certified categories). Multi-drone light shows above people or over built-up areas generally need an authorisation in the specific category, backed by a risk assessment (SORA). In Germany the authority is the Luftfahrt-Bundesamt (LBA) or the competent Land authority; always confirm with them directly.

Ein Simulator kann niemanden verletzen, echte Drohnen schon. Informieren Sie sich vor jedem echten Flug über die Regeln am Flugort. In der EU gilt die Verordnung (EU) 2019/947 (Kategorien „offen“, „speziell“, „zertifiziert“). Lichtshows mit mehreren Drohnen über Menschen oder bebautem Gebiet brauchen in der Regel eine Genehmigung in der Kategorie speziell, gestützt auf eine Risikobewertung (SORA). In Deutschland ist die Behörde das Luftfahrt-Bundesamt (LBA) bzw. die zuständige Landesbehörde; klären Sie das immer direkt mit ihr.

شبیه‌ساز به کسی آسیب نمی‌زند، پهپاد واقعی می‌زند. پیش از هر پرواز واقعی مقررات محل پرواز را یاد بگیرید. در اتحادیه‌ی اروپا عملیات پهپادی تحت مقررات (EU) 2019/947 است (دسته‌های باز، خاص و گواهی‌شده). نمایش‌های نوری چندپهپادی بالای سر آدم‌ها یا روی مناطق ساخته‌شده معمولاً مجوز در دسته‌ی خاص با ارزیابی ریسک (SORA) می‌خواهند. در آلمان مرجع، Luftfahrt-Bundesamt (LBA) یا اداره‌ی صلاحیت‌دار ایالتی است؛ همیشه مستقیم با آنها تأیید کنید.

Good habits that apply from day one:

Gute Gewohnheiten, die ab dem ersten Tag gelten:

عادت‌های خوبی که از روز اول لازم است:

This page is learning material only. It is not legal advice and does not replace the guidance of the aviation authority.

Diese Seite ist reines Lernmaterial. Sie ist keine Rechtsberatung und ersetzt nicht die Auskunft der Luftfahrtbehörde.

این صفحه فقط مطلب آموزشی است؛ مشاوره‌ی حقوقی نیست و جای راهنمایی اداره‌ی هوانوردی را نمی‌گیرد.

Tools: Skybrush (GPLv3), Blender, ArduPilot. Names belong to their owners; this site is not affiliated with them. Werkzeuge: Skybrush (GPLv3), Blender, ArduPilot. Die Namen gehören ihren Inhabern; diese Seite steht in keiner Verbindung zu ihnen. ابزارها: Skybrush (GPLv3)، Blender، ArduPilot. نام‌ها متعلق به صاحبانشان است و این سایت وابسته به آنها نیست.