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 TofuPilotClient
client = TofuPilotClient()
# Board-level test for the motor controller
client.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 robot
client.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 data
client.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.