The problem
An autonomous competition robot streams sensor data, path coordinates, and discrete events, not always in the same shape. The team needed those readings stored, turned into diagnostics, and replayed in space — in a weekend — without a schema change mid-build wiping the log.
What it does
A serial bridge feeds a Flask API, persisted in MongoDB. Data arrives on the order of 100 ms; a run captures thousands of readings.
Ingestion sniffs three formats at runtime — sensor readings, path coordinates, and events — and normalizes each into a common schema. MongoDB’s document model let each format keep its natural shape instead of forcing one rigid table.
Computed metrics run on demand, not during ingestion: section times, checkpoint hit rate, velocity and acceleration from finite differences on position, stuck-event detection with a small state machine plus a noise filter, and a position heatmap from grid bucketing.
An LLM coaching layer sits on top of those metrics and writes natural-language feedback. Analysis is a separate, triggerable step. If no API key is configured, the tool still returns every computed metric with a clearly labeled fallback summary.
The frontend is React. A Three.js viewer replays the run in 3D; an SVG animator shows the 2D path.
Three decisions
Analysis off the write path. An LLM call is slow and can fail. If it sat on ingestion, a flaky API could threaten the log. Ingestion always succeeds on its own.
MongoDB over a relational store. The logging format changed during the hackathon. A document store absorbed that without a migration.
Stuck detection as a state machine. “Velocity below X for Y seconds” false-positives on legitimate slow maneuvers. The state machine plus a noise filter was built to cut that down.
What broke
The first ingestion layer assumed one fixed shape. When the robot moved from event-based logging to raw path coordinates, records in the new shape failed validation quietly — data disappeared with no obvious signal. The worse failure mode is a pipeline that is wrong and silent. The fix was detecting format from the incoming shape, and failing loudly on anything unrecognized.
What’s unfinished
Built in about two days with a team of five. Won Best Use of MongoDB at UTRA Hacks 2026. The 3D replay and the diagnostics are real; treat it as a hackathon telemetry stack, not a flight-ready robot platform.