3D visionHow-to

Short-range camera hand-eye calibration target and standoff

Size the calibration target and standoff for a wrist-mounted short-range depth camera: 90 x 60 mm board, 100-120 mm standoff, 12-20 poses, verified to 1-2 mm.

LumaSpec Vision12 min read Share on LinkedIn

On this page 10 sections
  1. 01The decision, up front
  2. 02Set the standoff from depth error and the minimum distance
  3. 03Size the board to half the frame
  4. 04Build the target: rigid, matte, fixed
  5. 05Dry-run the rig on a stand
  6. 06Capture the wrist poses
  7. 07Verify before you trust the transform
  8. 08Where long-range advice goes wrong
  9. 09Quick checklist
  10. 10Questions

Short-range stereo depth modules invert the usual hand-eye advice. The habits that work at a 2 m standoff — a large board, mostly level poses, 25 captures or more — fail at 100 mm, where the module's minimum distance and the board's own tilt set the limits. This guide is for anyone mounting a close-range depth camera on a robot wrist for assembly, scanning or small-part picking. You will size the target to the depth field of view, set a standoff that keeps depth error small, plan a pose set that constrains the transform, and check the result before trusting it. The numbers assume the common short-range stereo class: 87° x 58° depth field of view, 1280 x 720 depth output, a 70-500 mm working range with a 70 mm minimum at 480p, and ±1.4% depth error at 200 mm. Substitute your module's figures and the same method holds.

The decision, up front

For a wrist-mounted short-range stereo module, calibrate like this:

  • Standoff: 100-120 mm from the module face to the board, read from the module's own depth image. Hard floor: 85 mm on a module with a 70 mm minimum distance.
  • Target: rigid, matte ChArUco board about 90 x 60 mm — half the frame width at 100 mm on an 87° x 58° module.
  • Grid: 7 x 5 squares, printed at 100% scale, pitch measured and entered as measured.
  • Poses: 12-20 captures with tilts to ±30° about two axes, standoff swept over 90-130 mm, lateral spread ±40 mm.
  • Acceptance: corner residuals under 1 px and a five-orientation touch-off within 1-2 mm.

The next six sections derive each number; the last two turn them into checks you can run in an afternoon.

Set the standoff from depth error and the minimum distance

Stereo depth error grows with the square of the distance. With pixel-level disparity noise held fixed, the error at standoff Z scales from any known point:

δZ(Z) = δZ(Z0) · (Z / Z0)²

The module class covered here publishes ±1.4% depth error at 200 mm, which is ±2.8 mm. Anchoring the curve there gives:

Standoff (mm) Depth error (± mm) Share of the 200 mm error
90 0.6 20%
110 0.8 30%
130 1.2 42%
150 1.6 56%
200 2.8 100%

The 110 mm row checks as 2.8 x (110 / 200)² = 2.8 x 0.303 = 0.85 mm. Calibrating at 110 mm instead of 200 mm removes about 70% of the depth-error contribution before any other improvement.

The floor is the minimum depth distance: 70 mm on this class. Hold the standoff at 1.2x the minimum — 85 mm — because a tilted board brings its near edge closer than its centre, and the near field is where disparity turns unstable and depth starts dropping out. That failure mode is what close range depth dropout on fuzzy surfaces and thin parts and depth scale mismatch: why your point cloud is cut off at close range look like in practice.

Decision: 100-120 mm. It clears the 85 mm floor, holds depth error to 0.6-1.0 mm, and sits well inside the 70-500 mm working range. The same trade at longer ranges is covered in the 3D camera working distance and positioning guide.

Size the board to half the frame

Frame size at the standoff follows from the depth field of view:

W = 2 · Z · tan(FOV_h / 2) H = 2 · Z · tan(FOV_v / 2)

Worked example at Z = 100 mm with the 87° x 58° module:

  • W = 2 x 100 x tan(43.5°) = 200 x 0.949 = 190 mm
  • H = 2 x 100 x tan(29°) = 200 x 0.554 = 111 mm

Half the frame width is 95 mm, so pick the nearest practical print: 90 x 60 mm. The 3:2 aspect matches the frame's 87:58, the board covers 47% of the width and 54% of the height, and at 1280 pixels across 190 mm it spans 1280 / 190 x 90 = 606 px. A 7 x 5 ChArUco grid on that board gives squares of 90 / 7 = 12.9 mm, about 87 px each — well above the 40 px per square below which corner localisation noise starts to dominate.

The half-fill target is not arbitrary; it buys exactly the margins the pose set needs:

  1. Tilt margin. A board tilted by θ puts its near edge at Z − (w/2)·sin θ. With w = 90 mm at Z = 100 mm, a 45° tilt drops the near edge to 100 − 45 x 0.707 = 68 mm, under the 70 mm minimum. Limit tilts to ±30° at 100 mm (near edge 77.5 mm) or move to 110 mm standoff for ±45° poses (near edge 78 mm).
  2. Lateral sweep. The ±40 mm translation spread shifts the board centre 40 mm, putting the near edge 45 + 40 = 85 mm from frame centre against a 95 mm half-frame. Still inside.
  3. Detector background. Matte, uncluttered surroundings around the board give the detector the contrast to find and order the squares.

Print at 100% scale, then measure the pitch across the full grid with calipers and enter the measured value; a 2% shrink is a common office-printer result, and its effect on the solve is covered in checkerboard camera calibration error: fix the grid pitch. For marker layout and how board dimensions feed the pose result, see ChArUco board dimensions pose: diagnose distance errors; the size-versus-distance trade behind the half-width rule is in checkerboard calibration fails at distance: depth camera target size.

Build the target: rigid, matte, fixed

Corner accuracy at 100 mm stands or falls on board flatness. Glue the print to an aluminium tooling plate or stiff composite board with spray adhesive and check it with a straightedge: keep flatness under 0.2 mm across the board, the same order as the 0.6-1.0 mm depth error you calibrated to. Matte print or matte spray only; the module's own projector supplies the texture, so the board needs no help from gloss.

Fix the board to the table, not to the wrist: eye-in-hand means the target stays still while the camera moves. Keep room lighting moderate and diffuse — a hard spotlight across the board lays shadows that read as false edges. The capture-side details, including which stream to record, are laid out in stereo depth camera calibration: target capture and stream setup.

Dry-run the rig on a stand

Run the whole capture script on the bench first, module on a stand and board below it. Every corner-detection and dropout problem shows up in ten minutes there instead of one robot hour on the wrist.

For the bench rig, clamp the module above the board on a slide-table stand so height and tilt are the only variables between tests.

Camera standsMachine vision camera stand, professional slide-table type, height 700 mm, 400 x 450 mm base (LS-MNT-0040)LS-MNT-0040
Type
Camera stands
$629.00View partBuild a system with it

The LS-MNT-0040 slide-table stand carries a 700 mm column and a 400 x 450 mm base, enough to mount the module head and clamp a board plate beside it.

Then give the board its own motion: a manual tilt stage underneath, with a small rotary table for in-plane sweeps.

Camera standsSlope-angle slide, manual tilt stage (LS-MNT-0001)LS-MNT-0001
Type
CCD camera stand and positioning stage (LS-MNT-S01)
$339.00View part
Camera standsManual XY + rotation stage, 60 mm, dia. 60 mm base (LS-MNT-0220)LS-MNT-0220
Type
Rotary stages
$269.00View part

At each tilt step, confirm all four corners still detect and the depth map on the board face stays solid. The sweep finds your real tilt budget — the point where corners drop or the near edge reads the minimum distance is the limit to enforce in the robot pose list.

Capture the wrist poses

  1. Fix the board. Clamp the target plate to the table and read the module's depth at all four corners of the board; if they differ by more than 0.2 mm, re-flatten before capturing.
  2. Check intrinsics first. The hand-eye solve inherits every intrinsics error, so fix the camera model first — the order of operations is in camera intrinsics for hand-eye calibration: fix the pose first.
  3. Set the first pose. Bring the board centre to 110 mm from the module face, read from the depth image, with the board filling about half the frame.
  4. Sweep standoff. Spread captures over 90-130 mm in steps of about 20 mm.
  5. Sweep lateral. Move ±40 mm in X and Y so the board visits each quadrant of the frame.
  6. Tilt. Add tilts up to ±30° about two different axes. Include ±45° poses only where the standoff is 110 mm or more, per the near-edge check above.
  7. Settle and save. Wait 1 s at each pose before saving, and pair every image with the controller-recorded flange pose, not the taught command pose.
  8. Count. Stop at 12-20 poses. Below 10, the least-squares solution gets sensitive to single noisy captures; past 20, gains flatten unless the extra poses add tilt variety.

Solve on the depth stream you run at runtime. The depth field of view is narrower than the colour field of view on stereo modules — depth image field of view: why stereo coverage is smaller explains the geometry — so a board framed in colour can lose corners in depth.

For the robot side, which wrist positions to visit and in what order, follow eye in hand calibration pose selection: robot positions that work. If you build the pose list in an offline robot-programming tool, this offline hand-eye calibration walkthrough shows the flange-pose export end to end.

Verify before you trust the transform

Three checks, in order:

  • Residuals. Average corner reprojection residual under 1 px. A few poses carrying outliers are your tilt-limit violators; drop and replace them.
  • Stability. Re-solve with half the pose set. The camera-to-flange transform should stay within 0.5 mm and 0.1° of the full-set result; a bigger jump means the pose set lacks rotation diversity, not that you need a different solver.
  • Touch-off. Mount a pointer tip in the gripper, touch one fixed reference point from five wrist orientations and record the reported point each time. On a rigid wrist rig calibrated at 100-120 mm, the five touches should agree within 1-2 mm.

A result 10-20 mm out is process, not math: nominal instead of measured pitch, a solve on the wrong stream, or captures with the board too close to the minimum distance. The diagnosis is walked through in hand-eye calibration translation error: is 1-2 cm normal?, and the full test protocol is in hand-eye calibration accuracy verification: test before you trust it.

One rule carries into production: the camera-to-flange transform does not change with distance, but the depth error budget does, so take depth measurements inside the band your budget covers. If a moved camera makes every reading shift by the same offset, the camera standoff distance calibration mismatch fix is the reference for that diagnosis.

Where long-range advice goes wrong

  • Fill 80-90% of the frame. Right at 500 mm, wrong here: an 80%-wide board at 100 mm standoff measures 152 mm across, and tilted 30° its near edge sits at 100 − 76 x 0.5 = 62 mm — under the minimum. Half-fill is the tilt and sweep margin.
  • More poses beat better poses. Thirty near-level captures constrain less than 14 with ±30° tilt about two axes. Rotation separates the translation components of the transform; spend robot time on tilt, not repeats.
  • Calibrate from the colour image, it is sharper. The robot runs on depth, so the solve must too. Solving on colour folds the colour-to-depth offset into the transform, and sharper corners in the wrong frame are still wrong.

Quick checklist

Target

  • Rigid backing, flat within 0.2 mm across the board
  • Matte print or matte spray, no gloss lamination
  • 90 x 60 mm, 7 x 5 ChArUco, for an 87° x 58° module at 100 mm; rescale by the half-width rule for other fields of view
  • Pitch measured with calipers, entered as measured

Standoff

  • 100-120 mm, read from the module's depth image at board centre
  • Never below 85 mm on a 70 mm-minimum module
  • Tilt budget: ±30° at 100 mm, ±45° from 110 mm

Poses

  • 12-20 captures; standoff 90-130 mm; lateral spread ±40 mm
  • Tilts about two axes; all four board edges inside the frame in every pose
  • 1 s settle before each save; flange pose from the controller, paired with the image

Acceptance

  • Corner residuals under 1 px average
  • Half-set re-solve within 0.5 mm and 0.1° of the full set
  • Five-orientation touch-off within 1-2 mm

That is the whole job: a board half the frame wide, 100-120 mm of standoff, a dozen tilted poses, and a touch-off that proves it. Pick the bench hardware from the camera stands category or spec the whole rig through the stand configurator; sensor options sit in the 3D sensors category and the camera finder. More on the surrounding workflow is under the 3D vision guides, and if you want a second pair of eyes on your pose set, reach us through the contact page — free expert support comes with every order.

Questions

How big should the board be at a 150 mm standoff?

Keep the half-frame rule: at 150 mm an 87° x 58° module frames 285 x 166 mm (2 x 150 x 0.949 = 285 mm), so a 140 x 90 mm board fills about half. Depth error rises to about ±1.6 mm at that standoff against ±0.8 mm at 110 mm, so choose 150 mm only when the wrist cannot reach closer without colliding.

Can I use a paper print as the calibration target?

Yes, mounted rigidly. Glue the print to an aluminium or composite plate, check flatness with a straightedge (under 0.2 mm across the board) and print at 100% scale. Then measure the grid pitch across the full board with calipers and enter the measured value — office printers commonly shrink output by 1-2%, which at a 100 mm standoff is the same order as the depth accuracy you are trying to achieve.

Why do tilt poses matter so much at short range?

Tilt is what separates the camera's offset along its optical axis from its X-Y offset. A pose set of level, straight-on views constrains pointing well but leaves the along-axis component entangled with standoff error, so the solved transform swings by millimetres. Tilts of ±30° about two different axes, spread across the set rather than repeated in every pose, pin all three translation components.

Which stream should the hand-eye solve use?

The one the robot uses at runtime, which for short-range manipulation is almost always depth. The depth field of view is narrower than the colour field of view on stereo modules, so a board fully visible in colour can lose corners in depth, and solving on colour folds the colour-to-depth offset into the camera-to-flange transform. Mixed-stream solves are a common source of several-millimetre errors.

My solved transform moves every time I add poses — what is wrong?

Instability of that kind points at pose geometry, not the solver. Check three things: all four board edges inside the frame in every capture, tilts spread across at least two axes instead of repeated flat views, and the standoff staying above 85 mm on a 70 mm-minimum module. If it is still unstable after 12-20 well-spread poses, re-measure the board pitch before adding captures.