SKIP TO CONTENT
MC
ALT
000.0m
HDG
000°
WP
01/8
01 / 8PREFLIGHTLOCAL --:--:----:--:--ZALL SYSTEMS NOMINAL
OPERATOR

Vincent Zhou

Computer Engineering student building autonomy that flies

I write the flight software that lands a drone on its own launch point using nothing but what the camera remembers.

LOCATION
Waterloo, ON
SORTIES
8
VERIFIED
7/8
ACTIVE
3

PRESS 18 TO SLEW · SCROLL TO DESCEND · THE DRONE ON THE RAIL IS YOUR POSITION

ADI

ATTITUDE

CURSOR + SCROLL
HDG
000°
ALT
000 m
02 / 8WHO IS FLYING THIS

DOSSIER

5 DOMAINS · 3 PROGRAMMES
DSR

OPERATOR DOSSIER

Computer Engineering at the University of Waterloo. I run the autonomy subteam at the Waterloo Aerial Robotics Group — thirty people, one flight-software stack, and a competition airframe that has to work on the day.

The work I care most about is precision landing without a marker: record what the ground looks like on the way up, match it on the way down, and put the aircraft back where it started. It landed inside 15 cm on the airframe.

BASED
Waterloo, ON
CALLSIGN
VZHOU
EKF HOME
43.472N 80.545W
FLT

LOG SUMMARY

SORTIES LOGGED
08
VERIFIED
07
IN PROGRESS
03
STACK DEPTH
34

COUNTED FROM THE MISSION LOG BELOW — NOT HAND-WRITTEN

DMN

WHERE THE WORK SITS

  • FULL-STACK2
  • MACHINE LEARNING2
  • PERCEPTION2
  • AUTONOMY1
  • SIMULATION1
ORG

PROGRAMMES

  • UWARG · Autonomy
  • UWARG · AEAC 2026 Firefighting
  • Personal
MOST-USED TOOLING

Python (6) · Git / CI (5) · NumPy (4) · Docker (3) · OpenCV (3)

03 / 8EVERY SORTIE, WITH ITS FLIGHT LOG

MISSIONS

STATUS

SHOWING 08 / 08 SORTIES

IN PROGRESS
Active development.
FLIGHT-VERIFIED
Proven on the airframe, not just in simulation.
DEPLOYED
Running in production or in the team's main branch.
COMPLETE
Finished and working; not an ongoing programme.
GROUP A

FLOWN

Shipped, merged or verified on the airframe05
  • MSN-01

    PERCEPTION

    FLIGHT-VERIFIEDFLOWN ON AIRFRAME
    ORG
    UWARG · Autonomy
    WINDOW
    May 2026 – Sept 2026

    PRECISION LANDING · TEACH & REPEAT

    NO MARKER, NO GPS FIX — LANDED INSIDE 15 cm

    A visual teach-and-repeat precision landing built and flight-tested end to end. On the way up it records an altitude-keyed map of ORB features; on the way down it matches each live frame against the nearest teach frame and flies the aircraft back onto its own launch point. 15 cm in flight test, 2 cm in simulation.

  • MSN-03

    SIMULATION

    DEPLOYEDTESTED / RUNNING
    ORG
    UWARG · Autonomy
    WINDOW
    May 2026 – Present

    SITL-PLUS

    UAV SIMULATOR WRITTEN FROM SCRATCH

    A software-in-the-loop range built from scratch: PyBullet rigid-body physics for the quadcopter's flight dynamics, bridged to ArduPilot's SITL binary over a UDP JSON protocol so the real flight controller flies a simulated airframe at full rate.

  • MSN-04

    PERCEPTION

    FLIGHT-VERIFIEDFLOWN ON AIRFRAME
    ORG
    UWARG · Autonomy
    WINDOW
    May 2026 – Jul 2026

    PRECISION LANDING · APRILTAG BASELINE

    THE CONTROL LOOP, PROVEN BEFORE THE PERCEPTION CHANGED

    Closed-loop descent onto an AprilTag, flown first and deliberately: with a fiducial in the frame the target estimate is effectively ground truth, so any bad behaviour left over belongs to the controller and not to the perception.

  • MSN-07

    FULL-STACK

    DEPLOYEDTESTED / RUNNING
    ORG
    Personal
    WINDOW
    Apr 2026 – Aug 2026

    CLASSLY

    CLASSROOM PLATFORM, SHIPPED AND SERVERLESS

    A classroom management platform in production: role-based access for admins, teachers and students over a Postgres/Drizzle schema, session auth with OAuth, and an invite-based onboarding flow built on cryptographically secure tokens.

  • MSN-08

    MACHINE LEARNING

    COMPLETETESTED / RUNNING
    ORG
    Personal
    WINDOW
    Jun 2026 – Jul 2026

    NEURAL NETWORK FROM SCRATCH

    C++ / EIGEN MLP, NO FRAMEWORK, 95.4% ON MNIST

    A multilayer perceptron implemented with no ML framework at all: forward pass and backpropagation derived by hand and written straight onto Eigen matrices.

GROUP B

ON THE BENCH

Active development — honest status, not marketing03
  • MSN-02

    AUTONOMY

    IN PROGRESSFLOWN ON AIRFRAME
    ORG
    UWARG · Autonomy
    WINDOW
    Sept 2026 – Present

    AUTONOMY STACK · ARCHITECTURE & REVIEW

    30-PERSON SUBTEAM, ONE FLIGHT-SOFTWARE STACK

    Running the autonomy subteam: thirty contributors split into parallel project groups, a flight-software backlog scoped into issues small enough to onboard on, and an architecture that lets those groups land work without stepping on each other.

  • MSN-05

    MACHINE LEARNING

    IN PROGRESSNOT FLIGHT-TESTED
    ORG
    UWARG · Autonomy
    WINDOW
    Sept 2026 – Present

    CNN FEATURE MATCHING

    LEARNED DESCRIPTORS WHERE ORB GIVES UP

    A lightweight 2D convolutional detector–descriptor network (XFeat) with parallel keypoint-detection and 64-dimensional dense-descriptor heads, aimed squarely at the conditions where hand-engineered ORB degrades on the landing pipeline.

  • MSN-06

    FULL-STACK

    IN PROGRESSTESTED / RUNNING
    ORG
    UWARG · AEAC 2026 Firefighting
    WINDOW
    Mar 2026 – Sept 2026

    AEAC TARGET GEOLOCATION PLATFORM

    PIXELS TO GROUND COORDINATES, LIVE, UNDER 0.5 m

    Full-stack, real-time UAV geolocation platform for the 2026 AEAC Firefighting competition: a React/TypeScript operator console over a Flask REST API that turns a target spotted mid-flight into a 3D ground coordinate.

04 / 8THE FLIGHT THAT WORKED, RECOVERED OFF A CORRUPTED CARD

TEACH & REPEAT

12 FRAMES SURVIVED OF 855 CARVED

No marker on the ground and no GPS precision to lean on. On the way up the aircraft memorises what the ground looks like at every rung of an altitude ladder. On the way down it matches what it sees against what it remembers, and flies the difference to zero.

It landed inside 15 cm on the airframe and 2 cm in simulation. Everything below this line is measured from the flight itself, not reconstructed — including the part where the classical feature descriptor starts to run out of road.

FLIGHT ERROR
15cm
SIM ERROR
2cm
CONTROL LOOP
10Hz
DESCENT RATE
0.1m/s
SIM

HOW THE DESCENT WORKS

SIMULATED · REAL CONSTANTS
TEACH KEYFRAME · STOREDREPEAT FRAME · LIVE
AGL m
7.50
RUNG m
7.50
MATCHES
0
XY ERR cm
0
AUTHORITY
0.00
PHASE
REPEAT
LOOPS 7.5 m → TOUCHDOWN IN 9 s

Cyan crosses are keypoints. The green ring is the alignment cone — max(0.05 m, 0.15 × AGL), which works out to a constant pixel radius for most of the descent, and the dashed ring at twice that is where descent authority reaches zero. The vector from the amber reticle is the correction. Watch the match count fall as the aircraft climbs away from its keyframe, and watch the whole overlay go cold at 1.0 m when the autopilot takes over.

RCV

RECOVERED FLIGHT FRAMES

f01 · 1/12
Teach keyframe f01: the downward camera's view of the taped launch mark on asphalt, recorded during the climb.Repeat frame f01: the same ground seen on descent, with the correction vector the flight software drew on it.
TEACH KEYFRAME1.96× ALTREPEAT FRAME · LIVE2.43× ALT
LATERAL ERROR
17.5cm
SCALE GAP σ
0.804
MATCHES · INLIERS
643· 97%
RELATIVE ALTITUDE
2.43×

Frame f01, 1 of 12. Lateral error 17.5 centimetres. Scale gap 0.80. 643 matches at 97.4% inliers.

WHAT YOU ARE LOOKING ATLeft is the keyframe recorded on the climb; right is the live frame on the way down. The blue arrow on the right half was drawn by the flight software, in flight — I did not add it. Because it was drawn at a known 250 pixels per metre, it inverts back to the exact lateral correction the controller was given, which is where the centimetre figures come from. The cyan rings are the real ORB correspondences that survived the ratio test and RANSAC. The amber cross is the principal point: the flight code aims the correction from there, not from the middle of the picture.

EXT

GROUND OBSERVER · THE SAME LANDING

2026-08-19 19:49 EDT · 43.4354 N 80.5783 W

The teach-and-repeat landing, from the ground. The aircraft is descending on vision alone at 0.1 m/s onto the taped launch point it mapped on the way up; ArduPilot's LAND mode takes the last metre. Unstabilised phone video, tone-mapped and trimmed to the touchdown. It looks slow because it is: 0.1 m/s under vision, tapered further whenever match quality drops. The last metre is the quick part.

LDR

ALTITUDE LADDER

HIGH → LOW

BARS ARE RELATIVE ALTITUDE · RIGHT COLUMN IS THE DECODED LATERAL ERROR.

The correction is converging as it comes down: mean decoded error is 26.5 cm across the upper half of the surviving ladder and 17.0 cm across the lower half, over 11 measurable frames. That is the loop closing, and it is what puts touchdown inside 15 cm.

SCL

WHERE ORB RUNS OUT

LEFT COLUMN IS σ — TEACH ALTITUDE ÷ REPEAT ALTITUDE. RIGHT IS SURVIVING MATCHES. RED PAIRS ARE THE WIDE-GAP ONES, AND THEY ARE THE ONES THAT STARVE.

WIDEST SCALE GAP
0.42σ
WIDEST EXPOSURE GAP
32LUMA

This is the argument for MSN-05. ORB is a binary descriptor on an image pyramid, and it bridges neither of the two gaps these frames actually contain: the aircraft sitting well above its keyframe, and the sun moving between takeoff and landing. The worst pair here has only 38 matches left. A learned detector–descriptor is aimed at exactly that hole — the measurements above are why the project exists rather than a guess that it might help.

PPL

THE PIPELINE, IN THE ORDER THE SOFTWARE RUNS IT

1/8
T1 · TEACH — CLIMB OUT

Every 0.25 m of altitude gained on the way up, the downward camera is undistorted, ORB-described, and filed in a map keyed by height above ground from the rangefinder. The ladder tops out at 7.5 m.

A frame with fewer than 150 keypoints is rejected rather than stored — a dead keyframe is worse than a missing one, because the descent would select it and then stall.

SOURCEPerception, teach map and landing action server in airside/src/nodes/nodes/processor.py; the PI velocity controller in controller.py.BRANCH · non-optimal-targets (opens in a new tab)FULL MISSION LOG · MSN-01
05 / 8THE FIDUCIAL BASELINE — FLOWN FIRST, ON PURPOSE

TAG BASELINE

SCROLL IS FLYING

Before the marker came out of the frame, the same controller was proven against an AprilTag. With a fiducial in view the target estimate is effectively ground truth, so a bad landing could only be the control loop's fault — which is what made the feature-based work in section 04 debuggable at all. This bay is that descent with the failures I could not inject in flight.

DSC

DESCENT CONTROL

SCROLL
ALTITUDE AGL

12.00m

PHASE

TRANSIT

V/S m/s
+0.0
TAG CONF
--
LAT ERR m
0.00
GROUND12 m

FAULT INJECTIONCLEAN AIR
-6CALM+6

WIND LEAVES A REAL TOUCHDOWN ERROR · PAST 4 m/s THE ALIGNED GATE FAILS. THE OCCLUDER HOLDS HOVER — NO TARGET, FEATURE FLOW DEGRADES.

  • TARGET ACQUIRED
  • LATERAL ALIGNED
  • FLARE ARMED
  • TOUCHDOWN
TRC

ALTITUDE TRACE

LAST 8.5 s

PLOTTED FROM THE ALTITUDE YOU ACTUALLY FLEW

DL1

PAYLOAD DOWNLINK

SIM · SITL

GROUND OBSERVER · UNSTABILISED · Ground observer · unstabilised, tone-mapped from 10-bit HLGThe AprilTag baseline descent, from the ground. Same controller, same airframe, but with a fiducial in the frame so the target estimate is effectively ground truth — this is the run that proved the control loop before the marker came out.

D

DEPTH

M

PAD MASK

F

FEATURE FLOW

Every panel above is the same scene through a different pass, projected with pixels = metres · f / altitude and depth = h · √(1 + (r/f)²). The lateral error converges as you descend because that is what the landing controller does — inject a crosswind and watch how much of it the controller gets back before the gear touches.

DET

DETECTOR EVENT LOG

LAST 6 EVENTS · THE COLD OPEN FLEW ITS DESCENT IN 12.2 s
  • F00000IDLEDETECTOR ARMED · WAITING FOR THE DESCENT

EVERY LINE IS A GATE THAT ACTUALLY CHANGED — ACQUISITION, LATERAL LOCK, LOSS OF TARGET, TOUCHDOWN. NOTHING HERE IS ON A TIMER.

06 / 8THE ROUTE SO FAR — DRAWN AS YOU SCROLL

WAYPOINTS

4 LEGS · NEWEST FIRST
  1. WP-04AHEADSept 2026 – PresentCOMMAND

    Autonomy Project Manager

    UWARG — Waterloo Aerial Robotics Group · Waterloo, ON

    • Project Manager for a 30-member autonomy subteam: contributors organised into parallel project groups, the flight-software backlog scoped into issues sized for onboarding, tracked through to flight readiness for the 2027 AEAC competition.
    • Run code review for the autonomy stack and set its architectural direction — the ROS 2 node and message boundaries between the perception, GNC and obstacle-avoidance packages, so work split across groups integrates without rework.
    • See MSN-02 for the architecture itself.
    CARRIED
    • ROS 2
    • Code Review
    • Architecture
    • Technical Leadership
  2. WP-03AHEADMay 2026 – Sept 2026OPERATIONS

    Software Engineering Intern

    UWARG — Waterloo Aerial Robotics Group · Waterloo, ON

    • Independently designed, built and flight-tested the visual teach-and-repeat precision-landing system — 15 cm in flight test, 2 cm in simulation. See MSN-01.
    • Validated the descent controller against an AprilTag baseline first, so control and perception failures stayed separable. See MSN-04.
    • Built SITL-Plus, the from-scratch PyBullet simulator the landing pipeline was tuned in. See MSN-03.
    • Architected the AEAC 2026 Firefighting geolocation platform, localising targets in 3D to under 0.5 m. See MSN-06.
    CARRIED
    • Python
    • ROS 2
    • OpenCV
    • MAVROS
    • NVIDIA Jetson
    • PyBullet
  3. WP-02AHEADJan 2026 – May 2026OPERATIONS

    Software Developer

    UW Orbital — Waterloo Satellite Design Team · Waterloo, ON

    • Implemented CRUD endpoints for the satellite ground-station command API (FastAPI, SQLModel), with request validation and Loguru-based logging middleware for real-time performance monitoring.
    CARRIED
    • Python
    • FastAPI
    • SQLModel
    • REST APIs
    • Loguru
  4. WP-01AHEADSept 2025 – June 2030TRAINING

    B.A.Sc. Computer Engineering, Honours Co-op

    University of Waterloo · Waterloo, ON

    • Core coursework in programming, linear algebra, circuits and digital systems — the foundation under the autonomy work.
    CARRIED
    • Computer Engineering
    • Linear Algebra
    • Digital Systems
    • Verilog / Quartus
    • Calculus
07 / 8SIGNAL LEVEL = MISSIONS THAT ACTUALLY USED IT

INSTRUMENTS

PEAK 6/8 SORTIES
LNG

LANGUAGES

8/8 SORTIES
ROB

ROBOTICS & FLIGHT

5/8 SORTIES
VIS

VISION & LEARNING

6/8 SORTIES
SYS

BACKEND, DATA & INFRA

6/8 SORTIES
HOW TO READ THIS PANEL

Each bar is missions using the tool ÷ busiest tool, counted from the mission log in section 03 — so it measures how much of the work leaned on something, not how good anyone claims to be. The mission codes under each channel are links: follow them and check.

ALSO IN THE TOOLBOX · NO LOGGED SORTIE16 UNMETERED
LANGUAGES
  • Java
  • JavaScript
  • Lua
  • Verilog
HARDWARE
  • Raspberry Pi
  • Quartus / FPGA
BACKEND & DATA
  • FastAPI
  • SQLModel
  • Pydantic
  • Zod
  • Neon
INFRA & TESTING
  • Cloudflare Pages
  • Wrangler
  • GitHub Actions CI
  • Vitest
  • Loguru

COURSEWORK, HARDWARE LABS AND SUPPORTING TOOLING. LISTED WITHOUT A SIGNAL LEVEL BECAUSE NO MISSION ABOVE MEASURES THEM.

08 / 8SEND A TRANSMISSION — IT REALLY SENDS

COMMS

4/4 CHANNELS LIVE

UPLINK COMPOSER

Validated in the browser, then handed to your mail client. No backend, no third party, nothing stored.

your name
where I reply
what this is about
0 chars · 12 minimum

DIRECT CHANNELS
OPERATING NOTES
  • Based Waterloo, ON.
  • Fastest route is the primary channel above; I read everything.
  • Mission code in the subject line gets you a faster, more specific answer.