I build the software that keeps drones in the air. From avionics integration to computer vision pipelines — every line of code runs on hardware where failure isn’t an option.
C++23 for zero-overhead abstractions. ROS 2 for distributed systems. PX4 for flight control. All running on edge hardware under tight constraints.
I design and implement flight-critical software for drones and robotics: navigation pipelines and computer vision. Available for consulting and contract work — remote or on-site.
Chasing 18 Milliseconds: A Performance Deep Dive into O3DE's Render Readback Pipeline
We spent a full session systematically profiling O3DE’s multi-camera streaming pipeline, testing eight different optimization approaches, and pinpointed the exact bottleneck: 18 ms of fixed overhead in the AttachmentReadback scope system. Here’s what we tried, what we measured, and what it means for the engine.
From Unity to Godot: Multi-Camera Streaming at 50 FPS with Async GPU Readback
After O3DE’s 18 ms frame-graph readback made 30 FPS streaming impossible, we tried Godot. It got us there — eventually. This is the full path from 105 FPS on nothing to 50 FPS per camera with three live RTP streams, including every wrong turn and every underdocumented Godot behavior we hit on the way.
From Unity to O3DE: Multi-Camera Streaming at 1080p in a Headless Docker Container
Exploring whether O3DE can replace Unity as the render engine for a drone simulation that streams multiple 1080p camera feeds via GStreamer. From first scaffold to three live RenderToTexture pipelines in a single session.
Running PX4 SIH on Real Hardware: Custom Firmware for In-the-Loop Flight Simulation
Getting PX4’s Simulation-In-Hardware (SIH) module running on a production flight controller — discovering the firmware doesn’t include SIH, building a custom PX4 with flash-trimming, fan-out routing serial MAVLink to both the simulator and ground station, and connecting it all to the Unity visualization pipeline.
Procedural Settlement: Generating 3D Buildings, Roads, and Entities from OpenStreetMap in Unity
How I replaced a proprietary terrain bundle with a fully procedural environment generated from open-source data — hundreds of buildings with window textures from OpenStreetMap, terrain-hugging roads, satellite-driven vegetation, and multiple ground and air entities — all built at runtime in a headless Unity Docker simulation.
Five Optiver-Style C++ Problems: Order Books, Dijkstra, and DP
Working through five C++ problems modeled on Optiver’s Senior SWE assessment: supermarket checkout simulation, order book matching, dividend pricing, lattice path DP, and Dijkstra with K free edges. Every bug, wrong turn, and data structure tradeoff included.
Scripted Hardware Testing for PX4 — MAVLink Shell, Docker, and pymavlink
How to script PX4 hardware verification using pymavlink’s SERIAL_CONTROL protocol over a USB connection — download CI firmware, flash from the command line, and run NSH commands programmatically. No QGroundControl required.
The Satellite Tile Hunt: From 15m Blobs to 13cm Resolution in an Air-Gapped Simulation
A practical guide to finding, downloading, and fusing satellite imagery and elevation data for an air-gapped Unity simulation. Covers every free tile provider (ESRI, Bing, Google), every free DTM source (SRTM, Copernicus, Mapzen), how to stitch thousands of tiles into Unity-ready textures, and the dead ends along the way.
From 21 to 25 FPS: Profiling and Optimizing a Headless Unity Simulation Pipeline
A detailed technical walkthrough of profiling and optimizing a headless Unity simulation from 21 to 25 FPS — covering NVENC GPU encoding, batch camera rendering, GPU instancing, static batching, and the failed URP migration. Every measurement, every dead end, every lesson.
Natural Skies and Satellite Terrain in a Headless Unity Simulation
How I replaced flat brown terrain and solid-color sky in a headless Unity 6 Docker simulation with real satellite imagery, SRTM topography, and a custom panoramic skybox — all fully air-gapped, no runtime network dependency. Includes NVENC GPU encoding, custom shaders, and every dead end along the way.