Navi3D Drone Studio — Documentation
Version: Beta 0.1.0 Supported airframes: Micro 8520 • Micro 8520 PRO • F450 Quad Flight controller family: Teensy 4.x Connection: Web Serial (USB VCP)
Navi3D Drone Studio is a browser-based ground station and configurator for the Navi3D flight-control stack. Everything from airframe selection, firmware flashing, sensor health checks, PID tuning, calibration, mission planning, in-flight telemetry, and post-flight log analysis lives in one place — no separate desktop application, no command line, no driver install beyond what your OS provides for the Teensy.
The studio talks to your flight controller over a USB serial port using the Web Serial API, so a modern Chromium-based browser (Chrome, Edge, Brave, Arc) on Windows, macOS, or Linux is everything you need.
This document covers the full studio surface area: every module, every workflow, every status indicator, and every calibration step in order.
Table of Contents
- Studio Overview
- First-Time Setup
- The Studio Shell
- Drone Selection
- Sensor
- Tuning
- Map
- Analysis & The Calibration Workflow
- Blackbox
- Fleet
- Serial Connection Reference
- Glossary
- Troubleshooting
1. Studio Overview
Navi3D Drone Studio is built around a module bar at the top of every page. The seven modules — Drone Selection, Sensor, Tuning, Map, Analysis, Blackbox, Fleet — represent the natural arc of working with a Navi3D-powered aircraft:
| Module | Purpose | When you use it |
|---|---|---|
| Drone Selection | Pick airframe + flash firmware | First time, or when changing hardware |
| Sensor | Live health dashboard | Pre-flight and during ground testing |
| Tuning | PID, altitude/position-hold gains, calibration matrix | After calibration, before flight |
| Map | Mission planning, GPS telemetry, flight commands | During autonomous flight |
| Analysis | Vibration trace, accel calibration, motor diagnostics | After build, after any mechanical change |
| Blackbox | Retrieve and plot flight logs | After every flight |
| Fleet | Multi-drone coordination | Roadmap (Alpha) |
The right edge of the top bar always shows two things: a connection status dot (red = serial offline, green = connected) and the build version (currently Beta 0.1.0). You can switch modules at any time without dropping the serial link.
Supported Airframes
Three hardware profiles ship with Beta 0.1.0. The studio loads a different configuration target for each — wiring, motor protocol, sensor expectations, and default PIDs all differ.
- Micro 8520 — A small, indoor-friendly airframe using coreless 8520 brushed motors driven at 16 kHz PWM. Designed for a 1S LiPo. Includes a Time-of-Flight sensor for low-altitude ground cushion.
- Micro 8520 PRO — The 8520 platform extended with optical-flow positioning on top of the ToF sensor. Suitable for indoor position-hold.
- F450 Quad — Full-size brushless quadcopter using DSHOT300 native parallel output on four ESCs. The closest profile to a "traditional" racing/freestyle build, but with the Navi3D firmware stack.
*The Micro 8520 base profile is marked Coming Soon in Beta 0.1.0.* The PRO and F450 profiles are flight-ready. The base profile shares the same firmware family and will activate when the default ground-cushion tuning is finalised.
How the Studio Talks to the Drone
All studio↔drone communication is a single bidirectional JSON-line serial protocol over Web Serial at 500000 baud. The drone publishes telemetry frames at 20 Hz (one JSON object per line), and the studio sends commands as JSON objects (one per line). There is no binary mode, no MAVLink dependency, no third-party driver — just lines of text on a USB serial port. This makes the protocol easy to log, easy to debug, and easy to extend.
2. First-Time Setup
A clean run-through from "I just got the hardware" to "the studio is reading live data."
2.1 Prerequisites
- A Chromium-based browser with Web Serial enabled (Chrome 89+, Edge, Brave, Arc, Opera). Firefox and Safari do not support Web Serial and cannot connect.
- A data-capable USB cable. Charge-only USB-C cables are the single most common cause of "the drone won't connect." If you have any doubt, use a cable that is known to mount external SSDs or phones for data transfer.
- The Teensy Loader driver, which ships with Teensyduino. On macOS and Windows the OS recognises the Teensy 4.x as a serial device out of the box. On Linux you need the udev rules from PJRC — copy them to /etc/udev/rules.d/ and run sudo udevadm control --reload.
2.2 Open the Studio
Navigate to navi3d.in/drone-studio. The studio loads directly into the Drone Selection module. There is no sign-up step in Beta 0.1.0 — the studio runs entirely in your browser and does not transmit your configuration to any server.
2.3 Select an Airframe
Click the card matching your build (Micro 8520 PRO or F450 Quad in current Beta). The studio loads that airframe's defaults and exposes the Hardware Configuration page, where you'll flash firmware and open the serial link.
2.4 Flash and Connect
On the Hardware Configuration page you'll see two firmware targets and a Serial Connection panel. Walk through the full flow — Flash → Connect → Engage — in Section 4 below.
Once the connection status dot turns green, every other module becomes useful. The natural next step is Analysis for a calibration pass (covered in Section 8), then Tuning, then a careful first hover.
3. The Studio Shell
Every page in the studio shares the same top bar:
- Logo + name on the left (clickable, returns to Drone Selection).
- Module tabs in the centre. The currently active module is highlighted with a soft pill background.
- Connection status dot on the right. Red means no serial port is open. Green means a Teensy is connected and publishing telemetry. The dot does not flicker on individual packet loss — short link blips are absorbed silently.
- Version badge on the far right. Always shows the studio build (e.g. Beta 0.1.0).
Below the top bar each module renders its own dashboard. The studio uses a uniform dark theme tuned for outdoor field use — high-contrast type on a near-black background, accent colours reserved for state (yellow = caution / live values, green = healthy / connected, red = fault / disconnected, blue = action / actionable).
You can switch modules at any time. The serial connection, calibration state, and any unsaved field edits persist across module switches until you reload the page.
4. Drone Selection
The Drone Selection module is the starting point of every session. Its job is to (a) tell the studio which airframe you are working with and (b) get the right firmware onto the Teensy and a serial link open to it.
4.1 Choosing an Airframe
The landing page shows a card per supported airframe. Each card lists the motor type, the on-board sensors, and the MCU family:
- Micro 8520 — Coreless · ToF Sensor · Teensy (Coming Soon)
- Micro 8520 PRO — Coreless · OptiFlow + ToF · Teensy
- F450 Quad — Brushless · DSHOT300 · Teensy
Click a card to enter that airframe's Hardware Configuration page. You can return to selection at any time using the ← Back to Selection link at the top of the page.
4.2 Hardware Configuration
The Hardware Configuration page is split into two panels.
Available Firmware Targets (left) lists the firmware images you can flash to the Teensy for the chosen airframe. There are always at least two:
- Teensy Micro FC (Brushed) / Teensy F450 FC (Brushless) — the main flight-controller firmware. This is what you fly with. It runs the full control loop, reads the receiver, drives the motors, holds altitude/position when commanded, logs to Blackbox, and streams telemetry to the studio.
- Teensy Hardware Calibration — a standalone diagnostic firmware. It contains the 6-point accelerometer calibration, the mounting-trim measurement, and the motor vibration sweep. It writes its results to EEPROM in a layout the main FC firmware reads on boot, so calibration done with this firmware applies as-is when you re-flash the main FC.
Select the target you want and press FLASH FIRMWARE. The studio asks the browser to put the Teensy into program mode and uploads the corresponding .hex. Flashing usually completes in 5–10 seconds and the Teensy reboots into the new firmware automatically.
Serial Connection (right) is where you open the link to a Teensy that's already running firmware.
- Port Selection defaults to USB VCP (Browser Prompt). When you press Establish Serial Link, the browser shows its native picker listing every serial device — pick the Teensy from that list.
- Baud Rate defaults to 500000 for Teensy. Don't change this unless you have specifically reconfigured your firmware to use a different rate.
- LISTEN & ENGAGE (top-right of the panel) is a shortcut that opens the most recently used port without re-prompting, useful when you've connected once already in this browser session.
Press ESTABLISH SERIAL LINK to open the port. The connection dot in the top bar will turn green, and the System Status indicator on the Sensor page will move from DISCONNECTED to live.
The two firmware images share an EEPROM layout. Calibration data, PID gains, and mount-trim values written by either firmware are read by the other. This is by design: you calibrate with one image, then fly with the other, and nothing is lost.
5. Sensor
The Sensor page is the live ground-station dashboard. It is the page you'll keep open during pre-flight checks and ground testing. Every card on the page is read-only by design — Sensor is for observing the drone, not configuring it. Configuration lives in Tuning and Map.
The page is organised as a grid of independent panels:
5.1 Attitude (IMU)
The artificial-horizon disk at top-left shows live pitch and roll, with text readouts for pitch, roll, and yaw to the right. The disk fills with the horizon banking and tilting as the drone moves, exactly as a pilot's instrument would. The VIEW 3D button toggles a three-dimensional model of the airframe in the same orientation — useful for visually confirming that the IMU mounting orientation matches the studio's expectations.
If pitch and roll do not respond when you tilt the drone, the IMU has failed to initialise. The most common cause is a wiring or solder issue on the SPI line to the LSM6DSOX. Re-seat the connector, power-cycle, and re-check.
5.2 Power System
Voltage, current draw, capacity consumed (mAh), and a percentage-of-pack readout. The battery profile is shown as a small tag — 1S LIPO (MICRO) for the 8520 family, 4S LIPO for the F450. The percentage is computed from the full pack voltage curve, not from coulomb counting, and is therefore a rough guide rather than a precise fuel gauge. Use the mAh consumed field for end-of-flight battery management.
The power panel is the single most important pre-flight indicator. Treat a voltage that doesn't match your charged pack as a red flag — it usually means a bad battery cable or a faulty divider on the FC board.
5.3 Telemetry Stream
Live bandwidth usage of the USB serial link, broken into TX (KB/s) — what the drone sends to the studio — and RX (KB/s) — what the studio sends to the drone. A rolling line graph shows the last few seconds of TX rate. The tag in the corner (SERIAL) reminds you which transport is in use; future builds may add radio links.
Healthy steady-state TX is in the low tens of KB/s. Sustained drops to zero indicate a USB cable seating problem.
5.4 System Status
A single text field showing the link state: DISCONNECTED, CONNECTING, LIVE, or a specific error. If you opened the link from Drone Selection and this still says DISCONNECTED, refresh and re-pick the port.
5.5 Motor Feed
Four sliders (M1–M4) showing the live mixer output to each motor, plus a Test button per motor. Tapping Test spins that motor at a safe low throttle for one second so you can confirm correct wiring, rotation direction, and prop placement. Always test motors with props removed until the airframe is fully calibrated and trimmed.
5.6 Receiver Input
A breakdown of every channel coming in from your transmitter. The tag at the top right names the protocol and channel count — FLYSKY IBUS / PAD - 10CH is the default for the Micro family.
Two stick visualisers show the four primary stick axes:
- Left stick: THR (vertical) and YAW (horizontal)
- Right stick: PIT (vertical) and ROL (horizontal)
A yellow dot tracks the live stick position. Numerical channel values (1000 → 2000) are shown below each square.
Below the sticks, channels 5–10 are shown as horizontal bars, also with numerical readouts. Use these for confirming switch positions for arm/disarm, flight mode selection, and beeper.
5.7 Compass
A live magnetic compass with N/E/S/W markers and a heading readout. The Beta 0.1.0 firmware uses gyro-integrated heading until magnetometer support ships; the dial therefore reflects yaw integration from boot, not absolute magnetic north. Re-zero by power-cycling on the heading you want as zero.
5.8 GPS Data
Satellite count, fix type (NO FIX, 2D FIX, 3D FIX), and last reported latitude/longitude. The studio considers the drone safe to launch autonomous missions only with 3D FIX and ≥ 10 satellites. Below that threshold the Map module will refuse to upload waypoints.
5.9 Barometer / ToF
Combined altitude card. If a barometer is fitted, it reports altitude above launch. The Time-of-Flight sensor (the laser ranger pointing at the ground) takes precedence at low altitudes — its accuracy at 0–2 m is much better than a barometer's. A FAULT tag here indicates the studio is not receiving valid range data; check the I²C wiring and the sensor's line-of-sight to the ground.
5.10 Optical Flow
Shows the live optical-flow estimate from the PMW3901 (on the Micro 8520 PRO): the altitude in mm (from the ToF), the flow integrals in X and Y, and a quality score 0–100%. Optical flow needs texture under the sensor to work — a uniform white floor will give a low quality reading and unstable hold. Quality below ~60% means position-hold will drift; recover by flying over a patterned surface or improving the lighting.
A FAULT tag means the sensor isn't responding on SPI at all.
6. Tuning
The Tuning module — Flight Dynamics Tuning — is where the drone's behaviour in the air is shaped. Everything on this page writes to EEPROM (when you press SAVE), and the changes take effect on the next motor cycle.
The page is split into two cards: PID Controller & EEPROM Matrix on the left, Altitude & Position Hold Tuning on the right.
The Tuning page is interactive only when the drone is connected. The right-hand card shows a HARDWARE OFFLINE tag and disables its Save button until a serial link is open.
6.1 Live PID Values
The top of the left card shows three live readouts:
- Roll PID (Live)
- Pitch PID (Live)
- Yaw PID (Live)
These are the total mixer effort the rate controller is producing right now, in PID-loop units. With the drone sitting still on the bench, they should hover near 0. If you give the drone a gentle nudge by hand, you should see the corresponding axis spike and then settle back. This is how you verify the loop is closing without arming the motors.
6.2 Live PID Tuning
Below the live readouts are nine input fields arranged in a 3×3 grid: rows for Roll, Pitch, Yaw and columns for P, I, D. These are the rate-loop gains that govern how aggressively the drone counteracts disturbance and follows commanded rotation.
Two buttons sit below:
- APPLY (RAM) — writes the new gains to the running firmware without committing to EEPROM. Power-cycling the drone discards the change. This is the safe path for in-air tuning passes: try a value, fly, decide, then either Save it or change it again.
- SAVE (EEPROM) — commits to non-volatile memory. The gains survive power-cycles.
The recommended tuning workflow is:
- Start with the studio's defaults for your airframe.
- Calibrate accel and trim first (see Section 8). Tuning on top of an uncalibrated IMU is wasted effort.
- Tune in this order: P → D → I, one axis at a time, Roll first.
- Use APPLY between flights, only SAVE when you're sure.
There is no "auto-tune" feature in Beta 0.1.0.
6.3 EEPROM Calibration Matrix
The bottom of the left card shows the currently stored calibration values:
- Offset X / Y / Z — accelerometer bias in m/s², in the raw sensor frame.
- Scale X / Y / Z — accelerometer scale factors (ideally close to 1.0).
- Pitch Trim / Roll Trim — physical mounting-tilt compensation in degrees.
A badge in the top-right reflects the calibration state:
- UNCALIBRATED (DEFAULTS) (yellow) — the EEPROM contains the factory zeroes (offset 0, scale 1, trim 0). Flying with this is possible but the level-hover attitude will be off by however much your IMU is physically tilted on the board. The studio shows this warning until a real calibration has been written.
- CALIBRATED (green) — the matrix contains user-written values.
This card is informational. To actually run a calibration, you use the Analysis module — covered in detail in Section 8.
6.4 Altitude & Position Hold Tuning
The right-hand card governs the outer-loop controllers that take ToF altitude and optical-flow position and turn them into roll/pitch/throttle setpoints for the inner rate loop.
HOLD PID LOOPS (ToF & Flow) — two rows of P/I/D inputs:
- ALT — the altitude-hold loop. Drives throttle from ToF altitude error.
- POS — the position-hold loop. Drives roll/pitch setpoint from optical-flow displacement.
FLIGHT ENVELOPE — limits applied to the autonomous controllers:
- CLIMB MAX (m/s) — the maximum vertical speed the altitude controller will command. Default 0.8 m/s. Higher values feel snappier but couple ToF noise into throttle.
- HOVER (DSHOT) — the throttle value at which the airframe hovers. Default 650. This is the controller's starting guess at hover throttle; it self-corrects via the altitude I-term, but a closer initial value means a smaller takeoff bump.
- VEL MAX (m/s) — the maximum lateral speed the position controller will command. Default 0.8 m/s.
- FLOW SCALE — a gain on the optical-flow displacement before it enters the position loop. Default 1.0. Increase if the drone underreacts to drift, decrease if it overshoots.
OPTICAL FLOW CALIBRATION — five small fields that re-wire the optical-flow sensor's coordinate frame onto the airframe's body frame:
- SWAP X/Y — 0 (No Swap) or 1 (Swap). Required if the sensor is mounted rotated 90° from the IMU.
- INVERT X / INVERT Y — 1 (Normal) or -1 (Inverted). Flips a sign if the sensor sits face-up vs. face-down or if the rotation flips one axis.
- POS INV PITCH / POS INV ROLL — 1 (Normal) or -1 (Inverted). Inverts the sign of the corrective response — used when the drone drifts in the opposite direction of what the position controller intends.
If you don't know which of these to flip, the empirical method is: arm in altitude-hold (no position-hold), nudge the drone gently, watch which direction the studio reports flow, then enable position-hold and watch the drone's correction. If it overcorrects in the wrong direction, flip the corresponding INV.
The APPLY/SAVE buttons at the bottom work the same way as on the left card.
7. Map
The Map module is the live mission planner and tracking view. It uses satellite imagery by default (with a toggle to a street basemap), centred either on the drone's current GPS position or on a manually searched location.
7.1 Live Telemetry (Top-Left)
A compact panel showing the essentials you want visible during autonomous flight:
- BATT — voltage and current.
- ALT (ToF) — altitude above ground from the Time-of-Flight sensor. Reads --m if no ToF data is available.
- LINK — packet-loss percentage on the studio↔drone link. Anything under 1% is normal serial behaviour.
- SATS — satellite count and fix type.
- SWITCH TO STREET MAP / SWITCH TO SATELLITE — toggles the basemap.
7.2 Mission Planning (Top-Right)
Build a mission by adding waypoints in order. Each waypoint stores a latitude, longitude, and altitude.
- Click on the map to add a waypoint at that location, or press + ADD WP to insert one at the current drone position.
- The waypoint list shows the index, the coordinates, and the target altitude in metres above launch (ALT: 100m, etc).
- Click an existing waypoint in the list to edit its altitude.
- CLEAR removes all waypoints.
When the mission is ready, press UPLOAD TO FC. The studio sends the entire waypoint list as JSON to the drone in one shot. The drone acknowledges and stores the mission in volatile memory — it is not persisted across power cycles. Re-upload before each flight.
7.3 Search
The top-centre search bar accepts free-form text: a city name, a street, an address, or raw lat, lon coordinates. Pressing SEARCH re-centres the map.
7.4 Flight Commands
Three buttons sit at the bottom of the map:
- TAKEOFF — commands the drone to arm and climb to its configured takeoff altitude (default 1.2 m). Only valid with 3D FIX and ≥10 satellites, or in indoor mode with valid ToF + optical-flow.
- RTH (RETURN) — Return-to-Home. Commands the drone to climb to a safe altitude (default 10 m), fly back to the launch coordinates, descend, and land. Available only outdoors with a recorded launch fix.
- LAND — descent to ground at the current location using the ToF sensor for the last metre of flare.
All three commands require an armed receiver state. They are a request to the FC, not a direct override — the FC will reject them if its own safety checks fail (low battery, geofence breach, lost fix).
8. Analysis & The Calibration Workflow
The Analysis module — Hardware Analysis & Diagnostics — is the calibration and diagnostic workshop. It is where you make the airframe honest before tuning, by measuring two physical properties of the build that no amount of in-flight tuning can compensate for: the accelerometer's bias and scale, and the mechanical noise reaching the IMU from the motors.
8.1 The Two Routines
The right side of the page shows two large action buttons in the ROUTINES card:
- RUN MOTOR NOISE SWEEP
- MICRO ACCELEROMETER CALIBRATION
Both routines require the Teensy Hardware Calibration firmware to be flashed and a serial link open. The Calibration firmware contains the math, the motor driver, and the protocol responses; the studio is purely the operator's interface to those routines. If you try to start a routine while the main FC firmware is running, the studio will show a fault and ask you to switch firmware in Drone Selection.
8.2 Motor Noise Sweep
The Motor Noise Sweep characterises the vibration signature of your assembled airframe. Vibration is what turns a perfectly calibrated drone into a twitchy mess in the air: motor-spin imbalance, prop bend, and frame resonance all show up as broadband noise on the gyro and accelerometer, which the controller then chases.
What the routine does. With the drone sitting on a soft surface — a foam pad, a folded towel, not a hard tabletop, which rings — the firmware sweeps all four motors together through a low-throttle range (above idle but well below hover), holding each step for ~30 ms while sampling the IMU at full rate. The studio captures the IMU data and computes the RMS dynamic acceleration and the RMS gyro angular rate over the sweep.
How to read the results. The Analysis page shows two numbers at the bottom of the noise-floor card:
- Gyroscope Angular Noise — RMS body-rate noise during the sweep, in °/s.
- Accelerometer Linear Noise — RMS linear-accel noise during the sweep, in m/s².
The plot above is a visual peak-to-peak amplitude trace.
Healthy ranges for the Micro 8520 PRO with stock motors and good props are roughly < 0.6 °/s gyro and < 1.5 m/s² accel. The F450 with quality props lands < 1.0 °/s and < 2.0 m/s². Numbers above twice these thresholds are a sign of a mechanical problem: bent prop, damaged motor bell, loose arm, or — most commonly — a foam mount that has hardened or cracked.
The Airframe Status indicator at the bottom of the card carries the same conclusion in plain English: Pending Sweep, Good, Marginal, or Excessive Vibration. Don't fly an airframe in the last state — the controller will compound the noise into visible oscillation, and your blackbox PID-error plots will be unusable for tuning.
Always run the sweep with props off if you suspect motor imbalance — the same routine still measures bearing rumble and bell noise without putting the drone at risk. With props on, the routine will produce thrust; the soft surface prevents the drone from skittering across the bench.
8.3 The Motor Synchronization Panel
Below Routines, the MOTOR SYNCHRONIZATION card visualises the four motor outputs during a sweep or test. Each motor has a slider and an RPM readout. On airframes with bi-directional DSHOT (currently roadmap), the readout is true RPM read back from the ESC; on the Micro family (PWM) the tag shows PWM MODE (NO RPM DATA) and the readout is N/A.
This card is mostly a sanity check: during the sweep all four sliders should rise in lockstep. Any motor that lags or refuses to spin is a wiring or ESC issue that needs to be fixed before calibrating anything else.
8.4 Micro Accelerometer Calibration
This is the most important routine on the page. The accelerometer in your IMU has two systematic errors that the studio compensates for:
- Bias — a constant offset on each axis. Means "even when truly stationary in zero-G, the sensor reads a small non-zero acceleration."
- Scale — a per-axis multiplier. Means "gravity reads slightly less or slightly more than 9.80665 m/s² on each axis."
Neither of these is the sensor's fault — they're a combination of manufacturing tolerance, board-level mechanical stress, and temperature offsets at the moment of calibration. Both errors must be measured against a known reference, and the only known reference cheap enough to use in the field is gravity itself. So the studio asks you to point each face of the drone at the floor, in turn, and uses the fact that the magnitude of acceleration in each pose must equal exactly 9.80665 m/s².
The routine that does this is an ellipsoid fit. With six poses (one per face of the airframe) you get six independent observations of |a| = g. The studio's solver fits the bias-and-scale parameters that best explain those six observations. The result is a 6-number calibration matrix (3 offsets, 3 scales) that gets stored in EEPROM and applied by the FC at every loop iteration thereafter.
How to Run It
The studio walks you through the routine step by step. Click MICRO ACCELEROMETER CALIBRATION to begin.
- Reset. The studio clears any partial calibration state and shows: "Calibration reset. Ready for 6 points."
- Pose 1 — Level. Place the drone flat on a stable surface (z-axis up). Press Sample. The studio averages 500 raw IMU samples over ~1 second and validates that the drone didn't move during sampling. If you bumped the table, you'll see "Movement detected! Hold drone steadier" and the sample is discarded — just retry.
- Pose 2 — Upside down. Flip the drone so the canopy faces the surface. Sample.
- Pose 3 — Nose down. Stand the drone on its nose. Sample.
- Pose 4 — Tail down. Stand it on its tail. Sample.
- Pose 5 — Left side down. Lay it on its left arm. Sample.
- Pose 6 — Right side down. Lay it on its right arm. Sample.
- Compute. Press Compute. The studio's solver fits the ellipsoid, validates the result (offsets must be small, scales close to 1), and writes the 6 numbers to EEPROM.
The studio then asks you to run a mounting-trim measurement — see below.
Two things make this routine fail. First, insufficient coverage: skipping a face or two leaves the solver underdetermined and the studio will report "Not enough coverage. Rest on ALL 6 sides." Re-pose and re-sample. Second, vibration during a sample: any tremor — a passing truck, your hand still touching the airframe — will cause the studio to discard the pose. Use a stable surface, set the drone down gently, and let go before pressing Sample.
Mount Trim
After the 6-point pass, the studio measures mounting tilt — the residual angle between the IMU's idea of "level" and the airframe's actual level. Even after a perfect 6-point calibration, the IMU chip is glued onto a PCB which is screwed into the frame, and at any of those interfaces there's a fraction of a degree of physical tilt. Left uncorrected, the drone will think it's level when it's actually leaning, and it will drift in that direction during hover.
To measure it, the studio asks you to rest the drone perfectly level on a flat surface — a glass table, a spirit-level-checked board — and press the trim button. The firmware averages 400 samples, computes the residual pitch and roll after the 6-point calibration has been applied, and stores the negative of that residual as the trim. The trim is clamped to ±15° (anything larger is a mounting mistake, not a calibration target).
The result appears in the Tuning page's EEPROM Calibration Matrix card as PITCH TRIM and ROLL TRIM, in degrees.
What Calibration Survives
The Navi3D calibration data is persistent across firmware re-flashes within the same firmware family. When the Hardware Calibration firmware writes the matrix, it stamps the EEPROM with a magic number (0xCAFEBEF1). The main FC firmware reads from the same EEPROM address and validates the same magic. As long as you don't change the EEPROM layout (which only happens at major firmware versions), you can:
- Flash Hardware Calibration → calibrate → flash Main FC → your calibration is still there.
- Re-flash the Main FC for an update → your calibration is still there.
- Tune PIDs in the Main FC → those gains also survive a Hardware Calibration re-flash.
The studio shows a yellow "Configuration recovered from EEPROM" note when this happens, so you know the saved values were honoured.
When to Re-Calibrate
- After any change to the IMU mounting — a new foam pad, a new screw torque, a different stack arrangement.
- After physical damage that bent the frame.
- After a large temperature change between calibration environment and flight environment (the LSM6DSOX has a small thermal drift; a calibration done in a 5°C garage and flown at 35°C in the sun will show a small attitude offset).
- Not after every battery change. The calibration is a property of the airframe, not of the flight.
9. Blackbox
The Blackbox module is the post-flight analysis page. After every flight, you can pull the controller's log out of the drone's onboard storage and replay it in the studio to understand what happened.
9.1 Storage Backends
Blackbox logs are stored on whichever non-volatile memory the airframe has:
- Micro 8520 / 8520 PRO — internal Teensy flash, ring buffer, ~30 seconds at full rate.
- F450 — onboard SD card, full continuous logging for the duration of the flight.
The studio retrieves logs over the same serial link, in chunks. Large F450 logs may take a few minutes to download — the studio shows a progress bar.
9.2 Retrieving a Log
Press REQUEST FLIGHT LOG. The studio asks the firmware for the most recent flight log, streams it down, and renders the first available axis (Roll) on the time plot. While loading, the bottom area shows progress; once complete, it shows the loaded log's metadata.
9.3 Plotting
The plot area shows up to four overlaid traces, with a legend at top-right:
- SETPOINT (target) — what the controller was trying to do (the commanded rate or angle).
- GYRO (reality) — what the IMU actually measured.
- PID (effort) — the total controller output, in mixer units.
- ANGLE (°) — the integrated attitude angle.
The axis selector buttons across the top let you switch between log channels:
- ROLL / PITCH / YAW — the three rate loops.
- MOTORS — the four motor outputs vs. time, useful for spotting one motor saturating.
- ACCEL — the raw accelerometer trace, useful for vibration forensics after a crash.
- ALTITUDE (ToF) — altitude trace from the ToF, useful for diagnosing altitude-hold instability.
The corner readouts show TIME, SAMPLES, PEAK GYRO, and PEAK EFFORT for the currently displayed axis — handy as a quick "how hard was this loop pushed?" indicator.
9.4 How to Read a Log
The single most informative view is Roll with all four traces visible. Good tuning shows GYRO tracking SETPOINT closely, with PID effort rising during disturbance and settling quickly. Bad tuning shows:
- Persistent offset between SETPOINT and GYRO → not enough I.
- High-frequency oscillation on GYRO around a steady SETPOINT → too much P or D, or excessive mechanical noise.
- Slow correction after a stick input → not enough P.
- PID effort saturated at the rails → the airframe can't physically produce the commanded rate; reduce expectations or check for damaged props.
The Blackbox is, in this sense, the feedback loop for the Tuning page. Fly a short trim flight, pull the log, examine Roll first, adjust gains in Tuning, re-fly. Two or three iterations is usually enough to get an airframe locked in.
9.5 Saving and Sharing
- COPY LOGS copies the currently selected trace as CSV to your clipboard, ready to paste into a spreadsheet or analysis script.
- CLEAR LOGS flushes the loaded log from the studio (it remains on the drone until overwritten by a future flight).
10. Fleet
The Fleet module is a placeholder in Beta 0.1.0. The card on the page reads:
"Multi-agent swarm coordination, UWB indoor positioning, and global GPS fleet tracking are currently under active development."
The phase tag is PHASE: ALPHA ARCHITECTURE, which means the data model is being defined and no production features are exposed yet.
When Fleet ships, it will cover:
- Multi-drone session management — connect to more than one airframe simultaneously, with per-drone telemetry panels.
- UWB indoor positioning — sub-decimetre positioning indoors using Ultra-Wideband anchors, for swarm choreography in a controlled volume.
- GPS fleet tracking — outdoor positioning of multiple craft on the Map page with collision avoidance between them.
For now the page is informational only.
11. Serial Connection Reference
11.1 The Protocol
Navi3D uses a line-delimited JSON protocol over a USB serial port at 500000 baud. Every line is one JSON object. The drone publishes a telemetry frame at 20 Hz (50 ms cadence) and emits status / response objects in reply to commands. The studio sends commands as single-line JSON objects.
Telemetry frame fields (drone → studio):
| Key | Type | Meaning |
|---|---|---|
| p, r, y | float | Pitch, roll, yaw in degrees |
| eox … eoz | float | Accelerometer offsets (m/s²) from EEPROM |
| esx … esz | float | Accelerometer scales from EEPROM |
| accpitchtrim, accrolltrim | float | Mounting trim (degrees) |
| proll … dyaw, kFF | float | Live PID gains |
| invx, invy, inv_z | int | IMU axis inversion flags |
| bat_v | float | Battery voltage |
| raw_adc | int | Raw battery divider ADC reading |
Command objects (studio → drone) carry a cmd key naming the action: calreset, calsample, calcompute, caltrim, setaccelcal, setimuorient, setpid, settrim, saveconfig, vibteststart, motor (single motor by id), motorall (all motors at once). Additional keys carry parameters per command.
A ! character on its own is an abort signal for long-running routines (vibration sweep, sampling). The studio sends one when you press a Cancel button mid-routine.
11.2 Why 500000 Baud
The Teensy 4.x's USB CDC layer treats baud as a hint and runs at native USB speed regardless — 500000 is conventional and works everywhere. Don't lower it; doing so on some host OSes adds buffering that delays telemetry.
11.3 Browser Picker Tips
When you press Establish Serial Link, the browser shows its native serial picker. The Teensy 4.x appears as USB Serial Device (COMx) on Windows, /dev/cu.usbmodem... on macOS, /dev/ttyACM0 on Linux. If you see multiple devices, the Teensy is the one whose name doesn't match your other peripherals (look for 16C0:0483 if in doubt).
11.4 EEPROM Identity
The studio and both firmwares use a single EEPROM identity marker: CONFIG_MAGIC = 0xCAFEBEF1. The marker is checked at every firmware boot. If the marker is missing or invalid (fresh Teensy, EEPROM cleared, or layout mismatch), the firmware writes the studio defaults and tells the studio so via a status message. Calibration values do not survive a layout change — they survive everything else, including a recompile.
12. Glossary
| Term | Meaning |
|---|---|
| Airframe | The physical drone configuration: motors, frame, sensors. Picked in Drone Selection. |
| Blackbox | High-rate flight log stored on the drone for post-flight analysis. |
| CSRF / iBUS / SBUS | Common RC receiver protocols. Navi3D Beta 0.1.0 supports iBUS by default on the Micro family. |
| DSHOT300 | A digital motor protocol used by brushless ESCs on the F450 profile. Sends 16-bit motor commands at 300 kHz. |
| EEPROM | Non-volatile memory on the Teensy where persistent settings live: calibration matrix, PIDs, mount trim, mission defaults. |
| Ellipsoid fit | The mathematical technique behind 6-point accelerometer calibration. Fits a 3-axis bias-and-scale model that best explains six measured gravity poses. |
| FC (Flight Controller) | The Teensy + sensor stack running the flight firmware. |
| I / I-term | The integral term of a PID controller. Eliminates steady-state error. |
| IMU | Inertial Measurement Unit. The LSM6DSOX chip on the FC, combining accelerometer and gyro. |
| OptiFlow / PMW3901 | Optical-flow sensor. A downward-pointing camera that reports the drone's lateral displacement over the ground. |
| PID | Proportional-Integral-Derivative controller. The rate loop that converts attitude error into motor commands. |
| ToF (Time-of-Flight) | Laser-based downward range sensor. Used for altitude hold at low altitudes. |
| VCP (Virtual COM Port) | The serial-port abstraction the Teensy exposes over USB. The browser sees it as a regular serial port. |
| Web Serial API | The browser API that lets the studio open a USB serial port directly. Available in Chromium-based browsers. |
13. Troubleshooting
The connection dot stays red after pressing Establish Serial Link. Three causes, in order of likelihood: (1) the cable is charge-only — swap for a known data cable; (2) the wrong port was picked from the browser dialog — re-press Establish Serial Link and pick the Teensy explicitly; (3) on Linux, the udev rules aren't installed — see Section 2.1.
The studio says DISCONNECTED but the Teensy is plugged in. The browser may have lost the port handle after a tab reload. Press Establish Serial Link again. If the port no longer appears in the picker, unplug-replug the Teensy.
Sensor page shows IMU pitch/roll at zero and not responding. The IMU failed to initialise. The firmware will have logged "error": "IMU not detected" at boot. Re-seat the LSM6DSOX connector or check the SPI wiring.
Accelerometer calibration fails with "Not enough coverage." You missed one or more of the six faces, or two of your poses were almost the same orientation. Reset and re-do the six poses making sure each one places a different physical face down.
Accelerometer calibration fails with "Result out of bounds." The solver produced an unphysical answer (scale outside 0.5–1.5 or offset over 3 m/s²). Causes: the drone was moved during a sample, or one of the six poses wasn't held cleanly. Reset and start over, taking more care to let the drone settle for a full second before pressing Sample.
Mount-trim measurement says "Hold the drone still and LEVEL." You pressed the trim button while still touching the drone, or the surface wasn't actually level. Set the drone down on a confirmed-level surface, let go entirely, wait two seconds, then press the button.
Tuning page right-card is greyed out ("HARDWARE OFFLINE"). You need a live serial link to edit altitude/position-hold gains. Open the serial connection from Drone Selection first.
Map shows the drone in the wrong place. GPS has not yet acquired a fix, or the fix is 2D only. Wait until the Sensor page reports 3D FIX with ≥10 satellites. Indoors, the drone uses optical-flow + ToF and reports its position only relative to launch, not in absolute lat/lon.
Blackbox shows "No log data currently loaded" after pressing Request Flight Log. The flight log buffer is empty — either the drone hasn't flown since power-up, or the buffer was cleared. On the Micro family the buffer is ring-overwritten by every new flight; on the F450 the SD card retains older logs you can request individually.
Optical flow shows FAULT. The PMW3901 isn't responding on SPI. Check the sensor's SPI lines and that nothing is obscuring the lens. The PMW3901 also reports FAULT if the ambient light is too low — try better lighting or a brighter surface beneath it.
Vibration sweep reports "Excessive Vibration" even with new parts. Run the sweep with the drone on a soft surface — a folded towel or foam — not a hard tabletop. Hard surfaces ring at motor frequencies and the IMU picks up the surface oscillation as drone-frame vibration.
This documentation describes Navi3D Drone Studio Beta 0.1.0. Newer builds may add modules, change defaults, or modify the serial protocol — check the changelog inside the studio for differences.