Professional Experience

June 2025 — August 2025 · Cape Town, South Africa

Milkor Integrated Systems

AI Product Engineer

Perception for autonomous UAVs: reconstruct the surroundings in 3D, as a system that could ship on an airframe, not a notebook.

computer vision · ROS/ROS2 · OpenCV · Python · C++

In short

  • A standalone 3D-reconstruction stack for UAV platforms — Python, C++, OpenCV, Linux.
  • The job was the whole pipeline: sensors, images, inference, and the hardware they arrived on.
  • Live flight demos against more than 100 GB of data.

What made it difficult

This was a perception and 3D reconstruction system for autonomous UAV platforms. The goal was not a model that looked good on a prepared dataset. The system had to take data from real sensors, move it through the stack, reconstruct the surroundings, and hold together when it was attached to an aircraft and tested outside.

Almost every layer could produce the same visible symptom. If the reconstruction looked wrong, the problem might be calibration, a camera stream, IMU timing, ROS communication, image processing, inference, hardware, or the environment itself. There was rarely a useful error saying which layer was responsible.

A lot of the work became isolating those problems: enough of the entire pipeline to keep moving downward until the real source showed up, instead of patching whatever was visible at the end.

The system

I worked across cameras and IMUs, ROS/ROS2 data flows, Linux, C/C++, Python, OpenCV, perception logic, inference, and the hardware tying those pieces together.

ROS was part of the backbone. Sensor data had to be published and consumed with the right timing and the right assumptions about the data. Once multiple sensors and processing stages are involved, the interfaces between components matter as much as the components.

The objective was a standalone perception system that could be used across UAV platforms, not something that only worked as a development setup.

From development to flight

We tested against more than 100 GB of real flight data and during live UAV demonstrations. Real flight introduced motion, vibration, lighting changes, imperfect sensor data, timing issues, and conditions that were hard to reproduce at a desk.

That changed the debug question. Instead of asking whether one component worked, I had to ask whether the whole chain still produced a useful answer when every input was a little less clean than expected.

Related