A stable antenna feed
The Radarcape provides data at about 10 Hz and the antenna system also expects a 10 Hz feed. Retransmission logic maintains the required fixed-rate supply when incoming updates do not align exactly with that cadence.
Systems engineering · legacy modernisation · operational tooling
A decoupled Python suite that replaced the LabVIEW tool used to track a flight-test telemetry antenna. It turns live ADS-B positions into the fixed-rate aircraft-position feed expected by the antenna controller, while independent operator, coverage and recording tools remain outside the critical tracking path.
01 — The operational need
During flight tests, a directional ground antenna receives engineering telemetry from the helicopter. Maintaining that link requires the antenna to follow the aircraft automatically; manual guidance is possible, but substantially harder because the instrumentation engineer must interpret orientation from north and estimate where the helicopter is.
The operational chain is: helicopter ADS-B broadcast → Radarcape ADS-B receiver → Python software suite → antenna controller → physical antenna movement.
The software supplies the aircraft position. The antenna-control system knows its own location and performs the calculations required to orient the antenna physically; this application neither controls the motors directly nor computes motor commands.
02 — Why replace the legacy tool
My manager assigned me to replace the existing LabVIEW tracking tool and provided an initial Jira list, mostly short requirement statements and checkboxes. The immediate trigger was the move to Windows 11.
The LabVIEW application might still have run in compatibility mode, so this was not an absolute technical blocker. It was, however, ageing, difficult to maintain and tied to a licensed environment with limited internal control.
Moving to Python removed the LabVIEW dependency, created a maintainable codebase the team could own, and made it possible to add capabilities users had requested for years. The result was therefore a functional modernisation, not a one-for-one port.
03 — Requirements engineering
I knew the legacy workflow but was not the primary domain expert. The real process was iterative: initial Jira requirements → development → first tests → user feedback → clarification → additional requirements → further implementation.
The Radarcape provides data at about 10 Hz and the antenna system also expects a 10 Hz feed. Retransmission logic maintains the required fixed-rate supply when incoming updates do not align exactly with that cadence.
Operators select a prototype from a drop-down. Callsign and ICAO address are held in configuration, so additional internal prototypes can be added without changing the core software.
ADS-B validity states distinguish usable data from missing or invalid data, including absences that can be consistent with an aircraft on the ground. Affected indicators turn red when attention is required.
Near the antenna, a configurable zone deliberately adjusts the altitude supplied to obtain the appropriate acquisition behaviour during hover, landing and take-off profiles.
Tracking must continue if the Dash interface is closed or fails. Visualisation is useful to the operator but cannot be a dependency of the antenna feed.
Antenna position, prototype definitions and prepared terrain coverage are site assets. Adding a location should not require major changes to the core software.
Identity · position · altitude
Receives aircraft broadcasts
Makes validated aircraft state available
Selects prototype · supplies position at 10 Hz
Calculates orientation · moves antenna
Persistent prototype position history
Map · trail · status · cross-check
04 — Resilient architecture
The Python suite is deliberately decoupled rather than monolithic. Each component has a clear operational responsibility and can be maintained or restarted without turning the dashboard into a single point of failure.
Operational tracking path
Receives aircraft data from the Radarcape, applies the relevant validity handling and makes the state available to the other components.
Applies the selected prototype and site behaviour, then supplies the aircraft position to the antenna controller at its expected 10 Hz cadence.
Independent operational consumers
Provides prototype selection, an interactive map, recent track, status visibility, coverage and independently calculated theoretical azimuth and elevation. If Dash fails, tracking can continue.
Monitors configured prototypes in the background and, while a prototype is detected, in range and valid, records its position every ten seconds in one CSV file per day.
Prepared and deployed around the suite
Downloads and processes the required Swisstopo terrain tiles into coverage layers for a configured antenna location.
PyInstaller executables let operators run the tools without maintaining a Python environment; documented configuration separates prototypes and sites from core code.
The dashboard is not on the critical path. Closing or losing the visual interface does not by itself stop the tracking component from continuing to feed the antenna system.
05 — Fixed-rate feed
Radarcape aircraft data is received at about 10 Hz, while the antenna system expects its position supply at 10 Hz. The arrival timing and the fixed output cadence are not assumed to be perfectly aligned.
Retransmission or upsampling logic therefore supplies the latest valid position at the required cadence. The software does not turn repeated values into new measurements.
No dead reckoning, prediction or advanced interpolation. Validity remains explicit, and the tracking path does not blindly continue using aircraft data once it has become invalid or stopped arriving.
Requirements learned with users
My first implementation of the near-antenna requirement was wrong because the short Jira statement did not explain the antenna’s acquisition and directional modes, or how their gain changes with geometry and height.
Instrumentation users explained why directional tracking can lose signal when the helicopter returns very close to the antenna during some hover, landing and take-off profiles. I corrected the design to use a configurable zone and deliberate altitude adjustment that prompts the appropriate acquisition behaviour.
The resulting behaviour avoids repeated manual mode changes and reduces signal losses in those phases. It is a concrete example of turning user feedback and physical-system understanding into a corrected requirement and implementation, without claiming a measured quantitative gain.
06 — Interactive map and terrain coverage
The legacy LabVIEW interface used a fixed map and coverage that was largely specific to one site. The replacement provides an interactive map with zoom, current aircraft position and roughly 120 recent positions — about 120 seconds of track history.
An offline GIS and command-line workflow downloads and processes Swisstopo terrain tiles. It models terrain rather than buildings, which matches the main obstruction in the Alpine operating environment.
For each antenna location, the workflow generates an approximate visibility area over a radius of about 30 km, in 500 ft altitude slices up to about 20,000 ft. The dashboard selects coverage according to the helicopter’s current altitude.
The same process can prepare a new location from the antenna coordinates and the relevant terrain data. That supports multi-site deployment without embedding each site into the core application.
07 — Failure handling and operator cross-checks
The architecture is resilient through separation and explicit state handling; it does not claim redundant receivers, automatic failover or high availability.
The tracked-aircraft state is marked invalid, the relevant indicators turn red and the antenna-feed logic does not continue to trust invalid positions blindly.
Validity handling accounts for cases such as an aircraft on the ground, so every missing value is not presented as the same failure.
The tracking and antenna-feed component can continue because Dash is an independent consumer, not a step in the critical path.
The dashboard independently calculates theoretical azimuth and elevation from the known antenna and aircraft positions to support an operational cross-check.
No direct antenna feedback is claimed. A commanded-versus-actual comparison was considered but abandoned because the available antenna interface was not reliable or maintainable enough for a clean integration.
08 — Progressive operational validation
Validation moved deliberately from controlled inputs to the complete operational chain. Simulation was a starting point, not a substitute for hardware and flight evidence.
Recorded positions can be replayed in a loop, creating a repeatable aircraft trajectory for checking selection, tracking behaviour and the antenna-feed chain.
The software was connected to the installed receiver and exercised with current ADS-B traffic at an active airfield.
Aircraft flying circuits were used to verify visually that the physical antenna followed their trajectory.
A real helicopter flight was selected to limit operational risk while checking antenna behaviour, aircraft tracking and actual telemetry reception.
Several subsequent flight tests completed successfully with the Python suite as the antenna-tracking tool.
09 — Current status
10 — Demonstrated change
Ageing LabVIEW application and licence dependency
Windows 11-compatible Python suite packaged for operators
Static map and largely single-site coverage
Interactive map with altitude-dependent terrain coverage and reusable site generation
Tracking and visualisation coupled in one tool
Independent tracking, Dash and Recorder components with a protected operational path
Prototype and site changes tied closely to the tool
Configurable callsigns, ICAO addresses, antenna positions and site assets
Manual intervention near the antenna during some profiles
Configurable near-antenna behaviour shaped with instrumentation-user feedback
Limited operator status and test support
Explicit validity indicators, theoretical angle cross-checks, replay mode and first-line troubleshooting material
Position history linked mainly to active use
Persistent background position logging for configured prototypes, including outside active telemetry sessions
Impact is reported qualitatively. No measured workload saving or tracking-accuracy improvement is claimed. The demonstrated outcome is a maintainable replacement now used operationally, with clearer state, safer separation, broader site support and documented handover.
11 — My role
My manager defined the initial need — replace the existing LabVIEW tracking tool — and supplied the first Jira requirements. I then clarified requirements with users, designed the decoupled architecture and developed the complete software suite as its sole developer.
My scope covered Radarcape integration, the antenna interface, tracking behaviour, the Dash dashboard, terrain and coverage processing, the fake and replay tools, the independent Recorder, operational-validation support, PyInstaller packaging, configuration, documentation and troubleshooting material.
My manager supported parts of the physical deployment, notably installation of the new Radarcape. Users contributed the domain knowledge needed to clarify operational behaviour, and their feedback drove subsequent iterations.
This was technical ownership, not project management. I did not initiate the project, manage a programme or own the antenna hardware. I owned the replacement software and its integration from clarified requirements through operational deployment and handover.
12 — Engineering takeaways
Short requirements became reliable behaviour only through first tests, user explanations, corrected assumptions and iteration.
The near-antenna logic only made sense once acquisition and directional antenna behaviour were understood, not merely the checkbox wording.
Keeping Dash and Recorder independent means useful services can fail or be maintained without automatically stopping the antenna feed.
Configuration, Windows packaging, troubleshooting states and operator documentation let the system run without its author present.