Robot Telemetry
Nexus Workshops
LIVE TELEMETRY ACTIVE

See Inside Your Robot.
Fix It Before the Next Match.

A complete guide to streaming real-time sensor data from your FTC robot over UDP, storing it in a SQLite database, and querying it to find problems your eyes can't see.

2
tables in the database
1
Python script to run
15+
diagnostic queries
questions you can ask
Why It Matters

Skills That Carry Into Every Career

The ability to instrument a system, capture data during operation, and query it intelligently is one of the most valuable skills in professional engineering. You are not just debugging a robot. You are learning how the world's most critical systems are understood and improved.

Aerospace

Rockets stream thousands of sensor readings per second during flight. Every SpaceX anomaly investigation, every Mars rover debugging session, every Columbia inquiry — all rely on the same pattern: structured telemetry capture, timestamped records, and systematic querying.

Medical Devices

Implantable devices, surgical robots, and proton therapy systems log operational data continuously. In cancer treatment, beam targeting systems rely on real-time monitoring to deliver the right dose to the right location — a system that cannot be observed cannot be trusted.

Autonomous Vehicles

Every self-driving car generates terabytes of sensor data per hour. Finding the specific 200-millisecond window where the system failed — and understanding why — is only possible with the habit of mind you develop here: log everything, query intelligently.

Defense Systems

Tactical robots, autonomous vehicles, and sensor platforms operate in conditions that cannot be fully reproduced in a lab. High G-forces, jamming environments, extreme temperatures — the data stream is the only window into what actually happened.

Underwater Systems

Autonomous submarines and remotely operated vehicles cannot be observed directly during a mission. Post-mission data analysis is the primary debugging tool. Dynamics that look predictable in simulation behave completely differently underwater — and only the data reveals why.

Any Real-Time System

The pattern is universal: instrument the system, capture data continuously, store it efficiently, query it intelligently. Engineers who master this skill see problems differently than their peers. They find failures before they become catastrophic. They validate changes instead of assuming them.

Architecture

Simple by Design

Four components. One direction. The robot sends. The laptop receives, stores, and answers questions. No web servers. No build pipelines. No infrastructure to maintain.

FTC Robot
Java OpMode calls UdpTelemetry.put() each loop
UDP / WiFi
JSON packets fire and forget — no handshake, no delay
telelog.py
Python socket listener parses JSON and writes triples
SQLite DB
Two tables. Permanent. Query any way you need.
Zero overhead on robot

One call to .put() and one call to .send() per loop. The network stack handles the rest asynchronously. Your loop time is unaffected.

Schema never changes

Two tables: packets and triples. Add any sensor, any predicate, without ever touching the database schema. The structure adapts to your robot.

Query anything

Full SQL. Find outliers, compare runs, detect stalls, trace events across subsystems — all from the same database, across every run you have ever logged.

Verify with Wireshark

Filter on udp.port == 3000 to see every packet your robot sends. Instantly diagnose connection problems before blaming the code.

Real Engineering Problems

Every One of These Is Real

Teams encounter these exact situations every season. In each case, the robot appears to work fine in practice — and then fails at competition. Telemetry data is what separates a team that guesses from a team that knows.

8.1

The Robot That Curves When It Should Go Straight

You drive straight in your gym. At competition, on a different floor surface, it curves left. The code is identical. The wiring checks out. You have two matches left.

Both motors receive the same command — but one wheel has a slightly different tire contact patch on the new floor. The robot curves.

Query left_velocity vs right_velocity. Plot both. The gap between them is the exact magnitude of your imbalance.
8.2

The April Tag That Disappeared

Autonomous runs flawlessly for 8 seconds — then the robot freezes mid-field for 3 seconds and drives into the wall.

Another robot drove between yours and the April tag, blocking the camera. Your code waited for a detection that never came and had no fallback.

Log targets_detected every packet. Find the exact blind window. Design the fallback. Log nav_mode to verify it activates.
8.3

The Color Sensor That Lied at Competition

Works perfectly in your workshop — a hundred times, never misses. At the competition venue, it misfires constantly. The hardware is fine.

Your workshop has cool fluorescent lighting. The competition venue has warm LED panels at a different intensity. Your threshold was tuned to the wrong building.

Tag sessions by venue. Query average ambient_light per tag. The numbers tell you exactly how far off your threshold is.
8.4

The Ball That Was Slower Than the Code

The intake sensor fires, the gate opens 50ms later. Sometimes the ball makes it, sometimes not. Intermittent and invisible. The software timing looks fine.

Physics: the ball is still decelerating through the mechanism. It arrives at the gate somewhere between 80 and 240ms after the sensor fires.

Measure the actual transit time between sensor trigger and confirmed delivery across 30 cycles. You will see the distribution.
8.5

The Motor That Could Not Lift the Load

Arm mechanism works with practice game elements. At competition with the official (slightly heavier) elements, the arm stalls partway through its travel. The robot times out.

The stall signature: power output climbs toward maximum while encoder position stops changing. Visible in data. Invisible to the naked eye.

Plot encoder_delta alongside power. High power, zero encoder delta = stall. The exact packet tells you where and under what load it fails.
8.6

Field-Centric Drive That Felt Possessed

The driver pushes forward and the robot goes sideways. Pushes right, it goes backward. From the driver station it looks possessed. It worked perfectly in practice.

A hard collision shifted the IMU heading 45 degrees. Every drive command is now rotated by 45 degrees in the wrong direction.

Log imu.heading alongside drive commands. A sudden heading jump at the collision timestamp tells you exactly what happened and when.
Live Data Preview

This Is What the Data Looks Like

SQL queries pull data from the triplestore and paste directly into LibreOffice Calc. These are examples of what you can see — rendered from real sample telemetry values.

motor_balance.sql
Left vs Right Motor Power
A healthy robot shows two lines tracking each other closely. Divergence = drift.
0 .4 .7 left_power right_power Packet ID
packet_timing.sql
Loop Timing — delta_ms Per Packet
Consistent bars show a healthy loop. Orange spike = loop stall at that moment.
50ms 152ms stall Packet ID
imu_heading.sql
IMU Heading — Yaw Over Time
Gradual drift is expected. A sudden jump at packet 11 reveals a collision or slip event.
collision! +51deg jump 0 45 Packet ID Yaw (deg)
normalized_overlay.sql
All Signals — Normalized 0 to 1
Different units, same chart. Compare behavior across subsystems in one view.
left right yaw hood 0 1 Packet ID
The SQL

The Magic Is in the Queries

A pile of triples looks like nothing. A well-written SQL query reaches into that pile and surfaces patterns that were invisible. These are three of fifteen queries in the full guide.

FIND
Motor stall detection — high power, no movement
SELECT p.id, p.ts, CAST(pw.object AS REAL) AS power, CAST(enc.object AS INTEGER) AS encoder_pos, CAST(enc.object AS INTEGER) - LAG(CAST(enc.object AS INTEGER)) OVER (ORDER BY p.id) AS encoder_delta FROM packets p JOIN triples pw ON pw.packet_id = p.id AND pw.subject = 'arm_motor' AND pw.predicate = 'power' JOIN triples enc ON enc.packet_id = p.id AND enc.subject = 'arm_motor' AND enc.predicate = 'encoder' WHERE p.tag = 'auto_match_3' ORDER BY p.id;
Sample Output
idpowerencoder_posencoder_delta
450.621840+42
460.741871+31
470.951874+3
481.001875+1
491.0018750
Packets 47-49: power at maximum, encoder not moving. That is the stall signature. The exact packet tells you where in the arm travel and under what load it fails.
COMPARE
Cross-environment sensor comparison — lighting check
SELECT p.tag, COUNT(*) AS samples, ROUND(AVG(CAST(t.object AS REAL)), 1) AS avg_reading, ROUND(MIN(CAST(t.object AS REAL)), 1) AS min_reading, ROUND(MAX(CAST(t.object AS REAL)), 1) AS max_reading FROM packets p JOIN triples t ON t.packet_id = p.id WHERE t.subject = 'color_sensor' AND t.predicate = 'ambient_light' GROUP BY p.tag ORDER BY MIN(p.ts);
Sample Output
tagsamplesavg_readingminmax
workshop_tuesday240418.3390451
comp_practice180681.7645714
comp_match_180679.2650710
The competition venue reads 63% higher ambient light than your workshop. Your detection threshold was tuned to 418, not 681. One query explains the entire failure.
DETECT
Multi-system event window — reconstruct a collision
SELECT p.id, p.ts, t.subject, t.predicate, t.object FROM packets p JOIN triples t ON t.packet_id = p.id WHERE p.tag = 'auto_match_5' AND p.id BETWEEN 140 AND 180 AND t.subject IN ( 'camera', 'imu', 'left_motor', 'right_motor', 'arm_motor', 'drive' ) ORDER BY p.id, t.subject, t.predicate;
Reading the Event Timeline
idsubjectpredicateobject
153cameratargets_detected0
153imuheading+12.1 jump
153left_motorvelocity-0.8 drop
158arm_motorencoder_delta0 (stall)
165cameratargets_detected1
Packet 153: camera lost targets, IMU heading jumped 12 degrees, motors showed velocity drop — all in the same packet. That is the collision. Every subsystem response timestamped to the same moment.
Get Started

Ready in Four Steps

Clone the repository, run the listener, instrument your robot, and start asking questions. The whole stack runs on a $35 Raspberry Pi if you want to log automatically at competition.

1

Clone the repository

Get telelog.py and the UdpTelemetry Java class from the Nexus Workshops git server.

2

Run the listener

Connect your laptop to the Control Hub WiFi. Start telelog.py before your op mode. Tag every session.

3

Instrument your OpMode

Add four lines of Java: create UdpTelemetry, call .put() for each signal, call .send() at the end of each loop.

4

Open DB Browser and ask questions

Run a query, paste into LibreOffice Calc, chart it. Every session you have ever logged is in the database.

nxgit.dev/nexus-workshops/udp-telemetry.git
telemetry @ workshop-laptop
$git clone https://nxgit.dev/nexus-workshops/udp-telemetry.git
Cloning into 'udp-telemetry'... done.
$cd udp-telemetry
$python telelog.py --tag comp_2026_03_15_match_1
telelog v1.0 listening on 0.0.0.0:3000 database: telemetry.db tag: comp_2026_03_15_match_1 waiting for packets... [18:00:01.050] src=192.168.43.1 id=1 subjects=['left_motor','right_motor','imu','drive'] [18:00:01.100] src=192.168.43.1 id=2 subjects=['left_motor','right_motor','imu','drive'] [18:00:01.150] src=192.168.43.1 id=3 subjects=['left_motor','right_motor','imu','drive'] [18:00:01.302] src=192.168.43.1 id=4 TIMING SPIKE: 152ms [18:00:01.355] src=192.168.43.1 id=5 subjects=['left_motor','right_motor','imu','drive'] $
Complete Field Guide

Take the Full Guide With You

The complete field guide goes deep on every concept covered on this site -- IP networking, UDP frames, Wireshark, the triplestore schema, all fifteen SQL queries, six engineering problem walkthroughs, and LibreOffice Calc graphing with sample charts. Written for FTC students planning careers in engineering.

Version 1.0
Robot Telemetry
A Complete Field Guide
Nexus Workshops LLC

Robot Telemetry: A Complete Field Guide

A 14-section technical manual covering everything from "what is an IP address" through multi-system event reconstruction with SQL window functions. Designed for FTC students who want to understand their robot at a professional engineering level -- and carry those skills into their careers.

1–3 Networks, IP, UDP, Wireshark
4–5 Python listener, SQLite triplestore
6–7 SQL intro, 15 diagnostic queries
8 7 real engineering problems
9 LibreOffice Calc graphing
11–13 Robot instrumentation, FTC Dashboard comparison
Free for educational and FTC team use. This is a living document -- check back for updated versions.
Nexus Workshops

Where Potential Meets Opportunity

This guide is part of the Nexus Workshops educational program — a collection of hands-on technical workshops designed for students who want to do real engineering, not just follow instructions.

The skills in this guide — networking, database design, SQL, systems thinking — are not FTC skills. They are engineering skills. The robot is the project. The discipline you build is the career.

Take your time with this material. Return to it as your experience grows. The engineers who become exceptional at data-driven debugging are the ones who stayed curious long after they got the basic system working.


Visit Nexus Workshops