Skip to content
Test Types & Methods

Robotics Test Data Management with TofuPilot

Learn how to manage test data for autonomous vehicles and robotics systems using TofuPilot's multi-stage test tracking and sensor data storage.

JJulien Buteau
intermediate11 min readMarch 14, 2026

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 IDStageWhat it tests
PCBA-MOTOR-CTRLBoard testMotor controller PCBA functional test
MOTOR-CHARSubassemblyMotor torque/speed characterization
IMU-CALSensor calIMU offset and sensitivity calibration
SYS-INTEGRATIONSystemFull robot integration checks
THERMAL-CYCLEEnvironmentalThermal cycling qualification
HIL-NAVHILNavigation 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.

motor_controller_test.py
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.py
# 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.

imu_calibration.py
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:

  1. Did the motor controller board pass its functional test? What were the exact measurements?
  2. Was the motor characterization nominal, or was it marginal?
  3. Were the IMU calibration offsets within spec?
  4. 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.

More Guides

Put this guide into practice