BeaconLock
Virtual Camera Tracking for Coarse Alignment
of Mobile FSOC Terminals
A real-time virtual PAT simulator for optical beacon detection, predictive tracking, and closed-loop camera control in mobile FSOC terminals.
Explore the architecture ↓Precision engineered for optical tracking
Every component of BeaconLock targets a specific challenge in FSOC coarse alignment.
Closed-Loop Tracking
Full synthetic simulation loop: virtual scene → camera → perception → PD control → camera actuation, all in real time.
Sub-Pixel Centroiding
Intensity-weighted Center of Gravity estimation: x = Σ(I·x) / Σ(I). Achieves 2.51 px RMSE on figure-8 trajectories.
6-State Kalman Prediction
Constant-acceleration Kalman filter tracking [x, y, vx, vy, ax, ay]. Confidence-adaptive measurement covariance with occlusion coasting.
Rate-Limited PD Control
Proportional-Derivative controller with strict ±5.0°/s actuator slew clamping and a 0.05° pointing deadband. Prevents gimbal overrun.
Disturbance Simulation
Five atmospheric conditions (Clear, Haze, Fog, Rain, Low Light) and kinematic jitter injection for robust algorithm validation.
Evaluator Video Ingestion
Mode B ingests external MP4/AVI/MKV footage through the FrameSource abstraction. Zero pipeline changes required for real-world footage evaluation.
Coarse alignment is where the link begins.
Mobile FSOC terminals rely on highly directional optical beams. Even small pointing errors can push the remote terminal outside the camera's field of view, breaking the optical link entirely.
Real hardware testing requires expensive pan-tilt mechanisms, calibrated optical equipment, and controlled environments — creating significant cost and iteration barriers for algorithm development.
BeaconLock provides a software-based environment for developing and evaluating coarse tracking algorithms before hardware deployment. The entire test-validate-iterate cycle runs on a standard CPU.
- Virtual world2000 × 2000 px continuous canvas
- Viewport640 × 480 px grayscale, FOV 4° × 3°
- Beacon size5–20 px Gaussian emitter
- ISRO threshold≥ 20 FPS mandatory
- Achieved~159 FPS — 700% above threshold
How BeaconLock works
A closed-loop pipeline from scene generation to camera actuation.
Virtual Scene
2000×2000 px canvas with atmospheric disturbance injection
Moving Beacon
Straight, Circular, Figure-8, or Random Walk kinematics
Virtual Camera
Rate-limited PTZ, 640×480 grayscale viewport, FOV 4°×3°
Beacon Detection
Adaptive thresholding: I_th = μ_bg + 3·σ_bg on border-annulus estimation
PD Camera Control
u = Kp·e + Kd·(de/dt) clamped to ±5°/s with 0.05° deadband
Kalman Prediction
6-state constant-acceleration filter with confidence-adaptive covariance
Sub-Pixel CoG
Intensity-weighted centroid in dynamic 64×64 tracking ROI
5-State FSM
SEARCHING → ACQUIRING → TRACKING → LOST → REACQUIRING
Two modes, one unified pipeline
The FrameSource abstraction decouples the tracking algorithm from the signal source.
Synthetic Simulation
BeaconLock generates the entire virtual environment — world canvas, moving beacon, atmospheric disturbances, and virtual camera — and drives the closed-loop pan/tilt response.
- 4 beacon kinematics
- 5 atmospheric conditions
- Jitter ±20 px/frame
- ~159 FPS
Evaluator Video
External MP4, AVI, or MKV footage is ingested through the VideoFileSource adapter. Resolution auto-rescales. Zero changes to the perception or control layers.
MP4 / AVI / MKV
- 30-FPS input stream
- Auto resolution rescaling
- 1.430 px tracking RMSE
- ~129 FPS
4-Tier decoupled architecture
A unidirectional, interface-driven design that completely isolates sensor simulation from perception and control.
simulation/scene.py2000 × 2000 px worldsimulation/target.py5–20 px Gaussian beaconsimulation/disturbances.pyFog / Jitter / Rainsimulation/camera.pyRate-limited PTZ cameraingestion/frame_source.pyFrameSource ABCVideoFileSourceOpenCV MP4/AVI streamResolution Auto-RescalingAny input sizeread() → (ok, ndarray) — 640 × 480 Greyscale
perception/centroid.pyI_th = μ_bg + 3·σ_bg (border-annulus)x_cog = Σ(I·x) / Σ(I)Full-frame ↔ Dynamic 64 × 64perception/kalman_tracker.py[x, y, vx, vy, ax, ay]R(c) = R_base / max(c, 0.01)Kalman propagation during blankcontrol/pid_controller.pyu = Kp·e + Kd·(de/dt)±5.0 °/s actuator envelope0.05° pointing convergenceapp/state_machine.pySEARCHING → ACQUIRING→ TRACKING → LOST→ REACQUIRINGui/dashboard.py — PySide6 / PyQtGraphMeasured performance
All values recorded from the verified benchmark registry. No extrapolation.
Built on proven engineering tools
Runtime
Core Algorithms
Ready to run BeaconLock?
Download the standalone Windows build or inspect the full source code. No Python environment, no dependencies, no installation required.
Fully open source
The complete BeaconLock implementation — source code, architecture documentation, test suite, benchmarking data, and compliance reporting — is available on GitHub.
- Source code & module structure
- 143-assertion test suite
- Benchmark registry & results
- Automated PDF compliance report
- Architecture documentation