All Case Studies
TechnologyFebruary 10, 202613 min

How We Built a Drone Swarm Control Interface with a Blender-Like Animation Planner

GarudX built a custom swarm choreography system on top of Skybrush and Crazyflie platforms — with an animation planner that works like Blender's timeline. Here's the full technical story: hardware, software, positioning, and what we learned.

How We Built a Drone Swarm Control Interface with a Blender-Like Animation Planner
50
Drone Swarm
<8cm
Formation Accuracy
2cm
Lighthouse Precision
Blender
Design Tool

Most drone show software is designed for operators, not for designers. You import waypoints. You set LED colours. You verify there are no collisions. You press go.

What we wanted was something that felt like a creative tool — where you could scrub through time, shape formations geometrically, see the show play back in 3D simulation before anything was armed, and feel like you were animating rather than filing a flight plan.

This is the story of what we built, what we built it on, and what we learned.


The Stack: Skybrush + Crazyflie + Our Custom Interface

The foundation of our swarm system is two open-source projects that work together exceptionally well: Crazyflie nano-quadcopters from Bitcraze, and Skybrush — an open-source show control suite originally developed for professional outdoor drone shows but adaptable for indoor micro-swarm work.

Why Crazyflie?

The Crazyflie 2.1+ weighs 29 grams with motors. It's essentially a flying circuit board — tiny enough to be safe in an indoor crowd environment, modular enough to accept positioning decks and LED payloads, and crucially, it has open-source firmware that Skybrush directly supports.

Each unit carries an LED ring deck: 12 RGB LEDs plus 2 high-intensity whites, controlled from the flight controller or from the show script. The LED colours can change in synchronisation with formation transitions, beat drops, or any show event.

For our 50-drone test build, we used the coreless-motor Crazyflie 2.1+ for most units, with several Crazyflie 2.1 Brushless (stronger motors, 10-minute endurance, 40g payload capacity) for testing heavier custom LED payloads.


The Positioning Problem: How Do 50 Drones Know Where They Are Indoors?

GPS doesn't work indoors. This is the fundamental challenge of indoor swarm flight, and how you solve it determines everything else.

We evaluated three options:

Ultra-Wideband (UWB) / Loco Positioning Anchor nodes mounted around the venue emit UWB radio pulses. Each drone carries a Loco positioning deck that measures time-of-flight from each anchor and calculates its own position. Accuracy: ±10–20cm. For a 10×10m room, you need 8 anchors at different heights to avoid dead zones.

This is our primary system for event-scale deployments. It's self-contained (no external computer for tracking), tolerates RF interference reasonably well, and scales to larger spaces by adding anchors.

Lighthouse (Infrared) SteamVR Base Station V2 units (the same hardware used for high-end VR headsets) project infrared sweeps. The Lighthouse deck on each drone detects the sweeps and calculates position onboard with ≤2cm accuracy — the highest precision of our tested options.

Limitation: each base station covers approximately a 5×5m volume. A 10×10m space needs four. The accuracy is exceptional but the infrastructure cost is higher than UWB.

Motion Capture (OptiTrack / Vicon) 8–12 cameras mounted around the room, reflective marker decks on each drone. Sub-millimetre accuracy. Used in academic research, professional VFX shoots, and anywhere that requires the highest precision.

Cost-prohibitive for most event applications, but we use a smaller mocap system for R&D and tuning where the data quality justifies it.


Skybrush: The Show Control Layer

Skybrush is three components:

Skybrush Server — a Python backend running on the ground station that communicates with all drones via Crazyradio USB dongles (each dongle handles ~10 drones at 2 Mbit/s). The server manages telemetry, mission uploading, geofencing, and emergency stop.

Skybrush Live — the operator desktop client. Pre-flight checks, battery status, positioning quality, and show start. Every drone that isn't ready appears in red or yellow. You don't arm until everything is green.

Skybrush Studio — a Blender plugin. This is where the shows are designed.


The Blender Plugin: Where Our Custom Work Begins

Skybrush Studio is a Blender add-on — which immediately gives the show designer access to Blender's complete 3D environment: the viewport, the timeline scrubber, the keyframe system, the geometry tools.

The basic workflow: create a formation (a geometric arrangement of drone positions in 3D space), keyframe it at a timestamp, create another formation at a later timestamp, and Skybrush auto-generates collision-free transition trajectories between them.

The scripting language (Skyscript) is Python-like and lets you define formations programmatically. You create a Swarm object (size=50 for our build), define Formation presets — ring, sphere, text — and call swarm.at(timestamp).transition_to(formation) to keyframe each shape change. Skybrush interpolates the collision-free paths between keyframes automatically.

LED colour works the same way: swarm.leds.at(time=0).set_color("#00FF41") sets all drones to GarudX green at the start; swarm.leds.at(time=8).fade_to("#FFFFFF", duration=2.0) fades them to white over two seconds. Every LED cue is time-synced to the formation cue in the same timeline.

Before export, Skybrush runs collision detection across the entire sequence. Any point where two drones come within the defined safety margin (we use 35cm for our drone size) is flagged and the system suggests an automatically resolved fix.


Our Custom Extensions

The base Skybrush + Crazyflie stack is powerful. But we added several layers specific to GarudX's workflow:

Venue geometry import: We scan the venue with a LiDAR sensor (sometimes with our UAV system, sometimes with a handheld scanner) and import the room geometry into Blender. The show is designed against the actual room dimensions, not an assumed box. Columns, lighting rigs, and ceiling height variations are all accounted for in the collision detection.

Audience safety zones: We define exclusion zones around spectator areas. The geofence is physically enforced at the firmware level — drones cannot enter these zones regardless of what the show script says.

Dynamic response triggers: We're prototyping gesture-triggered formation changes — using a ground-station webcam with MediaPipe hand tracking to map specific gestures to pre-loaded Skybrush formations. This is in R&D, but the architecture is working in controlled tests.


What the 50-Drone Test Taught Us

The formation accuracy was better than expected: consistently within 8cm with Lighthouse positioning. The LED synchronisation — all 50 drones changing colour simultaneously — had sub-frame timing variance. This is better than most professional outdoor show systems we've seen benchmarked.

The failures we had were primarily battery management (resolved with improved pre-flight charge balancing) and one instance of radio congestion when we ran three Crazyradio dongles on the same channel (resolved by assigning separate channels per radio).

The creative workflow — designing in Blender, simulating in real time, exporting to the show controller — worked exactly as we hoped. A show designer with Blender experience can be productive in Skybrush Studio within a day.


Where This Is Going

We're currently at 50 drones. The architecture scales to several hundred without fundamental changes. The limiting factors are radio channel capacity (manageable with more dongles), positioning anchor density (one additional UWB anchor per 10m² added), and battery logistics.

Indoor drone shows. Corporate events. Cultural performances. Interactive installations. If you're thinking about what this could look like for your project, reach out.

Tags
Drone Swarm SoftwareIndoor Drone Show NepalSwarm ChoreographyCrazyflie NepalSkybrushAutonomous Drone NepalBlender Drone AnimationLED Drone Show
Interested?Start your projectRequest Demo