Robotics Test Data Management with TofuPilot
Robots go through more test stages than almost any other product category. Board-level tests, motor characterization, sensor calibration, firmware validation, system integration, environmental screening, and field simulation. TofuPilot tracks all of it under one serial number.
The Robotics Testing Challenge
A typical autonomous robot has:
- 3-5 PCBAs, each with its own functional test
- 6-12 motors or actuators, each needing characterization
- Multiple sensor suites (LiDAR, cameras, IMUs) requiring calibration
- Firmware that needs validation at each revision
- System-level integration tests
- Environmental tests (thermal, vibration, IP rating)
- Field simulation or HIL testing
Each test stage generates data. Without a centralized system, that data lives in different tools, different formats, on different machines. When a robot fails in the field, tracing back to which test stage missed the issue is nearly impossible.
Setting Up Multi-Stage Test Tracking
Define Your Test Procedures
Create a procedure in TofuPilot for each test stage in your manufacturing process.
| Procedure ID | Stage | What it tests |
|---|---|---|
PCBA-MOTOR-CTRL | Board test | Motor controller PCBA functional test |
MOTOR-CHAR | Subassembly | Motor torque/speed characterization |
IMU-CAL | Sensor cal | IMU offset and sensitivity calibration |
SYS-INTEGRATION | System | Full robot integration checks |
THERMAL-CYCLE | Environmental | Thermal cycling qualification |
HIL-NAV | HIL | Navigation algorithm validation |
Link Tests to the Same Unit
Every test run references the robot's serial number. TofuPilot automatically links all runs for a given serial, creating a complete test history.
from tofupilot import TofuPilotClientclient = TofuPilotClient()# Board-level test for the motor controllerclient.create_run( procedure_id="PCBA-MOTOR-CTRL", unit_under_test={ "serial_number": "ROBO-2025-0142", "part_number": "MC-BOARD-R3", }, run_passed=True, steps=[{ "name": "H-Bridge Driver", "step_type": "measurement", "status": True, "measurements": [{ "name": "gate_drive_voltage", "value": 12.1, "unit": "V", "limit_low": 11.5, "limit_high": 12.5, }], }, { "name": "Current Sense", "step_type": "measurement", "status": True, "measurements": [{ "name": "current_sense_gain", "value": 50.2, "unit": "mV/A", "limit_low": 48.0, "limit_high": 52.0, }], }],)# Motor characterization for the same robotclient.create_run( procedure_id="MOTOR-CHAR", unit_under_test={ "serial_number": "ROBO-2025-0142", "part_number": "DRIVE-ASSEMBLY-R2", }, run_passed=True, steps=[{ "name": "Stall Torque", "step_type": "measurement", "status": True, "measurements": [{ "name": "stall_torque_nm", "value": 2.45, "unit": "Nm", "limit_low": 2.2, "limit_high": 2.8, }], }, { "name": "No-Load Speed", "step_type": "measurement", "status": True, "measurements": [{ "name": "no_load_rpm", "value": 5820, "unit": "RPM", "limit_low": 5500, "limit_high": 6100, }], }],)Track Sensor Calibration Data
Sensor calibration produces arrays of data. TofuPilot handles multi-dimensional measurements natively.
import numpy as np# IMU calibration with multi-axis dataclient.create_run( procedure_id="IMU-CAL", unit_under_test={"serial_number": "ROBO-2025-0142"}, run_passed=True, steps=[{ "name": "Accelerometer Offset", "step_type": "measurement", "status": True, "measurements": [ {"name": "accel_offset_x", "value": 0.012, "unit": "g", "limit_low": -0.05, "limit_high": 0.05}, {"name": "accel_offset_y", "value": -0.008, "unit": "g", "limit_low": -0.05, "limit_high": 0.05}, {"name": "accel_offset_z", "value": 0.003, "unit": "g", "limit_low": -0.05, "limit_high": 0.05}, ], }, { "name": "Gyro Bias", "step_type": "measurement", "status": True, "measurements": [ {"name": "gyro_bias_x", "value": 0.15, "unit": "deg/s", "limit_low": -0.5, "limit_high": 0.5}, {"name": "gyro_bias_y", "value": -0.22, "unit": "deg/s", "limit_low": -0.5, "limit_high": 0.5}, {"name": "gyro_bias_z", "value": 0.08, "unit": "deg/s", "limit_low": -0.5, "limit_high": 0.5}, ], }],)Tracing Field Failures Back to Production
When a robot fails in the field, search by serial number in TofuPilot. You'll see every test it went through:
- Did the motor controller board pass its functional test? What were the exact measurements?
- Was the motor characterization nominal, or was it marginal?
- Were the IMU calibration offsets within spec?
- Did the system integration test pass cleanly, or were there retests?
This trace often reveals the root cause. A motor that passed characterization at the edge of its torque spec is more likely to fail under real-world loads.
Fleet-Level Analytics
For robotics companies deploying fleets, TofuPilot's analytics work across your entire production.
- Compare calibration distributions across production batches
- Track motor characterization trends over time
- Identify which test stage catches the most defects
- Correlate field failure rates with production test margins
If robots from batch 47 have a higher field failure rate, pull their production test data and compare measurement distributions against batch 46. The difference in the data points to the root cause.