What this is
A planning tool for FPV drone pilots that estimates how far you can realistically fly given your radio hardware and where you're flying. It calculates theoretical RF range using the same math used in real-world link budgets, then refines that estimate by checking line-of-sight against actual terrain elevation data.
The output is a coverage polygon on the map showing where your aircraft can maintain a usable link at the configured altitude. Inside the polygon, you've got line-of-sight and adequate signal margin. Outside it, either the radio runs out of budget or terrain blocks the path.
How to use it
- Pick your hardware. Select your video transmitter, control link, and antennas from the dropdowns. If your exact gear isn't listed, choose the closest match or use the "Custom…" option to enter specs manually.
- Drop a ground station pin. Click anywhere on the map to set where you'll be flying from. The free-space range circles render immediately.
- Click "Compute Terrain" to overlay the realistic coverage polygon. This samples elevation data along 18 bearings and finds where terrain breaks line-of-sight at your selected altitude.
Adjust the fade margin, environment preset, or aircraft altitude to see how each affects your range. Save profiles for different builds. Share configurations as URLs so others see exactly what you planned.
The RF math
Range is calculated using the Friis transmission equation for free-space path loss, solved for the maximum distance at which the receiver still has adequate signal:
FSPL_dB = 20·log₁₀(distance) + 20·log₁₀(frequency) − 147.55
The maximum range is the distance at which received power equals receiver sensitivity plus a configurable fade margin:
RX_Power = TX_Power + TX_Gain + RX_Gain − FSPL
RX_Power ≥ RX_Sensitivity + Fade_Margin
All values are in decibels. The fade margin is a safety buffer that accounts for real-world degradation the free-space model doesn't predict: multipath fading, antenna pointing imperfection, body blocking, atmospheric variation, and small-scale interference. The environment buttons set sensible defaults (7 dB for open desert, up to 25 dB for urban environments).
Terrain analysis
Free-space math gives you a theoretical maximum range circle. Real flying happens against terrain — ridges, hills, and obstacles block radio line-of-sight. When LOS is blocked, the link doesn't gracefully degrade; it dies.
The terrain analysis solves this in three steps:
- Sample 18 bearings outward from the ground station every 20°. Along each bearing, request elevation data from the Open-Meteo Elevation API at 10 logarithmically-spaced distances.
- Find each bearing's reach distance — the farthest point at which a straight line from the ground station antenna to the aircraft at the configured altitude clears all intervening terrain, plus Earth curvature drop (using the 4/3 effective Earth radius for radio propagation).
- Refine break-points with a second pass — when Pass 1 finds a block between two coarse samples, four refinement samples are added to pinpoint where LOS actually breaks.
The reach distances on all 18 bearings are connected into a polygon — your coverage shape. Where the polygon meets the free-space circle, the radio is the limiting factor. Where it falls short, terrain is.
Earth curvature drop at distance d with the 4/3 effective radius is:
drop = d² / (2 · 8,504,000) meters
Limitations — what this tool can't do
Read this before relying on the predictions for any flight where the outcome matters.
- Free-space is a ceiling, not a guarantee. The math assumes ideal conditions with the fade margin you set. If your antennas are pointed badly, your goggle's gain is below spec, your battery sags under load, or your VTX runs hot and throttles, real range will be less than predicted.
- Sensitivity figures are educated guesses. ExpressLRS publishes official sensitivity numbers per packet rate; DJI and analog systems don't, so their values are back-calculated from advertised range claims. Treat the absolute numbers as approximate; trust the relative comparisons.
- Terrain data has limited resolution. Open-Meteo uses GLO-30 satellite elevation data — roughly 30 meter resolution. Small terrain features (single buildings, individual trees, narrow ravines) are not captured. Foliage and structures on top of the bare ground are not modeled at all.
- Antenna patterns are assumed omnidirectional. Real antennas have directional gain patterns — patches and Yagis especially. The tool doesn't account for this yet. If your ground antenna points east, your real coverage stretches east and contracts elsewhere in ways the polygon doesn't show.
- No interference modeling. WiFi noise in urban areas, other 2.4 GHz pilots flying nearby, microwave leakage — none of this is modeled. The environment buttons partially compensate with higher fade margin defaults, but they can't capture specific local conditions.
- The video and control links share a coverage polygon. Currently the polygon is computed against whichever link reaches farther (typically the control link). The shorter-range link (typically video) is RF-limited well inside the polygon, but the polygon shape itself only reflects terrain blockage of the farther link's frequency.
Always fly with margin. Always maintain visual line of sight where regulations require it. Always assume the predicted range is optimistic.
Credits and source
- Map tiles: OpenStreetMap contributors
- Map library: Leaflet
- Elevation data: Open-Meteo
- Hardware specifications: manufacturer datasheets, ExpressLRS documentation, and community-validated figures from RC Groups, Oscar Liang, and r/fpv
- Source code, including the full math implementation: github.com/palberico/RFRange
This tool was built as a class project for Embry-Riddle Aeronautical University's Uncrewed Systems Networking course, and extended into a real flight-planning tool. It's open source under the repository's license — fork it, improve it, contribute hardware presets back.