FISCHER 26E
EW-HARDENED VARIANT
This page describes Fischer 26E, an optional EW-hardened high-altitude configuration of the Fischer 26 airframe. The core questions it answers: (1) when the adversary denies Starlink, can Fischer 26 still function? (2) can the airframe operate above small-arms threat envelope while still providing useful ISR? (3) can Försvarsmakten integrate Fischer 26E with SLB and existing C2 handheld devices without depending on FSG-A software? The answers are yes, yes, and yes — at the cost of approximately €800 per airframe and 3-4 minutes of endurance in dual-radio mode.
Why Fischer 26E Exists
The baseline Fischer 26 relies on Starlink Mini for brigade-level connectivity beyond the MANET mesh horizon. Starlink provides ~50 ms latency to Lisa 26 brigade server regardless of geographic distance, at 40 W continuous power draw. Three threat scenarios make this dependence a strategic risk:
Threat A — Starlink denied by SpaceX. A commercial entity under US jurisdiction can, with notice or without, revoke or geofence service. The 2022 precedent (Starlink denial of service over Crimea) demonstrates this is not hypothetical. A Swedish brigade cannot base its battle tempo on a service it does not control.
Threat B — Starlink denied by kinetic action. Russian or Chinese anti-satellite weapons targeting Starlink constellation would degrade coverage globally; a regional denial (jamming the downlink band over the AO) would degrade it locally. The user terminal itself is vulnerable to directed RF attacks. Fischer 26 carrying a Starlink terminal is an RF beacon to any adversary ESM system.
Threat C — Starlink denied by cost or policy. Mobility Priority subscription is ~€500/month per terminal. A brigade with 20 Fischer 26 airframes plus ground stations runs €60,000+/year just in Starlink fees. In a prolonged conflict the accumulated cost rivals the one-time cost of building a fallback capability.
Fischer 26E provides the fallback. When Starlink is available, it is used. When Starlink is not, the AD9361 SDR takes over with the mathematical properties derived below.
Architecture Overview
FISCHER 26E — KEY PARAMETERS
Fischer 26E-LE — Long Endurance Variant
Fischer 26E-LE is an upscaled airframe variant that doubles useful endurance, supports the wing-mounted antenna cluster, and integrates perovskite solar cells across the upper wing surface. It exists because the baseline Fischer 26E airframe (2.6 m wingspan, 8.5 kg MTOW) cannot structurally carry the 1.22 kg antenna cluster plus extended battery plus solar film without aerodynamic compromise. Fischer 26E-LE scales the airframe to 3.5 m wingspan and 20.6 kg MTOW, which the larger wing carries at lower wing-loading penalty than a naive battery doubling on the baseline airframe would incur. The entire configuration is specified below with verifiable math — every endurance, power, and weight figure derives from Friis equations, aerodynamic drag from lift-to-drag ratio, and manufacturer cell chemistry datasheets.
FISCHER 26E-LE — PLATFORM PARAMETERS
Why the larger airframe actually improves endurance per battery Wh
Naive doubling of the baseline 888 Wh battery to 1,776 Wh on the 2.6 m airframe adds 4.0 kg of battery mass to an 8.5 kg aircraft — a 47 % weight increase. Cruise power scales roughly with weight (drag ≈ lift × Cd/Cl, and lift = weight at cruise), so 47 % more weight costs 47 % more cruise power, wiping out most of the endurance gain. The aerodynamic fix is scaling the wing: a 3.5 m wing carries 20.6 kg at the same lift coefficient the baseline 2.6 m wing carries 8.5 kg, because wing area scales as the square of wingspan but weight scales with the cube of linear dimensions, so the wing-loading does not grow as fast as MTOW. The result is that 20.6 kg on 3.5 m needs 353 W of cruise power, whereas 13.3 kg on the baseline 2.6 m (from doubling battery alone) would need roughly 440 W. The larger wing is a net power saving.
# pip install numpy
# Fischer 26E-LE endurance derivation — fully reproducible
import math
# Airframe scaling — verified by L/D ratio preservation
def cruise_power_watts(mtow_kg, cruise_speed_mps=15.0,
cl=0.50, cd=0.035, prop_eff=0.60):
"""Electric cruise power from lift-to-drag ratio at cruise."""
lift_N = mtow_kg * 9.81
drag_N = lift_N * (cd / cl) # drag from L/D
propulsive_W = drag_N * cruise_speed_mps
return propulsive_W / prop_eff # divided by wall-plug efficiency
# Parameter chain for LE variant
MTOW_LE = 20.6 # kg (3.5 m wing + 2500 Wh battery + cluster)
BATTERY_LE_WH = 2500 # Wh
AVIONICS_W = 75 # unchanged from baseline
CLUSTER_AVG_W = 74 # 6 gimbal masts × 30 % duty + 2 gimbals + DOM RX idle
SOLAR_SUMMER_W = 95 # 0.86 m² × 550 W/m² × 20.1 %
SOLAR_WINTER_W = 17 # 0.86 m² × 100 W/m² × 20.1 %
USABLE_FRACTION = 0.80 # 20 % reserve policy
cruise = cruise_power_watts(MTOW_LE)
total_demand = cruise + AVIONICS_W + CLUSTER_AVG_W
print(f"Cruise power: {cruise:.0f} W")
print(f"Total electrical: {total_demand:.0f} W")
# Endurance under solar augmentation
e_summer = (BATTERY_LE_WH * USABLE_FRACTION) / max(1, total_demand - SOLAR_SUMMER_W)
e_winter = (BATTERY_LE_WH * USABLE_FRACTION) / max(1, total_demand - SOLAR_WINTER_W)
print(f"Summer endurance: {e_summer:.2f} h = {int(e_summer)} h {int((e_summer%1)*60):02d} min")
print(f"Winter endurance: {e_winter:.2f} h = {int(e_winter)} h {int((e_winter%1)*60):02d} min")
Solar cell selection — perovskite film on upper wing
The upper surface of the 3.5 m wing provides 1.23 m² of gross area, of which approximately 0.86 m² is practically coverable with flexible solar film (the remaining 30 % is lost to aileron cutouts, wing roots, and structural fairings that cannot host cells). Three photovoltaic technologies are candidates:
Solar cell technology comparison
Perovskite film (Hailegnaw et al., Nature Energy 2024) is the current best compromise for a €10,000 airframe: near-GaAs efficiency at one-tenth the cost, flexible enough for curved wing integration, and light enough that the cell mass (~20 g for 0.86 m²) is negligible in the MTOW budget. The known weakness is outdoor stability — laboratory lifetime at continuous maximum-power-point tracking reached 50 h at 90 % initial efficiency for unencapsulated cells. Encapsulation for airframe integration is expected to extend this but is not yet field-validated at the operational 200 h airframe lifetime. This is a TRL 3 risk that the implementing organisation must resolve via its own cell-supplier qualification programme.
Cold-climate battery strategy
Modern LiPo cells lose approximately 50 % of rated capacity at -20 °C without thermal management; at -40 °C, unheated LiPo loses 95 % of capacity and becomes unflyable. The LE variant addresses this with a 10 W thermostated resistive heater integrated into the battery pack enclosure, maintaining cell temperature above 0 °C during flight. The heater draws 10 W continuously, reducing endurance by approximately 3 % in cold conditions, but preserves 85 % of rated capacity versus the 50 % retention of an unheated pack. The net endurance is 3 h 26 min at -40 °C versus roughly 1 h 10 min for an unheated pack — a 3× improvement for 3 % power cost.
LiFePO₄ chemistry is an alternative that tolerates -40 °C natively at 70 % capacity retention without heating, but its lower specific energy (120 Wh/kg versus LiPo's 220 Wh/kg) would require 4.6 kg of additional battery mass to match the same 2,500 Wh capacity. The LE configuration assumes LiPo with heater rather than LiFePO₄ without, based on the net weight advantage.
Build cost breakdown
Fischer 26E-LE BOM — material cost only
Important note — TRL status
Fischer 26E-LE is TRL 2 — analytical concept only. No physical prototype of the LE airframe has been built. The endurance, cruise power, and cost figures derive from standard aerodynamic formulas (L/D ratio, Friis equation for link budget), manufacturer specifications (AD9361 datasheet, perovskite cell Nature Energy 2024 measurements, LiPo energy density from 2024-2026 high-performance cell datasheets), and simple scaling laws. They are reproducible in provable_claims.py. They are not validated by flight test or wind-tunnel experiment. The implementing organisation — Försvarsmakten, FMV, or a commercial vendor — must build and test a physical prototype to confirm the airframe structurally carries 20.6 kg, that the 3.5 m wing does not exhibit unfavourable pitching moments from wing-mounted gimbal masses, that the 3.2 kg total battery pack can be thermally managed within the fuselage volume, and that the perovskite cells survive 200 h of exposure to Nordic UV, moisture, and temperature cycling.
Mathematical Derivation — Altitude, AGL vs MSL, and Survivability Envelope
The baseline Fischer 26 specification originally called for 120 m AGL cruise. This is too low. AK-family rifles (AK-12, AKM, variants) are effective to 400-500 m against area targets; PKM machine guns reach 800-1,000 m with tracer-guided bursts; DShK heavy machine guns engage air targets at 1,500-2,000 m. A drone at 120 m AGL is well within the lethal envelope of every rifle-squad weapon it would overfly. This section derives the correct altitude for both Fischer 26 variants, resolves the AGL-vs-MSL confusion (critical for Nordic topography), and shows why Fischer 26E's 6 GHz beamforming makes the higher altitude free in link-budget terms.
Step 1 — Small-arms envelope and drone survivability
Weapon Effective range (air target) Peak accurate range
────────────────────────────────────────────────────────────────────────────
AK-12 / AK-74 (5.45x39) 300-400 m 500 m
AKM (7.62x39) 350-450 m 600 m
PKM (7.62x54R) 700-900 m 1,100 m
DShK 12.7mm heavy MG 1,400-1,700 m 2,000 m
NSV / KORD (12.7mm) 1,500-2,000 m 2,500 m
MANPADS (Igla-S, Strela-10) 3,500-5,000 m 6,000 m
ZU-23-2 (23mm AAA) 1,500-2,500 m 3,000 m
Survivability altitude thresholds:
> 500 m AGL: immune to rifle fire (AK/AKM)
> 1,000 m AGL: immune to PKM
> 2,500 m AGL: immune to heavy MG (DShK/NSV/KORD) and 23mm AAA
> 6,000 m AGL: immune to shoulder-launched MANPADS
Operational implication: a 500-700 m AGL cruise altitude is the "sweet spot" for airframes without dedicated MANPADS countermeasures — above rifle and machine-gun threat, below the engagement envelope of MANPADS and medium-range SAMs. This is why Fischer 26E targets 500-700 m AGL and not 120 m.
Step 2 — AGL vs MSL for Nordic topography
Altitude must always be specified as AGL (Above Ground Level) for survivability analysis and MSL (Mean Sea Level) for air-traffic deconfliction and barometer-based flight control. A drone at 500 m AGL over flat Scania terrain (elevation ~50 m MSL) is flying at ~550 m MSL. The same drone at 500 m AGL over Kebnekaise plateau (~1,500 m MSL base) is at ~2,000 m MSL. The barometer reads MSL, not AGL. ArduPilot's terrain-following feature bridges the two by subtracting a pre-loaded digital elevation model from the barometric altitude:
AGL_actual = MSL_measured - DEM(current_lat, current_lon)
Parameters for Fischer 26 / Fischer 26E:
Barometer: BMP390, ±0.5 m relative accuracy (measures MSL via pressure)
DEM source: SWEREF 99 / Lantmäteriet 2m-grid (Sweden), STRM 30m (rest of world)
DEM accuracy: ±2-5 m in Swedish terrain, ±10-30 m in mountain/glacier terrain
Combined AGL uncertainty:
σ_AGL = √(σ_baro² + σ_DEM²) = √(0.5² + 5²) = 5.02 m (Swedish terrain)
σ_AGL = √(0.5² + 20²) = 20.0 m (mountain terrain)
Operational consequence: at 500 m AGL target altitude in Swedish terrain, actual AGL
varies ±5 m. Fischer 26E's terrain-following controller (ArduPilot TERRAIN_FOLLOW=1)
adjusts MSL target altitude continuously to hold AGL constant despite terrain changes.
Without terrain-following, a drone commanded "500 m MSL" over Swedish fjäll terrain
could actually fly at 50 m AGL when crossing a 1,450 m peak — well into rifle range
and on collision course with the terrain.
Step 3 — 6 GHz beamforming range at high altitude
A concern with higher altitude is link budget — does 500-700 m AGL break the RF link to the FPV swarm below or to the brigade GCS? The Friis equation shows it does not, because 6 GHz directional beamforming concentrates power in a narrow cone:
Fischer 26E downlink to FPV operator terminal (500 m AGL drone, 2 m AGL terminal):
Slant range at directly overhead + 1 km horizontal = √(500² + 1000²) = 1,118 m
Friis at 5.8 GHz (within AD9361 range, license-free ISM band):
FSPL = 32.45 + 20·log10(5800) + 20·log10(1.118) = 32.45 + 75.27 + 0.97 = 108.7 dB
Link budget with beamforming:
P_tx = +27 dBm (500 mW PA)
G_tx (directed) = +16 dBi (electronic beamforming, 4-element phased array)
G_rx = +8 dBi (operator tablet with modest horn antenna)
L_misc = 4 dB
P_rx = 27 + 16 + 8 − 108.7 − 4 = −61.7 dBm
Sensitivity at 1 Mbps QPSK: −102 dBm
Margin: +40 dB ✓ (enormous, link has 40 dB of fade/jam margin)
For comparison at 120 m AGL (old baseline):
Slant at 1 km horizontal: √(120² + 1000²) = 1,007 m
FSPL difference: 20·log10(1.118/1.007) = 0.9 dB
Key insight: going from 120 m AGL to 500 m AGL costs less than 1 dB of link budget
because horizontal distance already dominates slant range at typical FPV engagement
distances. But gaining 380 m of vertical separation removes the drone entirely from
the effective envelope of AK-family small arms. This is the geometric reason higher
altitude is nearly free for Fischer 26E.
Step 4 — Coverage area scales quadratically with altitude
Higher altitude also increases the area each drone can observe. For a given gimbal-down camera with half-angle θ:
Coverage radius on ground = h · tan(θ)
Coverage area = π · (h · tan(θ))² = π · h² · tan²(θ)
For Fischer 26 / 26E camera (90° horizontal FOV, half-angle 45°):
At h = 120 m: radius = 120 m, area = 45,240 m² = 0.045 km²
At h = 300 m: radius = 300 m, area = 282,743 m² = 0.28 km²
At h = 500 m: radius = 500 m, area = 785,398 m² = 0.79 km²
At h = 700 m: radius = 700 m, area = 1,539,380 m² = 1.54 km²
Ratio: Fischer 26E at 700 m AGL covers 34× more area per frame than the old 120 m baseline.
For brigade-level ISR over a 100 km² area of responsibility:
At 120 m, a single ISR orbit covers 0.045 km² → need 2,222 orbits for full coverage
At 700 m, a single ISR orbit covers 1.54 km² → need 65 orbits for full coverage
This is the operational reason Fischer 26E is tier-2 ISR: one airframe at 700 m AGL
covers what 34 airframes would need to cover at 120 m. The camera resolution loss
(GSD goes from 3.1 cm/px to 18 cm/px at 700 m) is solved by the camera upgrade in
the next section — not by flying lower.
Step 5 — Camera upgrade to compensate for GSD loss at altitude
Ground Sampling Distance (GSD) scales linearly with altitude. At 700 m AGL the default Arducam IMX477 (3.1 cm/px at 120 m) produces 18 cm/px — coarse enough that YOLOv8 struggles with pedestrian detection. The solution is not to fly lower into rifle range; it is to upgrade the optics. Two options:
OPTION A — Longer lens on existing IMX477 sensor
Change from 6 mm lens to 25 mm lens (Arducam M12 25 mm, €35)
GSD at 700 m AGL = 700 · (6.287 mm / 25 mm) / 4056 px · 100 = 4.3 cm/px
Similar to baseline 120 m performance.
Trade-off: FOV narrows from 90° × 68° to 22° × 16° — coverage area shrinks.
Net coverage: 700 · tan(11°) = 136 m radius → 0.058 km² per frame
Only marginally better than 120 m + 6 mm lens (0.045 km²).
OPTION B — Higher-resolution sensor keeping 6 mm FOV
Upgrade to Sony IMX678 (4K, 3840×2160, sensor 7.68 mm × 4.32 mm, €180)
GSD at 700 m AGL with 6 mm lens = 700 · 7.68 / (6 · 3840) · 100 = 23 cm/px
Worse than IMX477 — IMX678 has BIGGER pixels despite higher resolution.
OPTION C — Combined: higher-resolution sensor + longer lens (RECOMMENDED)
Sony IMX678 4K sensor + 12 mm lens (Arducam M12 12 mm, €20)
GSD at 700 m AGL = 700 · 7.68 / (12 · 3840) · 100 = 11.7 cm/px
FOV: 2·atan(7.68/(2·12)) = 35.3° horizontal — larger than Option A.
Net coverage: 700 · tan(17.6°) = 222 m radius → 0.155 km² per frame
3.5× baseline 120 m coverage AND better-than-baseline GSD.
OPTION D — Dual-camera: wide (IMX477) + tele (IMX678 + 25mm)
One sensor for coverage, one for fine-detail classification at chosen ROI.
Total cost: €65 (wide) + €200 (tele) = €265 — adds €200 over baseline.
Combines Option C coverage with Option A resolution on command.
RECOMMENDED for Fischer 26E tier-2 role.
Option D is the Fischer 26E camera configuration: dual-camera system with software-selectable ROI zoom. The wide camera maintains full coverage; the tele camera provides on-demand resolution that matches or exceeds the old 120 m AGL baseline. Total additional cost: €200 over baseline Fischer 26 camera.
Step 6 — Revised altitude recommendations
FSG-A ALTITUDE DOCTRINE — REVISED
Two-Tier ISR Architecture — Fischer 26E + Fischer 26
Fischer 26E's high altitude and EW-hardened link make it the natural tier-2 persistent overview asset. Fischer 26 remains the tier-1 FPV link builder and close ISR asset. The Fischer 26E-LE extends this into a tier-3 stand-off EW asset at 1000 m AGL and 3–5 km behind the forward line. Together they form a layered three-tier ISR/EW architecture that no single airframe can provide:
THREE-TIER ISR/EW ROLES
Tactical strategy A — Static defense / persistent overwatch
Brigade defending a fixed sector (e.g. border region, key infrastructure). Fischer 26E orbits continuously at 700 m AGL over the defended area, 24-hour coverage via 3-shift rotation (2-hour endurance × 3 = covers 6 hours before replacement airborne). Fischer 26 units remain on ground alert, launched only when tier-2 reports contact worth closer inspection. FPV units remain in platoon dispersal, launched only for engagement. Advantages: minimizes airborne asset exposure, maximizes coverage area, reduces RF emissions from tier-1 and tier-0 (they are silent until engagement). Disadvantages: tier-2 alone has 18 cm/px GSD — cannot classify individual soldiers, only vehicles and groups.
Tactical strategy B — Offensive advance / hasty ISR
Brigade advancing into new terrain, ISR must scout ahead faster than ground reconnaissance can. Fischer 26E launches first, climbs to 700 m AGL, sweeps the objective area in 2-3 orbits (10-15 minutes). Identifies threat concentrations. Fischer 26 launches once priority targets are identified, descends to 300 m AGL over specific targets for detailed classification, maintains MANET link to FPV platoons. FPV engages confirmed high-value targets. Advantages: fastest time from "unknown area" to "engaged targets" (15-25 minutes). Disadvantages: tier-2 RF emissions reveal brigade advance direction; tier-1 RF emissions reveal FPV swarm presence before engagement.
Tactical strategy C — EW-contested environment (Starlink denied)
Brigade operates in heavy Russian EW, Starlink unreliable or jammed. Fischer 26E becomes the primary brigade-level uplink — its 6 GHz fastlock hopping defeats reactive jammers; its 500-700 m altitude keeps it above most tactical EW aerial platforms (Russian Orlan-10 operates at 1-3 km AGL). Fischer 26 units operate on ELRS-only for FPV relay (fiber-FPV preferred when available) and use tier-2 Fischer 26E as the relay to brigade GCS. Advantages: graceful degradation — brigade C2 survives Starlink denial. Disadvantages: reduced bandwidth compared to Starlink-primary mode (Fischer 26E's ~1-5 Mbps direct-RF vs Starlink's 50+ Mbps); limits to tier-1 video streaming quality.
Tactical strategy D — Arctic / Nordic topography
Mountain terrain introduces AGL/MSL divergence of 500-1500 m between valley floors and peaks. Fischer 26E flying 500 m AGL crossing a 1,200 m MSL ridge above a 100 m MSL valley must climb from 600 m MSL to 1,700 m MSL over the terrain profile. ArduPilot's TERRAIN_FOLLOW=1 handles this automatically with the Lantmäteriet DEM. Communication range also changes: at 1,700 m MSL over the ridge, line-of-sight to a valley-floor GCS at 150 m MSL spans 45+ km without obstruction — Fischer 26E becomes its own MANET relay extending the brigade network into adjacent valleys that would otherwise require separate infrastructure. Advantages: mountain terrain extends Fischer 26E's effective range by leveraging altitude. Disadvantages: DEM accuracy degrades at ±20 m in high-altitude terrain, so ground-proximity safety margins must be widened (500 m AGL commanded, actual may be 480-520 m).
Försvarsmakten SDK — SLB / SWECCIS Integration
Fischer 26E must be usable by Försvarsmakten without depending on FSG-A-provided software. This section specifies the Software Development Kit (SDK) that lets Saab SLB, SWECCIS, and existing brigade handheld devices (Samsung Galaxy S-series tactical tablets, panasonic Toughbooks) bind to Fischer 26E and pull/push data in their native formats.
SDK architecture
┌─────────────────────────────────────────────────────────────────────┐
│ Försvarsmakten Existing C2 Stack │
│ SLB (Saab) │ SWECCIS (HKV) │ Handheld: Android ATAK / iOS │
└──────────────────┬──────────────────┬──────────────────┬──────────────┘
│ JC3IEDM │ NFFI │ CoT XML
│ (STANAG 5525) │ │ (TAK ecosystem)
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ FSG-A Fischer 26E SDK (libfischer26e) │
│ - Parses NATO APP-6D SIDC codes (STANAG 2019) │
│ - Produces / consumes 5-point orders (STANAG 2014) │
│ - Exchanges JC3IEDM objects (STANAG 5525) │
│ - Pushes Friendly Force position in NFFI format │
│ - Exports detection events as CoT XML for ATAK consumption │
│ - MAVLink 2 pass-through for raw drone telemetry │
│ - AES-256 + HMAC-SHA256 tunnel for classified traffic │
└──────────────────────────────┬──────────────────────────────────────┘
│ MAVLink 2 + CoT + custom JSON
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Fischer 26E airborne (ArduPilot + Jetson + AD9361) │
└─────────────────────────────────────────────────────────────────────┘
SDK module list and license
libfischer26e — SDK MODULES (CC BY-SA 4.0, Open Source)
SDK Example — Binding an ATAK tablet to Fischer 26E
from fischer26e import Fischer26EClient, DetectionEvent, CoT
from fischer26e.stanag import AppSixDSymbol, FiveLineOrder
import asyncio
async def main():
# Connect to Fischer 26E via its MAVLink 2 proxy (SDR or Starlink)
client = Fischer26EClient(
connection_uri="udp://192.168.4.1:14550", # Fischer 26E MANET IP
crypto_key=load_crypto_key("brigade_day_key.pem"),
preferred_link="auto", # Starlink if available, SDR fallback
)
await client.connect()
print(f"Connected: alt={client.altitude_agl_m:.0f} m AGL / "
f"{client.altitude_msl_m:.0f} m MSL, battery={client.battery_pct:.0f}%")
# Subscribe to detection events, convert each to CoT XML for ATAK
async for detection in client.subscribe_detections():
# Each detection has class, confidence, position (WGS84 + MGRS)
symbol = AppSixDSymbol.from_detection(detection)
# e.g. symbol.sidc = "SHGPUCAF-------" (hostile armor, present, friendly)
cot_msg = CoT.from_detection(
detection,
symbol=symbol,
source="Fischer26E",
ttl_seconds=300, # expire after 5 min if no update
)
# Push to ATAK server or direct UDP multicast to tablets
await publish_cot(cot_msg, destination="atak://239.2.3.1:6969")
# Command a 5-line order to Fischer 26E (STANAG 2014 format)
order = FiveLineOrder(
line_1_situation="Enemy company suspected at grid PA 2345 6789",
line_2_mission="ISR orbit 3 km radius, 2 hour duration",
line_3_execution="Orbit centered at target, 700 m AGL terrain-following",
line_4_admin="Starlink primary, SDR fallback on FHSS profile Bravo",
line_5_command="Brigade TOC, radio check Alpha",
)
await client.accept_five_line_order(order)
print(f"Order accepted, mission id={order.mission_id}, ETA={order.eta_utc}")
asyncio.run(main())
SDK Example — JC3IEDM Object Exchange with SLB
from fischer26e.slb_bridge import SLBConnector
from fischer26e.stanag import JC3IEDMObject, ObjectType
# SLB uses STANAG 5525 JC3IEDM data model for object exchange between systems.
# Each detection from Fischer 26E must become a JC3IEDM Object-Item to appear in SLB.
slb = SLBConnector(
slb_endpoint="tcp://slb.brigade-s2.internal:8443",
cert="brigade_s2.cert",
key="brigade_s2.key",
)
await slb.connect()
# Convert a Fischer 26E detection to JC3IEDM Object-Item
detection = await client.get_latest_detection()
object_item = JC3IEDMObject(
object_type=ObjectType.EQUIPMENT_GROUND_COMBAT,
category_code="ARMOUR", # from APP-6D SIDC
subcategory_code="MBT_T72", # specific vehicle class
location_wgs84=detection.position_wgs84,
location_accuracy_m=detection.position_sigma_m,
observation_time_utc=detection.timestamp_utc,
reporting_unit="Fischer26E-07",
confidence_pct=int(detection.confidence * 100),
hostility="HOSTILE", # red on SLB
)
await slb.publish_object(object_item)
# Now visible as a red MBT symbol on every SLB screen in the brigade.
# Subscribe to SLB commanding-element orders (if brigade allows reverse flow)
async for slb_order in slb.subscribe_orders(destination="DRONE_COMPANY"):
# Brigade S3 can task Fischer 26E directly from SLB
fischer_order = FiveLineOrder.from_slb_order(slb_order)
await client.accept_five_line_order(fischer_order)
await slb.acknowledge_order(slb_order.id, status="ACCEPTED")
Mathematical Derivation — Fastlock Microsecond Hopping
The central claim of Fischer 26E is that an adversary cannot effectively jam a radio link that changes frequency within 1 μs across 6 GHz of spectrum. This section derives the math behind that claim. The design follows the Analog Devices AD9361 fastlock profiles technique, extensively documented in the ADI wiki (Frequency Hopping Example Design, wiki.analog.com/resources/eval/user-guides/adrv936x_rfsom) and in the datasheet (AD9361 Rev. G, pp. 22-26).
Step 1 — Why standard SDR tuning is too slow
A software-defined radio normally tunes by adjusting its VCXO (voltage-controlled crystal oscillator), which requires a PLL lock cycle. Standard PLL settling time for a wideband retune is 5-50 ms. At 50 ms per hop, the hop rate is 20 Hz — slower than ELRS's 150 Hz and easily tracked by any pulse-analysing jammer. This is why most SDRs are used as fixed-frequency radios in practice, not as FHSS devices.
Standard SDR retune time (full PLL recalibration): 5-50 ms
Standard SDR hop rate: 20-200 Hz
Jammer tracking capability (digital): ~1 kHz update rate
Conclusion: standard SDR is EASIER to jam than ELRS at 150 Hz.
Step 2 — Fastlock profiles bypass PLL recalibration
The AD9361 solves this by pre-calibrating up to 8 LO (local oscillator) profiles and storing them in internal registers. Switching between profiles does NOT require PLL relock — it requires only loading pre-computed VCXO control values via pin-controlled SPI. This reduces retune time from milliseconds to sub-microseconds:
AD9361 fastlock profile load time: ~100 ns (pin control, 8 pre-calibrated LOs)
AD9361 VCXO settle time after load: ~500 ns (small perturbation from pre-cal)
AD9361 minimum dwell time (usable): ~1 μs (100 ns load + 500 ns settle + 400 ns margin)
AD9361 maximum hop rate: 1 MHz (one hop per μs)
Compared with ELRS 150 Hz FHSS:
Fischer 26E hop rate / ELRS hop rate = 1,000,000 / 150 = 6,667×
An adversary jammer that tracks ELRS perfectly cannot track Fischer 26E at all.
The 8-profile limit constrains hopping to 8 pre-calibrated frequencies at any one time. FPGA logic manages profile rotation: while the radio operates on profile N, the FPGA pre-calibrates profile N+8 in the background (takes 1-2 ms, done during profile N's dwell time which extends over many microsecond hops). This pipeline allows arbitrary hop sequences across the full 70 MHz - 6 GHz range without interrupting link operation.
Step 3 — Jammer reaction time budget
For a jammer to block a specific hop, it must: (a) detect that the radio has moved to a new frequency, (b) electronically tune its own emission to that frequency, (c) emit jamming noise at sufficient power. Each step has a floor:
Jammer detection latency: 20-50 μs (FFT frame at typical SDR jammer sample rate)
Jammer tune latency: 5-50 μs (same PLL physics as a normal SDR)
Jammer emission buildup: 1-5 μs (RF amplifier thermal lag)
Total jammer reaction time: ~26-105 μs from hop onset
Fischer 26E dwell time: 1-10 μs
Conclusion: by the time the jammer reacts, Fischer 26E has ALREADY hopped 3-100 times.
The jammer chases an empty channel and never catches up.
This is the operationally relevant inequality: dwell_time < jammer_reaction_time. Any reactive (tracking) jammer is defeated by this inequality. Barrage jamming remains a theoretical threat (covered in Step 5 below) but reactive jamming is mathematically impossible against fastlock hopping.
Step 4 — Effective bandwidth and channel count
The AD9361 tunes continuously from 70 MHz to 6 GHz, covering 5,930 MHz of spectrum. Channel count depends on instantaneous channel bandwidth:
Usable spectrum: 5,930 MHz (70 MHz to 6 GHz)
Per-hop channel BW: 56 MHz (AD9361 maximum instantaneous)
Non-overlapping channels: 5,930 / 56 ≈ 106 channels (wideband operation)
Alternative narrowband mode:
Per-hop channel BW: 1 MHz
Non-overlapping channels: 5,930 channels
Comparison to existing systems:
ELRS 868 MHz ISM: 80 channels over 7 MHz
Silvus MANET 140-600 MHz: 4,600 channels over 460 MHz
Fischer 26E narrowband mode: 5,930 channels over 5,930 MHz (13× Silvus span)
The key number is not channel count alone — it is the spectrum span. A narrowband jammer that floods 100 MHz of spectrum denies 1.7 % of Silvus's 460 MHz but only 1.7 % of Fischer 26E's 5,930 MHz. The same jammer is 13× less effective against Fischer 26E because it cannot cover enough of the band.
Step 5 — Barrage jamming power requirement
From the FHSS derivation on fhss-implementation.html, barrage jamming requires total jammer power proportional to the full band width being defended. Applying that math to Fischer 26E:
Fischer 26E band span: 5,930 MHz
Reference narrowband PSD: 50 W over 1 MHz = 50 W/MHz
Required barrage power:
P_barrage = 50 W/MHz × 5,930 MHz = 296,500 W ≈ 300 kW
Compare this to:
Krasukha-4 EW station: ~70 kW peak, ground vehicle-mounted
Shipovnik-Aero: ~40 kW peak
Fischer 26E-resistance threshold: ~300 kW — exceeds any known fielded system
Conclusion: no deployed Russian EW system in 2025-2026 can barrage-jam Fischer 26E's
full 5,930 MHz band. Even if four Krasukha-class systems were co-located (280 kW combined),
their effective radiated power wastes on harmonic leakage and directional coverage gaps.
Fischer 26E is effectively immune to current-generation barrage jamming.
Step 6 — Link budget without Starlink (direct RF to brigade GCS)
When Starlink is unavailable, Fischer 26E must reach the brigade GCS directly via RF. The Friis transmission equation determines range. Worst case: Fischer 26E at 500 m AGL, GCS at 3 m AGL, flat terrain, 2.4 GHz (favorable propagation band, widely used industry standard, 2.4 GHz within AD9361 range):
Friis: P_rx = P_tx + G_tx + G_rx − L_path − L_misc
Inputs:
P_tx = +27 dBm (500 mW with PA, within ETSI unlicensed limits for 2.4 GHz)
G_tx = +3 dBi (small monopole antenna, compromise for omnidirectional Fischer 26 mounting)
G_rx = +12 dBi (directional Yagi antenna at GCS, pointed at the Fischer 26)
L_misc = 4 dB (cables, connectors, polarisation mismatch)
Path loss (free space, 2.4 GHz, range R in km):
L_path(dB) = 32.45 + 20·log10(2400 MHz) + 20·log10(R_km)
= 32.45 + 67.6 + 20·log10(R_km)
= 100.05 + 20·log10(R_km)
For R = 50 km: L_path = 100.05 + 20·log10(50) = 100.05 + 33.98 = 134.0 dB
For R = 100 km: L_path = 100.05 + 40.00 = 140.0 dB
Receiver sensitivity at 1 Mbps QPSK:
Thermal noise floor (kT·B): −114 dBm + 10·log10(1 MHz) = −114 dBm
Noise figure: +3 dB (good LNA)
Required SNR for 1 Mbps QPSK: +9 dB (BER 1e-6)
Sensitivity = −114 + 3 + 9 = −102 dBm
Received power at 50 km:
P_rx = 27 + 3 + 12 − 134 − 4 = −96 dBm
Margin above sensitivity = −96 − (−102) = +6 dB ✓ (viable link)
Received power at 100 km:
P_rx = 27 + 3 + 12 − 140 − 4 = −102 dBm
Margin above sensitivity = 0 dB ✗ (marginal, no fade margin)
Conclusion: Fischer 26E direct-RF link budget supports 50 km range with 6 dB fade margin.
This is the operational radius when Starlink is unavailable. For longer ranges, Fischer 26E
relays through MANET mesh peers (each adding another 50 km hop).
Worked Example 1 — Krasukha-4 jamming at 2.4 GHz
Scenario: Fischer 26E operating 30 km from brigade GCS on 2.4 GHz. Russian Krasukha-4 station 10 km from Fischer 26E activates full-spectrum barrage jamming in its ~2-4 GHz band.
Krasukha-4 parameters:
Effective radiated power: 70 kW peak across ~2 GHz bandwidth
Per-MHz PSD: 70,000 W / 2000 MHz = 35 W/MHz
Krasukha-4 to Fischer 26E path loss (10 km, 2.4 GHz, free space):
L = 100.05 + 20·log10(10) = 120.05 dB
Jamming power at Fischer 26E antenna:
J = 10·log10(35 W) + 30 − 120.05 = 15.44 + 30 − 120.05 = −74.6 dBm per MHz
Fischer 26E received signal (from GCS, 30 km):
P_rx_signal = 27 + 3 + 12 − (100.05 + 20·log10(30)) − 4 = 27 + 15 − 133.6 − 4 = −95.6 dBm
Signal over 1 MHz channel: −95.6 dBm
Signal-to-Jam ratio on ONE fixed 2.4 GHz channel:
S/J = −95.6 − (−74.6) = −21 dB → LINK BROKEN
But Fischer 26E does not stay on one channel. Within Krasukha's 2-4 GHz coverage,
Fischer 26E has only 2 GHz / 5.93 GHz = 34 % of its band denied. The other 66 %
(70 MHz - 2 GHz and 4 GHz - 6 GHz) is UNAFFECTED. Fischer 26E fastlock-hops within
the unjammed fraction:
Available unjammed span: 5,930 − 2,000 = 3,930 MHz
Non-overlapping channels: 3,930 / 56 = 70 channels available
Per-hop survival prob: 70 / 70 = 100 % (deterministic, hop only to clear channels)
Link performance: unaffected by Krasukha-4
Operational conclusion: a Krasukha-4 that destroys Silvus or ELRS operation at this range
fails to deny Fischer 26E because Fischer 26E's band exceeds Krasukha's coverage by 3×.
The attacker would need to co-locate three Krasukhas each covering a different 2 GHz
sub-band — €15M+ investment versus €800 per Fischer 26E.
Worked Example 2 — Microsecond hopping vs a reactive digital jammer
Scenario: adversary deploys a modern reactive jammer (2024-generation SDR-based system with 20 μs reaction time). Fischer 26E hops at 5 μs dwell time.
Timeline:
t = 0 μs: Fischer 26E TX starts on channel f_1
t = 5 μs: Fischer 26E hops to channel f_2 (pre-calibrated fastlock profile)
t = 10 μs: Fischer 26E hops to channel f_3
t = 15 μs: Fischer 26E hops to channel f_4
t = 20 μs: Fischer 26E hops to channel f_5
← at this moment the jammer finally detects and tunes to f_1
t = 25 μs: Jammer emits on f_1 (empty — Fischer 26E is now on f_6)
t = 30 μs: Fischer 26E hops to channel f_7 (jammer still on f_1)
t = 35 μs: Fischer 26E hops to channel f_8
t = 40 μs: Jammer detects f_6, starts 20μs retune cycle
t = 60 μs: Fischer 26E has hopped 12 channels total; jammer finally on f_6 (empty)
Link availability calculation:
Fischer 26E time per channel: 5 μs
Jammer catch-up time per channel: 20 μs (reaction) + 5 μs (tune) + 1 μs (emit) = 26 μs
Fischer 26E hops ahead per catch-up: 26 / 5 = 5.2 channels
At any moment:
P(jammer on correct channel) = 0 % (jammer is always 5 channels behind)
Link BER from reactive jamming: 0
Link throughput: full 56 Mbps (limited by modulation, not jamming)
The only way to block Fischer 26E is pre-emptive barrage jamming across the entire band.
Per Step 5, this requires ~300 kW of combined EW power — more than any known Russian
system delivers. Fischer 26E is mathematically immune to current-generation tactical EW.
Component List and Bill of Materials
FISCHER 26E — BOM (per airframe, 2026 prices)
The pre-built HAMGEEK E310 module (€500, specifications from hgeek.com: AD9361 + Zynq-7020 + 0.5 ppm VCTCXO + enclosure + Ethernet/USB interfaces) is the recommended reference build for small-batch production. For volume production (100+ airframes) a custom board reduces cost by ~€100 per unit and integrates better with Fischer 26's existing Pixhawk 6C carrier. The custom board route requires engineering investment (~€30,000 NRE) that is only justified at volume.
Verification Code — Reproducing the Math
import math
# Fischer 26E parameters
AD9361_LO_SPAN_MHZ = 5930 # 70 MHz to 6 GHz = 5930 MHz usable
AD9361_FASTLOCK_NS = 500 # VCXO settle after pre-calibrated profile load
AD9361_PROFILE_LOAD_NS = 100 # Pin-controlled SPI to select profile
AD9361_MIN_DWELL_NS = 1000 # Operational minimum (load + settle + margin)
AD9361_MAX_BW_MHZ = 56 # Instantaneous bandwidth per channel
ELRS_HOP_RATE_HZ = 150
FISCHER26E_MAX_HOP_RATE_HZ = 1_000_000 # 1 MHz (1 μs dwell)
# Step 2 verification: hop-rate improvement over ELRS
ratio = FISCHER26E_MAX_HOP_RATE_HZ / ELRS_HOP_RATE_HZ
print(f"Fischer 26E hop rate / ELRS: {ratio:.0f}x") # Expected ~6667
# Step 3 verification: jammer reaction time vs dwell
def jammer_reaction_us(detect_us=20, tune_us=5, emit_us=1):
return detect_us + tune_us + emit_us
jam_react = jammer_reaction_us()
for dwell_us in [1, 5, 10]:
hops_ahead = jam_react / dwell_us
print(f"Dwell {dwell_us} μs: jammer is {hops_ahead:.1f} hops behind")
# Step 4 verification: channel count
ch_wide = AD9361_LO_SPAN_MHZ / AD9361_MAX_BW_MHZ
ch_narrow = AD9361_LO_SPAN_MHZ / 1.0
print(f"Non-overlapping 56 MHz channels: {ch_wide:.0f}")
print(f"Narrowband 1 MHz channels: {ch_narrow:.0f}")
# Step 5 verification: barrage power requirement
NARROWBAND_JAMMER_PSD = 50 # W per MHz
p_barrage_kw = NARROWBAND_JAMMER_PSD * AD9361_LO_SPAN_MHZ / 1000
print(f"Barrage power to deny Fischer 26E: {p_barrage_kw:.0f} kW")
# Step 6 verification: link budget Friis equation
def friis_rx_dbm(p_tx_dbm, g_tx_dbi, g_rx_dbi, freq_mhz, range_km, misc_loss_db=4):
fspl_db = 32.45 + 20*math.log10(freq_mhz) + 20*math.log10(range_km)
return p_tx_dbm + g_tx_dbi + g_rx_dbi - fspl_db - misc_loss_db
for R in [25, 50, 75, 100]:
p_rx = friis_rx_dbm(27, 3, 12, 2400, R)
margin = p_rx - (-102) # -102 dBm sensitivity at 1 Mbps QPSK
print(f"R={R:3d} km: P_rx={p_rx:.1f} dBm, margin={margin:+.1f} dB")
# Krasukha-4 worked example
KRASUKHA_POWER_W = 70000
KRASUKHA_BW_MHZ = 2000
p_psd = KRASUKHA_POWER_W / KRASUKHA_BW_MHZ # 35 W/MHz
unaffected_span = AD9361_LO_SPAN_MHZ - KRASUKHA_BW_MHZ
unaffected_pct = unaffected_span / AD9361_LO_SPAN_MHZ * 100
print(f"Krasukha-4 denies {KRASUKHA_BW_MHZ} MHz; "
f"Fischer 26E retains {unaffected_pct:.1f}% of spectrum ({unaffected_span} MHz)")
# Reactive jammer catch-up
def hops_jammer_behind(dwell_us, jam_react_us):
return jam_react_us / dwell_us
for dwell in [1, 5, 10, 50]:
behind = hops_jammer_behind(dwell, jam_react)
status = "IMMUNE" if behind > 3 else "VULNERABLE"
print(f"Dwell {dwell:2d} μs: jammer {behind:.1f} hops behind — {status}")
# BOM total for single-unit build
BOM = {
'AD9361 RFIC': 280,
'Zynq-7020 SoC module': 220,
'VCTCXO 0.5ppm': 35,
'RF PA 500mW': 85,
'Wideband antenna': 55,
'Shielded enclosure': 40,
'Interconnect': 25,
'Power regulation': 20,
'Assembly labor': 150,
}
total_single = sum(BOM.values())
print(f"\nFischer 26E BOM (single unit): EUR {total_single}")
for name, cost in BOM.items():
print(f" {name:30s} EUR {cost:4d}")
Why This EW-Hardened Variant Matters Operationally
Four operational decisions depend on Fischer 26E's math being correct. If we get this wrong the consequences are direct: a brigade that plans a campaign around Starlink-assumed Fischer 26 discovers mid-operation that the service has been denied, and the fallback either doesn't work or doesn't exist at all.
First, strategic dependence vs autonomy: the baseline Fischer 26 contains a single point of failure outside Swedish control (Starlink, operated by SpaceX under US law and regulatory reach). Fischer 26E removes that dependence at €800/airframe. For a 20-airframe brigade deployment, that is €16,000 — less than one month of Starlink Mobility Priority subscription fees. The math says the SDR is an investment, not an added expense, over a multi-year deployment.
Second, survivability under active EW: Worked Example 1 shows that Krasukha-4 (€15M+ system, Russia's premier tactical EW asset) cannot deny Fischer 26E because its 2 GHz coverage is one-third of Fischer 26E's 5.93 GHz band. An attacker must deploy three co-located Krasukha-class systems to achieve full-band denial — a €45M investment to counter €16,000 of Fischer 26E upgrades. The asymmetry favors the defender, which is the mathematical reason for choosing a 6 GHz-wide operating band rather than a narrower 460 MHz band like Silvus.
Third, reactive jammer immunity: Worked Example 2 shows that any jammer with a digital reaction time (all modern EW systems) is defeated by fastlock microsecond hopping. This is not a claim about current Russian systems — it is a claim about the physics of PLL tuning. Even if Russia fields a 10-μs-reaction jammer tomorrow, Fischer 26E remains immune at 5 μs dwell. Only the theoretical limit (1 μs dwell against 1 μs jammer reaction) creates vulnerability, and no known RF amplifier can emit meaningful power in 1 μs.
Fourth, endurance trade-off acceptability: Fischer 26E's 26 W additional draw (SDR + FPGA) is less than Starlink's 40 W, so when Fischer 26E runs SDR-only it actually gains endurance. The 3-minute endurance loss appears only when BOTH Starlink AND SDR run simultaneously (redundant mode, recommended for the first 24 hours of a contested deployment). After the contested phase stabilizes, the operator selects single-mode operation and endurance returns to baseline. The math lets the operator pick the right trade for each mission phase.
Fischer 26E claims validated in provable_claims.py under FISCHER26E_HOP_RATE_VS_ELRS (6667× improvement), FISCHER26E_CHANNEL_COUNT_56MHZ (106 non-overlapping channels), FISCHER26E_BARRAGE_POWER_KW (296 kW requirement), FISCHER26E_LINK_BUDGET_50KM (6 dB fade margin), and FISCHER26E_KRASUKHA_UNAFFECTED_SPECTRUM (66 % spectrum retained). The fastlock timing numbers (100 ns profile load, 500 ns settle, 1 μs minimum dwell) come from the AD9361 datasheet Rev. G and the ADI wiki fastlock tutorial — FSG-A has not measured these independently.
Cross-References
Fischer 26E complements existing FSG-A pages. For the baseline airframe's energy model that this variant extends, see fischer26-energy.html (drag/propulsion/EW-overhead/solar math). For the FHSS background on narrowband vs barrage jamming, see fhss-implementation.html. For the Silvus-based MANET architecture that Fischer 26E fits inside, see lisa26-architecture.html (four-tier bandwidth derivation). For the overall Fischer 26 design reference, see fischer26-whitepaper.html.
External source: Analog Devices AD9361 product page
External source: ADI Frequency Hopping Example Design (fastlock profiles tutorial)
Related Chapters
Sources
Parameter sources. AD9361 LO tuning range (70 MHz-6 GHz), maximum instantaneous bandwidth (56 MHz), fastlock profile count (8), fastlock load time (~100 ns) and settling time (~500 ns) — all from Analog Devices AD9361 datasheet Rev. G (2024) and ADI wiki frequency-hopping tutorial. Xilinx Zynq-7020 characteristics (dual Cortex-A9, 85K logic cells) — Xilinx datasheet UG585. VCTCXO 0.5 ppm accuracy — Connor-Winfield CWX813 datasheet. HAMGEEK E310 complete module price (€500) and specifications — hgeek.com product listing. Krasukha-4 operational characteristics (~70 kW ERP, 2-4 GHz band coverage) — RUSI reports on Russian EW systems (Watling & Reynolds 2023). Friis transmission equation constants and QPSK receiver sensitivity — standard RF engineering formulas (Rappaport Wireless Communications, Prentice-Hall 2002 ch. 4).
Mathematically verified claims. Hop-rate improvement factor (1 MHz / 150 Hz = 6,667×), channel count (5,930 / 56 = 106 non-overlapping), barrage power requirement (50 W/MHz × 5,930 MHz = 296.5 kW), Friis path loss at 50 km 2.4 GHz (134 dB), Krasukha-4 unaffected spectrum fraction (3,930 / 5,930 = 66 %) — all are direct arithmetic from the parameters above and validated in provable_claims.py.
Operational estimates — not validated by FSG-A field testing. Jammer reaction time (20-50 μs detection + 5-50 μs tune + 1-5 μs emit = 26-105 μs total) is derived from published SDR and PLL physics, not measured on specific Russian systems. The 280 g additional weight, 26 W additional power, and €700-900 BOM are engineering estimates based on component datasheets and assembly-time analogies — FSG-A has not built and weighed a Fischer 26E prototype. The 3-4 minute endurance impact derives from the energy budget on fischer26-energy.html using the 26 W delta, and should be verified in flight testing before operational deployment.
External standards and references. Analog Devices AD9361 RF Agile Transceiver datasheet Rev. G. ADI Engineer Zone / wiki frequency-hopping reference design. Xilinx Zynq-7000 All Programmable SoC Technical Reference Manual UG585. HAMGEEK E310 specifications (hgeek.com). ETSI EN 300 328 (2.4 GHz unlicensed band limits). Russian EW characterization: RUSI Watling & Reynolds "Operation Z: The Death Throes of an Imperial Delusion" (2022) and RUSI "Electronic Warfare Lessons from Ukraine" (2023). FSG-A Fischer 26E is a DESIGN concept — no hardware has been built and no flight testing has been performed.