{
  "protocolId": "RCI-BLM-1",
  "title": "RCI Reproducible Backlash and Low-Torque Lost-Motion Test Protocol",
  "version": "0.1.0",
  "schemaVersion": 1,
  "status": "public-draft-lab-validation-required",
  "released": "2026-08-10",
  "canonical": "https://robotcomponentindex.com/research/reproducible-backlash-lost-motion-test-protocol/",
  "methodology": "https://robotcomponentindex.com/methodology/",
  "scope": "Quasi-static torque–angle hysteresis characterization of rotary reducers and integrated robot joint actuators at an externally measured output flange.",
  "exclusions": [
    "Robot-level pose accuracy or repeatability",
    "Dynamic transmission error, vibration, acoustic noise or high-speed behavior",
    "Safety certification, endurance life or production acceptance unless a separate validated acceptance plan exists",
    "Comparison between reducer-only, integrated-unpowered and servo-hold boundaries"
  ],
  "references": [
    {
      "id": "iso-230-2-2014",
      "title": "ISO 230-2:2014 — Determination of accuracy and repeatability of positioning of numerically controlled axes",
      "url": "https://www.iso.org/standard/55295.html",
      "relevance": "Public abstract establishes direct measurement, repeated measurements and applicability to rotary axes. RCI-BLM-1 is not an implementation of, or claim of conformity to, this paid standard."
    },
    {
      "id": "iso-9283-1998",
      "title": "ISO 9283:1998 — Manipulating industrial robots — Performance criteria and related test methods",
      "url": "https://www.iso.org/standard/22244.html",
      "relevance": "Robot-level performance remains a separate boundary from component-level torsional hysteresis. RCI-BLM-1 must not be presented as an ISO 9283 robot test."
    },
    {
      "id": "harmonic-drive-gears-engineering-data",
      "title": "Harmonic Drive Gears — Engineering Data",
      "url": "https://harmonicdrive.de/fileadmin/Downloads/Produkte/Kataloge/Harmonic_Drive_Gears_EN_1053522.pdf",
      "relevance": "Public manufacturer engineering data describes a locked-input torque–torsion hysteresis curve and a lost-motion measurement around ±4% of rated torque. RCI uses the 4% reporting level but publishes its own branch-gap equation and full raw curve."
    },
    {
      "id": "nist-tn-1297-reporting",
      "title": "NIST Technical Note 1297 — Reporting Uncertainty",
      "url": "https://www.nist.gov/pml/nist-technical-note-1297/nist-tn-1297-7-reporting-uncertainty",
      "relevance": "Supports reporting expanded uncertainty with its coverage factor and documenting the uncertainty components and evaluation method."
    }
  ],
  "boundaries": [
    {
      "id": "gear-only-mechanical-lock",
      "label": "Gear or reducer only; input mechanically locked",
      "whatIsMeasured": "Reducer, output bearing, fixture and measurement-chain torsional response.",
      "requiredState": "Input lock type and measured lock motion; lubricant, ratio, assembly, preload and output-bearing state.",
      "comparisonBoundary": "Compare only with the same reducer-only boundary and equivalent assembly state."
    },
    {
      "id": "integrated-unpowered-mechanical-lock",
      "label": "Integrated actuator unpowered; motor/input mechanically locked",
      "whatIsMeasured": "Complete actuator mechanical path, including couplings, brake state, bearings, housing and reducer.",
      "requiredState": "Power removed; brake state explicit; motor shaft/input lock explicit; internal and external angle references retained.",
      "comparisonBoundary": "Do not merge with reducer-only or servo-on results."
    },
    {
      "id": "integrated-servo-hold",
      "label": "Integrated actuator powered in a fixed servo-hold state",
      "whatIsMeasured": "Closed-loop joint response including controller, sensing, current limits, compensation and mechanical path.",
      "requiredState": "Firmware, control mode, gains, current limits, command, compensation, brake and supply state frozen and published.",
      "comparisonBoundary": "A system-control result; never relabel as gear backlash or compare with a mechanically locked result."
    }
  ],
  "referenceTorqueRule": {
    "symbol": "Tref",
    "requiredDefinition": "Exact manufacturer continuous or rated output torque for the tested model, ratio, voltage, cooling and thermal condition.",
    "prohibitedSubstitutions": [
      "peak torque",
      "stall torque",
      "motor-side torque without ratio and efficiency boundary",
      "neighboring model or ratio"
    ],
    "missingRule": "Absolute-torque exploratory runs may be published, but they must not use the RCI-BLM-1 normalized-profile label when Tref is unavailable."
  },
  "baselineProfile": {
    "ambientTargetC": 20,
    "ambientToleranceC": 2,
    "minimumSoakMinutes": 60,
    "maximumHousingDriftCOver15Minutes": 0.5,
    "torqueLimitPercentTref": 10,
    "reportingTorquePercentTref": [
      -4,
      0,
      4
    ],
    "rampRatePercentTrefPerSecond": 1,
    "endpointDwellSeconds": 2,
    "preconditioningCyclesPerPosition": 3,
    "recordedCyclesPerPosition": 5,
    "requiredPositionsPerUnit": 3,
    "continuousAxisPositionsDeg": [
      0,
      120,
      240
    ],
    "limitedAxisPositionsPercentTravel": [
      10,
      50,
      90
    ],
    "minimumSampleRateHz": 100,
    "minimumUnitsForModelLevelStatement": 3,
    "maximumExpandedUncertaintyFractionOfReportedMetric": 0.2
  },
  "instrumentRequirements": [
    "Calibrated bidirectional output torque measurement at the tested flange.",
    "Independent external output-angle measurement; an internal motor encoder alone is not sufficient.",
    "Measured input or lock motion so fixture or lock compliance is visible.",
    "Synchronized torque and angle channels with time alignment documented.",
    "Ambient and housing temperature measurement at named locations.",
    "Calibration records and an uncertainty budget linked from the result."
  ],
  "mountingRequirements": [
    "Exact model, ratio, revision, lubrication, fasteners, bolt torque, adapter drawings and output datum are frozen before acquisition.",
    "Fixture stiffness is characterized separately. Uncorrected flange results remain public even when a correction is also calculated.",
    "Radial, axial and tilting loads are minimized or measured; a lever arm must disclose the bearing loads it introduces.",
    "The fixture is guarded and remains inside every manufacturer torque, bearing, temperature, voltage and current limit."
  ],
  "procedure": [
    {
      "step": 1,
      "name": "Freeze identity and boundary",
      "instruction": "Record the exact unit, ratio, revisions, test boundary, brake, servo, compensation, supply and Tref source before mounting."
    },
    {
      "step": 2,
      "name": "Calibrate and characterize the fixture",
      "instruction": "Zero synchronized channels, verify torque sign and angle sign, record calibration identifiers and measure input-lock or fixture motion."
    },
    {
      "step": 3,
      "name": "Stabilize temperature",
      "instruction": "Soak for at least 60 minutes at 20 ±2°C and continue until housing drift is no more than 0.5°C over 15 minutes."
    },
    {
      "step": 4,
      "name": "Set the first output position",
      "instruction": "Use 0°, 120° and 240° for a continuous axis, or 10%, 50% and 90% of declared safe travel for a limited axis."
    },
    {
      "step": 5,
      "name": "Precondition",
      "instruction": "Run three triangular cycles from −10% Tref to +10% Tref and back at 1% Tref/s; do not use them in the reported result."
    },
    {
      "step": 6,
      "name": "Acquire five cycles",
      "instruction": "Record five more complete ascending and descending triangular cycles at least 100 Hz, with a two-second dwell at each endpoint."
    },
    {
      "step": 7,
      "name": "Repeat positions",
      "instruction": "Repeat stabilization check, preconditioning and acquisition at the other two output positions without changing the declared boundary."
    },
    {
      "step": 8,
      "name": "Publish raw and summary data",
      "instruction": "Retain every sample and validity flag, calculate the four protocol metrics, publish the uncertainty budget and disclose every deviation."
    }
  ],
  "analysisRules": [
    "Use measured torque, not commanded torque, to interpolate branch angles at −4%, 0% and +4% Tref.",
    "Interpolate each monotonic branch independently. Do not average ascending and descending branches before calculating a gap.",
    "Do not delete outliers silently. Mark invalid samples and cycles with a reason and retain them in the raw release.",
    "Publish unfiltered raw data. Any filter used for a secondary result must state type, order, cutoff, phase behavior and software version.",
    "Do not subtract fixture compliance unless a linked blank or calibration record supports the correction; always publish the uncorrected result beside it.",
    "If expanded uncertainty exceeds 20% of the reported metric, label the result below_measurement_capability rather than publishing a precise comparison value."
  ],
  "metrics": [
    {
      "id": "h0_branch_gap",
      "label": "Zero-torque branch gap H0",
      "equation": "H0 = abs(theta_ascending(0) - theta_descending(0))",
      "meaning": "Direction-dependent zero-torque hysteresis width at the declared flange and test boundary."
    },
    {
      "id": "lm4_branch_gap",
      "label": "RCI low-torque lost-motion branch gap LM4",
      "equation": "LM4 = (abs(theta_ascending(+0.04*Tref) - theta_descending(+0.04*Tref)) + abs(theta_ascending(-0.04*Tref) - theta_descending(-0.04*Tref))) / 2",
      "meaning": "Mean separation of the two torque–angle branches at equal ±4% rated torque. This explicit RCI equation is not assumed equivalent to an undocumented vendor value."
    },
    {
      "id": "lm4_cycle_sd",
      "label": "Cycle repeatability of LM4",
      "equation": "sample standard deviation of valid cycle-level LM4 values",
      "meaning": "Within-position cycle variation; not robot pose repeatability."
    },
    {
      "id": "lm4_position_range",
      "label": "Position dependence of LM4",
      "equation": "max(position-mean LM4) - min(position-mean LM4)",
      "meaning": "Observed variation across the three required output positions."
    }
  ],
  "reportingRules": [
    "One tested unit supports only a unit-characterization statement. A model-level descriptive statement requires at least three physical units and still is not a production acceptance claim.",
    "Report every position and unit before any aggregate. Never publish only the best cycle, position or specimen.",
    "Servo-hold, unpowered-integrated and reducer-only results use separate comparison groups.",
    "Do not call H0 or LM4 robot accuracy, robot repeatability, dynamic transmission error or safety performance.",
    "A vendor number is comparable only when its hardware boundary, torque reference, branch equation, fixture, temperature, positions, cycles and uncertainty are equivalent and disclosed."
  ],
  "deviationPolicy": "A run with disclosed deviations may remain useful, but it must be labeled modified and cannot use the unqualified RCI-BLM-1 result label.",
  "maturityBoundary": "Version 0.1.0 is a public protocol ready for inter-laboratory review, not a physically validated standard. RCI will version corrections and publish round-robin evidence before calling the method validated.",
  "rawTemplateColumnCount": 40,
  "summaryTemplateColumnCount": 30,
  "rawColumns": [
    {
      "name": "protocol_id",
      "required": true,
      "description": "Must be RCI-BLM-1 for this protocol."
    },
    {
      "name": "protocol_version",
      "required": true,
      "description": "Protocol version used for acquisition."
    },
    {
      "name": "test_id",
      "required": true,
      "description": "Stable identifier for the complete test run."
    },
    {
      "name": "unit_id",
      "required": true,
      "description": "Pseudonymous stable unit identifier."
    },
    {
      "name": "manufacturer",
      "required": true,
      "description": "Manufacturer of the tested hardware."
    },
    {
      "name": "model",
      "required": true,
      "description": "Exact model and ratio or ordering code."
    },
    {
      "name": "serial_hash",
      "required": false,
      "description": "One-way serial-number hash when traceability is permitted without publishing the serial."
    },
    {
      "name": "hardware_revision",
      "required": true,
      "description": "Hardware, reducer and assembly revision."
    },
    {
      "name": "firmware_version",
      "required": false,
      "description": "Required for powered tests; otherwise not applicable."
    },
    {
      "name": "test_boundary",
      "required": true,
      "description": "One of the three protocol test-boundary identifiers."
    },
    {
      "name": "fixture_configuration_url",
      "required": true,
      "description": "Versioned fixture drawing, fastener, adapter and load-path record."
    },
    {
      "name": "axis_orientation",
      "required": true,
      "description": "Axis direction and gravity orientation."
    },
    {
      "name": "input_constraint_method",
      "required": true,
      "description": "Mechanical lock or servo-hold implementation and attachment point."
    },
    {
      "name": "input_angle_reference",
      "required": true,
      "description": "Sensor and physical point used to measure input or lock motion."
    },
    {
      "name": "brake_state",
      "required": true,
      "description": "Absent, released, engaged or other explicitly defined state."
    },
    {
      "name": "servo_state",
      "required": true,
      "description": "Unpowered, disabled or powered hold."
    },
    {
      "name": "control_mode",
      "required": false,
      "description": "Required for servo-hold tests."
    },
    {
      "name": "control_configuration_url",
      "required": false,
      "description": "Required for servo-hold tests; versioned gains, limits, command and compensation settings."
    },
    {
      "name": "compensation_state",
      "required": true,
      "description": "Backlash, friction, gravity and compliance compensation state."
    },
    {
      "name": "rated_torque_reference_nm",
      "required": true,
      "unit": "N·m",
      "description": "Exact continuous or rated output-torque reference Tref; never peak or stall torque."
    },
    {
      "name": "rated_torque_source",
      "required": true,
      "description": "Versioned source and condition for Tref."
    },
    {
      "name": "instrument_configuration_url",
      "required": true,
      "description": "Versioned torque, angle, temperature, synchronization and calibration-chain record."
    },
    {
      "name": "position_id",
      "required": true,
      "description": "Stable identifier for one of the three required output positions."
    },
    {
      "name": "output_position_deg",
      "required": true,
      "unit": "deg",
      "description": "Nominal output position relative to a marked datum."
    },
    {
      "name": "cycle_index",
      "required": true,
      "description": "Recorded cycle number; preconditioning samples use negative or zero indices."
    },
    {
      "name": "branch",
      "required": true,
      "description": "ascending, descending, dwell or transition."
    },
    {
      "name": "timestamp_s",
      "required": true,
      "unit": "s",
      "description": "Monotonic time from the start of acquisition."
    },
    {
      "name": "target_torque_percent_tref",
      "required": true,
      "unit": "% Tref",
      "description": "Normalized target torque."
    },
    {
      "name": "commanded_output_torque_nm",
      "required": true,
      "unit": "N·m",
      "description": "Commanded fixture or actuator output torque."
    },
    {
      "name": "measured_output_torque_nm",
      "required": true,
      "unit": "N·m",
      "description": "Calibrated output torque at the tested flange."
    },
    {
      "name": "measured_input_angle_deg",
      "required": true,
      "unit": "deg",
      "description": "Measured input or lock motion at the declared reference; use zero only when a calibrated channel actually measured zero."
    },
    {
      "name": "external_output_angle_deg",
      "required": true,
      "unit": "deg",
      "description": "Calibrated external output-flange angle; this is the primary angular reference."
    },
    {
      "name": "internal_motor_angle_deg",
      "required": false,
      "unit": "deg",
      "description": "Internal motor-encoder angle when available."
    },
    {
      "name": "internal_output_angle_deg",
      "required": false,
      "unit": "deg",
      "description": "Internal output-encoder angle when available."
    },
    {
      "name": "ambient_temperature_c",
      "required": true,
      "unit": "°C",
      "description": "Ambient temperature at each sample or joined by timestamp."
    },
    {
      "name": "housing_temperature_c",
      "required": true,
      "unit": "°C",
      "description": "Housing temperature at the declared measurement point."
    },
    {
      "name": "supply_voltage_v",
      "required": false,
      "unit": "V",
      "description": "Required for powered tests."
    },
    {
      "name": "bus_current_a",
      "required": false,
      "unit": "A",
      "description": "Recommended for powered tests; state not measured if absent."
    },
    {
      "name": "sample_valid",
      "required": true,
      "description": "true or false; never delete rejected samples from the published raw file."
    },
    {
      "name": "invalid_reason",
      "required": false,
      "description": "Required when sample_valid is false."
    }
  ],
  "summaryColumns": [
    {
      "name": "protocol_id",
      "required": true,
      "description": "RCI-BLM-1."
    },
    {
      "name": "protocol_version",
      "required": true,
      "description": "Protocol version used."
    },
    {
      "name": "test_id",
      "required": true,
      "description": "Stable test-run identifier."
    },
    {
      "name": "unit_id",
      "required": true,
      "description": "Pseudonymous unit identifier or ALL for a model aggregate."
    },
    {
      "name": "manufacturer",
      "required": true,
      "description": "Manufacturer."
    },
    {
      "name": "model",
      "required": true,
      "description": "Exact model, ratio and ordering code."
    },
    {
      "name": "test_boundary",
      "required": true,
      "description": "Test-boundary identifier."
    },
    {
      "name": "aggregation_scope",
      "required": true,
      "description": "cycle, position, unit or model."
    },
    {
      "name": "position_id",
      "required": false,
      "description": "Required for cycle and position rows."
    },
    {
      "name": "sample_unit_count",
      "required": true,
      "description": "Number of physical units represented."
    },
    {
      "name": "recorded_cycle_count",
      "required": true,
      "description": "Number of valid cycles represented."
    },
    {
      "name": "metric_id",
      "required": true,
      "description": "h0_branch_gap, lm4_branch_gap, lm4_cycle_sd or lm4_position_range."
    },
    {
      "name": "result_deg",
      "required": true,
      "unit": "deg",
      "description": "Uncorrected external-flange result."
    },
    {
      "name": "corrected_result_deg",
      "required": false,
      "unit": "deg",
      "description": "Optional fixture-corrected result; never replaces the uncorrected value."
    },
    {
      "name": "repeatability_sd_deg",
      "required": false,
      "unit": "deg",
      "description": "Standard deviation across valid recorded cycles."
    },
    {
      "name": "expanded_uncertainty_deg",
      "required": true,
      "unit": "deg",
      "description": "Expanded uncertainty U for the reported result."
    },
    {
      "name": "coverage_factor",
      "required": true,
      "description": "Coverage factor k used for expanded uncertainty."
    },
    {
      "name": "uncertainty_budget_url",
      "required": true,
      "description": "Public uncertainty-component table and calculation."
    },
    {
      "name": "fixture_correction_applied",
      "required": true,
      "description": "true or false."
    },
    {
      "name": "fixture_correction_reference",
      "required": false,
      "description": "Calibration or blank-fixture record when correction is applied."
    },
    {
      "name": "ambient_temperature_mean_c",
      "required": true,
      "unit": "°C",
      "description": "Mean ambient temperature."
    },
    {
      "name": "housing_temperature_start_c",
      "required": true,
      "unit": "°C",
      "description": "Housing temperature before the recorded cycles."
    },
    {
      "name": "housing_temperature_end_c",
      "required": true,
      "unit": "°C",
      "description": "Housing temperature after the recorded cycles."
    },
    {
      "name": "result_status",
      "required": true,
      "description": "reported, below_measurement_capability or invalid."
    },
    {
      "name": "limitation_notes",
      "required": true,
      "description": "Boundary, exclusions and deviations."
    },
    {
      "name": "raw_data_url",
      "required": true,
      "description": "Public immutable raw CSV."
    },
    {
      "name": "calibration_record_urls",
      "required": true,
      "description": "Pipe-separated calibration and traceability records."
    },
    {
      "name": "analysis_software_commit",
      "required": true,
      "description": "Immutable analysis-code commit or release identifier."
    },
    {
      "name": "analyst",
      "required": true,
      "description": "Responsible analyst or laboratory."
    },
    {
      "name": "analyzed_at",
      "required": true,
      "description": "ISO 8601 analysis timestamp."
    }
  ],
  "rightsNotice": "The RCI protocol structure, field definitions, equations and templates are original editorial work. Referenced standards and manufacturer documents retain their own rights. Linking or describing a public boundary does not reproduce or license the underlying document."
}