You have run the solver, it converged, and the reprojection error looks small. That number tells you the target was detected well; it does not tell you the robot will hit the part. A hand-eye or static-camera calibration is only as good as the worst station in the working volume, and rotation error hides from residuals taken near the calibration poses. This guide gives you the verification test to run before trusting any camera-to-robot transform: hold poses out of the solver, re-project a fixed target through the chain into robot base frame, and read the scatter in millimetres. You get the pass numbers — 0.5 px RMS residual, one quarter of the pick tolerance in base-frame scatter — the pose design that exposes rotation error, and a worked example for a ±1.0 mm pick.
The decision, in four numbers
Trust the transform only when all four of these pass at the same time:
| Metric | Pass | Fail |
|---|---|---|
| RMS reprojection residual over the calibration poses | under 0.5 px | over 0.5 px |
| Worst single-pose residual | under 1.0 px | over 1.0 px |
| Held-out base-frame scatter, at every station where picks happen | 0.25 × pick tolerance or less | more than 0.25 × tolerance |
| Two independent runs with different pose sets | agree within 0.25 × tolerance | differ by more |
The quarter rule is a budget decision, not physics: robot repeatability, gripper play and part presentation also spend the tolerance, so vision gets a quarter and the mechanics keep the rest. For a ±1.0 mm pick the calibration budget is 0.25 mm at the work plane, and that number — not a pixel count — is what you verify.
The residual thresholds have a basis. Sub-pixel corner detection on a printed checker or ChArUco target is typically accurate to 0.1–0.3 px, so an RMS above 0.5 px points at detection, focus or target quality rather than solver noise. Residuals on their own are still a weak signal: what they do and do not measure is covered in camera extrinsic calibration accuracy beyond reprojection error, and the split between average and worst pose in camera calibration residual values: average and max targets.
Two errors, two signatures
A translation error shifts everything the same way: every held-out pose reports the target displaced in the same direction, and parts miss by the same amount wherever they sit. A rotation error is quiet near the calibration poses and loud far away, because an angle turns into lateral error in proportion to distance:
θ is in radians, d is the distance from the point the rotation is wrong about, and e is the lateral error it causes. An error of only 0.05° (0.87 mrad) gives 0.26 mm at 300 mm and 0.70 mm at 800 mm — the same calibration misses nearly three times as hard at the far end of the rail. Residuals are measured where d is small, which is exactly why they cannot see this.
The held-out test, in robot base frame
- Calibrate on at least 10 poses and keep at least 5 back. The solver never sees the held-out set.
- Fix the target rigidly. Eye-in-hand: the target is bolted in the cell and the camera rides the wrist, so you chain T_base_target = T_base_flange × T_flange_cam × T_cam_target at each held-out pose. Eye-to-hand: the target rides the wrist and you compute the camera-to-base transform at each held-out pose instead — it must come out identical every time, as shown in eye-to-hand calibration: verify the camera-to-base result.
- Read the target's base-frame position at every held-out pose, take the mean, and record the largest deviation of any single pose.
- Pass when that largest deviation stays at or under 0.25 × your pick tolerance, tested at both the nearest and the farthest pick station.
The metric is in millimetres at the robot, not pixels at the camera, so it folds intrinsics, lens mount, TCP and solver error into the one number the gripper will feel. Then run the whole calibration a second time with a different pose set: the two transforms should agree within the same quarter tolerance.
Worked example: a ±1.0 mm pick with a 12 MP camera
The example camera is the LS-CMR-0166, a 12 MP USB3 camera with 4000 × 3000 resolution and a rolling shutter. The field of view at the work plane is 400 mm × 300 mm.
Scale: 400 mm ÷ 4000 px = 0.10 mm per pixel. The ±1.0 mm tolerance spans 10 px, and the 0.25 mm calibration budget is 2.5 px.
Residuals on the 12 calibration poses come out at 0.32 px RMS with a worst pose of 0.61 px — both pass. In work-plane units the RMS is 0.32 px × 0.10 mm/px = 0.03 mm.
Held-out test at five poses near the calibration volume:
| Held-out pose | x (mm) | y (mm) | z (mm) |
|---|---|---|---|
| 1 | 512.31 | -88.02 | 105.44 |
| 2 | 512.44 | -88.15 | 105.36 |
| 3 | 512.18 | -88.08 | 105.51 |
| 4 | 512.40 | -87.94 | 105.30 |
| 5 | 512.25 | -88.11 | 105.40 |
| Mean | 512.32 | -88.06 | 105.40 |
The largest deviations from the mean are x on pose 3 at 512.18 - 512.32 = -0.14 mm, y on pose 4 at +0.12 mm and z on pose 3 at +0.11 mm. The worst is 0.14 mm against a 0.25 mm budget: pass, with a 1.8× margin.
Far-corner test: the same target observed from a station 600 mm outside the calibration volume lands 0.90 mm off. That fails. The implied rotation error is θ = 0.90 mm ÷ 600 mm = 1.5 mrad = 0.086°, and passing at that distance would need θ ≤ 0.25 ÷ 600 = 0.42 mrad = 0.024°.
Decision: do not ship. The transform is good at the volume centre and wrong at the corner. Recalibrate with more orientation spread between the poses, then rerun both held-out tests; the pose geometry that teaches a solver rotation is laid out in eye in hand calibration pose selection: robot positions that work.
The camera behind these numbers:
- Sensor format
- 1/1.7"
- Interface
- USB3
- Resolution
- 12 MP
- Shutter
- Rolling
Millimetres per pixel set the floor
You cannot verify a tolerance the camera cannot see. Hold the scale to at least 10 px across the tolerance:
For a ±1.0 mm pick that means 0.10 mm per pixel or finer, and 400 mm over 4000 px lands exactly on it. Run your own field of view and tolerance through the camera resolution calculator, then pick hardware from the area scan cameras category or the camera finder.
More pixels buy translation accuracy only. Rotation accuracy comes from pose diversity, so a high-resolution camera with clustered poses verifies worse than a modest one with a wide orientation spread. Shutter choice matters when anything moves during capture: a rolling shutter biases corners whenever the robot or part is still travelling, so stop before each exposure — or use a global-shutter model such as the MV-CU020-90GC, a 2.5 MP GigE camera with a global shutter and a C-mount, which reads every row at once.
- Sensor format
- 1/1.7"
- Lens mount
- C-mount
- Interface
- GigE
- Resolution
- Up to 3 MP
Poses that expose rotation error
Design the held-out set with the same care as the calibration set:
- At least five poses, spread over the real pick volume, including the nearest and the farthest station. Verification in the convenient centre tests nothing.
- A distance span of at least 1.5:1 between nearest and farthest held-out pose, so rotation error has room to grow into.
- Orientation spread to match the calibration set: at least 30° between the most different orientations, in both sets.
- The target filling a quarter to half of the frame. A target occupying a sliver of the image delivers corner positions no better than a few tenths of a pixel, and that noise lands directly in your scatter.
- Robot stationary, exposure short. Trigger after the axes settle; smear during readout biases corners systematically.
Two rig details belong to verification rather than the solver. The target must stay flat and rigid — camera calibration target flatness: when paper is enough draws the line — and when the camera rides the wrist, the flange frame you log must be the real tool frame, as robot-held camera calibration with a TCP tool frame explains.
Checks before you sign it off
- Residuals under 0.5 px RMS and 1.0 px worst pose, with no single pose dominating the total.
- Held-out scatter at or under 0.25 × tolerance, measured at both ends of the pick volume.
- Two independent runs agreeing within 0.25 × tolerance.
- Focus ring locked and bracket torqued after the final run: a bumped lens invalidates the intrinsics the transform was built on.
- Cable strain-relieved and connectors locked: a dragging cable that tugs the bracket shows up later as drift, and the frame-level shake it causes is what detecting camera vibration with OpenCV frame tracking catches.
- A routine re-check in place — one reference target, one minute — described in robot cell vision recalibration with one reference target.
Run the first live verification moves at reduced speed with the cell guarding closed: the transform may be wrong, and catching that is the point of the test.
When residuals look fine but picks miss
| Symptom in production | Most likely cause | Fix |
|---|---|---|
| Parts miss by the same amount everywhere | Constant translation error, or a wrong target offset in the gripper frame | Re-measure the gripper-to-target offset, then compute picks as in use eye-to-hand calibration results to compute robot-base picks |
| Miss grows toward the volume corners | Rotation error, e = θ × d | Recalibrate with more orientation spread and re-test the far corner; the signature is diagnosed in vision pick error under rotation: diagnose position drift |
| Only moving parts miss | Rolling-shutter distortion or motion blur | Stop the robot before capture, or switch to a global-shutter camera |
| Started after the camera or cell was bumped | The static-camera transform no longer matches the mount | Recalibrate; the drift mechanism is in static camera calibration accuracy: why moved parts drift off target |
| Good on Monday, off by Friday | Thermal focus drift or bracket creep | Diagnose with camera focus drift with temperature: diagnose daytime blur |
A rig that holds the number
A verified transform stays verified only while the hardware stands still. For a static camera, mass and a wide base beat a cantilevered bracket: the LS-MNT-0040, a professional slide-table machine vision stand of height 700 mm on a 400 × 450 mm base, is the class of mount that keeps a static camera where you left it. Browse camera stands for the size that fits your cell.
- Type
- Camera stands
Cabling finishes the rig. For the USB3 example camera on a moving arm, the LS-CBL-0219 is a 3 m USB3.0 camera cable, high-flex for drag-chain routing; across the cell to a GigE camera, the LS-CBL-0117 is a 15 m RJ45 camera data cable with a locking stud. Locking connectors matter as much as the stand: an intermittent link drops frames mid-calibration and the residuals then tell you nothing. The rest of the cables category covers the power and I/O leads.
- Type
- Camera data cables
- Length
- 15 m
When the held-out numbers pass at both ends of the volume, publish the result the way the robot will consume it — publish eye-to-hand calibration as a static camera transform — and start the hardware at the camera step. More system-integration write-ups sit on the systems topic page, and if the tolerance math will not close, ask for a quote with your field of view and pick tolerance attached.
The configurator matches a camera, lens, light, light controller and cables to each other, step by step, and lists only parts that fit what you already picked.
Questions
What reprojection error is acceptable after hand-eye calibration?
Hold RMS under 0.5 px and the worst pose under 1.0 px on the calibration set. Sub-pixel corner detection is typically good to 0.1-0.3 px, so a worse number points at detection, focus or target trouble rather than solver noise. One check the residual table does not give you: remove the worst pose and recalculate; if RMS falls by more than a fifth, that pose is corrupting the fit and you should recalibrate without it.
How many poses should be held out to verify the calibration?
Five is the minimum; ten is comfortable. Held-out poses do not improve the calibration, they only measure it, so extra poses buy confidence in the worst-case number, not accuracy. Spread matters more than count: five poses across the volume corners and both distance extremes tell you more than twenty clustered beside the calibration target.
Why does the calibration pass at the target but miss at the far corner?
Rotation error, which scales with distance: e = θ × d. You can measure the angle in the cell without recalibrating: observe one fixed target from two held-out stations at different distances, then divide the error growth by the distance between them. An error that grows from 0.10 mm at 350 mm to 0.55 mm at 800 mm gives θ = 0.45 mm ÷ 450 mm = 1.0 mrad, and that angle is what recalibration has to remove.
Can I verify with the same poses the solver used?
No. The solver fits the poses it saw, so residuals there keep falling while real error stays put. Keep at least five poses out of the solve, or split one data session in half and swap roles: calibrate on the first half and verify on the second, then run it the other way round. Two transforms from the two halves that agree within a quarter of your tolerance are strong evidence the result holds.
How much of my tolerance should the calibration be allowed to use?
Budget a quarter of the pick tolerance for the camera-to-robot transform and keep the rest for robot repeatability, gripper play and part presentation. For a ±1.0 mm pick that is 0.25 mm of base-frame scatter. Small six-axis industrial arms typically quote repeatability between 0.02 mm and 0.10 mm, so a quarter for vision leaves the mechanics most of the budget.
Do more megapixels make hand-eye calibration more accurate?
They improve translation only, by shrinking millimetres per pixel; the rule of ten pixels across your tolerance sets the resolution you need, and anything finer is spare. Rotation accuracy comes from orientation spread between poses, so a 12 MP camera with clustered poses misses at the volume corners where a camera with a quarter of the pixels and 40° of spread holds. Buy pixels for the tolerance, buy pose diversity for the angles.




