What Is GRR and MSA with TofuPilot
Gage Repeatability and Reproducibility (GRR) measures how much of your test variation comes from the measurement system itself. Measurement System Analysis (MSA) is the broader evaluation that includes GRR plus bias, linearity, and stability. This guide covers how GRR and MSA work, how to run a GRR study, and how to use TofuPilot data to monitor measurement system health.
Why Measurement Variation Matters
Every test measurement has three sources of variation:
| Source | What It Is |
|---|---|
| Part-to-part | Real differences between units (this is what you want to measure) |
| Repeatability | Variation when the same operator measures the same part multiple times |
| Reproducibility | Variation when different operators or stations measure the same part |
If your measurement system contributes too much variation, you can't trust your pass/fail decisions. Good units get rejected (false failures). Bad units pass (escapes).
GRR Acceptance Criteria
| GRR % of Tolerance | Assessment |
|---|---|
| Below 10% | Measurement system is acceptable |
| 10% to 30% | May be acceptable depending on application |
| Above 30% | Measurement system needs improvement |
GRR is expressed as a percentage of the specification tolerance. A GRR of 20% means the measurement system uses up 20% of your tolerance band with its own noise.
How a GRR Study Works
A crossed GRR study uses multiple operators, multiple parts, and multiple trials:
| Parameter | Typical Value |
|---|---|
| Operators (or stations) | 2-3 |
| Parts | 10 (spanning the range of production variation) |
| Trials per part per operator | 2-3 |
| Total measurements | 40-90 |
Each operator measures each part multiple times, in random order. The data is analyzed using ANOVA or the range method to separate repeatability and reproducibility.
Prerequisites
- Python 3.10+
- OpenHTF installed (
pip install openhtf) - TofuPilot Python SDK installed (
pip install tofupilot)
Step 1: Collect GRR Data
Run the same measurement on the same set of parts multiple times. Use TofuPilot to log every measurement with the part identifier and trial number.
import openhtf as htf
from openhtf.util import units
@htf.measures(
htf.Measurement("voltage_reading_V")
.with_units(units.VOLT),
htf.Measurement("operator").with_units(units.UNITLESS),
htf.Measurement("trial").with_units(units.UNITLESS),
)
def phase_grr_measurement(test):
"""Measure voltage for GRR study. Record operator and trial."""
test.measurements.voltage_reading_V = 5.003
test.measurements.operator = 1
test.measurements.trial = 1Step 2: Log to TofuPilot
Each measurement becomes a test run. The serial number identifies the part. Run each part-operator-trial combination as a separate test execution.
from tofupilot.openhtf import TofuPilot
test = htf.Test(phase_grr_measurement)
with TofuPilot(test):
test.execute(test_start=lambda: input("Scan GRR part serial: "))Step 3: Analyze the Results
After collecting all measurements, export the data from TofuPilot and compute the GRR metrics. The key calculations:
| Metric | Formula |
|---|---|
| Repeatability (EV) | Average range within operator x d2 constant |
| Reproducibility (AV) | Range of operator averages x d2 constant, corrected for sample size |
| GRR | Square root of (EV squared + AV squared) |
| GRR % | (GRR / tolerance) x 100 |
| Number of distinct categories (ndc) | (Part variation / GRR) x 1.41 |
An ndc below 5 means the measurement system can't distinguish enough categories of parts. You need at least 5 for a capable system.
Beyond GRR: Full MSA
MSA includes four additional evaluations beyond GRR:
| Study | What It Measures | When to Run |
|---|---|---|
| Bias | Difference between measured average and known reference | At calibration |
| Linearity | How bias changes across the measurement range | At calibration |
| Stability | How measurements drift over time | Ongoing monitoring |
| Resolution | Smallest increment the system can detect | At setup |
Using TofuPilot for Ongoing MSA
You don't need to run formal GRR studies constantly. TofuPilot's measurement distribution data gives you ongoing visibility:
- Measurement distributions for the same part number show total variation over time
- Station comparison shows whether different stations give different results (reproducibility signal)
- Control charts detect when measurement drift begins (stability monitoring)
- Marginal results flag when measurements are close to limits, which could indicate measurement system issues rather than part issues
When you see unexpected variation in TofuPilot, run a formal GRR study to quantify the source. If the measurement system is the problem, recalibrate or upgrade the instrument before tightening limits.