◂ Research

Autonomous Robotics Project

September 2024 – January 2025

Team project to build an autonomous robot competing in a grid-based capture-the-flag race: markers ("flags") were scattered across a lettered/numbered grid, and each robot had to find them and report them to a race server before the other team did. I was responsible for the whole vision system: spotting the markers, working out where the robot actually was, and reporting captures without duplicates.

The vision pipeline

Marker detection

Used OpenCV's ArUco module (a 6×6, 250-marker dictionary) on a single onboard camera feed. Default detector parameters missed markers under real lighting and viewing angles, so I tuned the adaptive threshold constant and the min/max marker perimeter rate until detection was reliable across the whole grid, not just head-on and up close.

Corner identification

Each detected marker comes with the pixel coordinates of its four corners. I used those corners to confirm a detection was a real, well-formed marker (rejecting distorted or partial reads) and to read off its ID reliably before acting on it.

Pixel-to-grid distance

The robot only knows its position in pixels/centimeters from its own tracking; the race server speaks grid cells (A1 to F6). I calibrated the cell size in that coordinate space and converted the robot's raw position into a row letter and column number on every marker capture.

Reporting captures

On each detection, the marker ID and computed grid position were sent to the race server over a small REST API (start race, report marker, stop race). Already-reported markers were tracked locally so the robot wouldn't resend the same capture on every frame while sitting near a flag.