Your hand-eye calibration finds the marker in every frame, draws the overlay exactly on the printed squares, and publishes the handeye_target frame relative to camera_color_optical_frame — yet the robot still reaches into empty space. Before blaming the solver, look at two boxes on the Target tab of MoveIt's hand-eye calibration panel: measured marker size (m) and measured separation (m). They usually arrive prefilled with 0.2 m and 0.02 m, which describe a board about a meter across. A sheet run through an office printer is a fraction of that, and printing itself rescales the design. This guide shows what a wrong entry does to the pose, how to measure the printed target and enter it, and how to prove the result with a tape measure before the first robot move.
What a wrong pose looks like
The signature is consistent. Detection works: the overlay sits on the printed squares. Publishing works: handeye_target appears in the TF tree. The rotation reads plausibly. What fails is distance — the translation puts the board several times farther from camera_color_optical_frame than a tape measure says, always by about the same factor. That is the fingerprint of a scale error, and the scale lives in the size fields.
Two neighbors fail differently. If the frame never appears at all, the fault sits upstream of the solver: work through the missing target frame checks. If the error is a clean factor of 1000, you are in meters-versus-millimeters territory and the size fields are probably right.
Cause 1: the size fields still hold their defaults
Pose estimation needs a ruler. For each pose, the detector measures the marker's span in pixels; converting that span to meters requires the marker's true side length, which no camera can know. That is the entire job of the measured marker size (m) box: it is the ruler the solver applies to every detection. The measured separation (m) box scales the gaps between neighboring markers, fixing the board's internal geometry.
The boxes ship prefilled with 0.2 m and 0.02 m. Four 0.2 m squares plus three 0.02 m gaps already span 4 × 0.2 + 3 × 0.02 = 0.86 m, so the defaults describe a board most desks cannot even hold. Enter 0.2 m for a marker that measures 0.060 m and every camera-frame translation comes out 3.3 times too long, while the rotation barely moves, because rotation carries no scale. The entered length also fixes the unit convention of the returned pose — tvec comes out in the unit of the marker length — so one stale number skews scale and units together. Nothing in the output flags any of it: the solver cannot know what your ruler says.
Cause 2: the printer rescaled the target
The generator behind Save or Print writes an image at the pixel dimensions you requested; from there the image viewer, the print dialog and the driver decide physics. Fit-to-page is the usual culprit. A board designed at 0.86 m across lands near 0.28 m wide on landscape A4 with normal margins — roughly a third of the plan — and anyone who then assumes the requested 0.2 m, or simply leaves the default, stacks a second error on the first.
The counter-measure costs one minute. Measure one black square edge to edge with a ruler, in millimeters, and measure one white gap the same way. Measure the sheet that came out of the printer, not the design, and measure again after any reprint, because a different printer or driver shifts the result.
Cause 3: when the sizes were right all along
Measured and entered correctly, and the pose still lands off? Work down this list; each item carries a direct test.
- Stale camera intrinsics. A zoom change, a refocus or a swapped lens invalidates the camera model the solver builds on. Redo the intrinsics first — the pose-first intrinsics workflow covers the order — and judge the result against the usual average and max residual targets.
- A curved board. Paper curls bow the corner positions outward. Glue the sheet to foam board or aluminum and sight across it edge-on; a flat board shows no daylight under a straightedge.
- Blurry captures. A moving arm plus a long exposure smears the marker edges. Freeze the pose, capture, then move; the saved-robot-poses workflow builds the dataset exactly that way.
- A marker too small in frame. Pose precision falls with the marker's pixel span. Estimate the span from field of view and resolution with the pixel-size method, and aim for a few hundred pixels per marker side at the working standoff. If the board cannot fill the view, the target sizing guide sets the size from the poses you need, and the short-range target and standoff guide covers tight geometries.
- Too little pose variety. Poses clustered around one tilt leave one axis unsolved; the pose-selection guide lists robot positions that separate the axes.
Worked example: a 60 mm marker entered as the 0.2 m default
One printed board, one stale box — here is the whole failure in numbers.
- Target: a 4 × 3 grid of ArUco markers on landscape A4 (297 × 210 mm).
- Ruler readings: marker side 60 mm = 0.060 m; white gap 12 mm = 0.012 m.
- Fields as found: measured marker size (m) = 0.2, measured separation (m) = 0.02.
- Test standoff: tape-measured 0.40 m from camera to board.
- Color stream: 1920 px wide; at 0.40 m the view covers about 300 mm across — a typical wide module; the exact value moves the pixel count, not the conclusion.
Scale: 0.2 m ÷ 0.060 m = 3.33. The gap points the same way: 0.02 m ÷ 0.012 m = 1.67.
Distance: the tape says 0.40 m, so the solver reports 0.40 m × 3.33 = 1.33 m — an overshoot of 0.93 m along the viewing ray, while the rotation lands near-correct because scale never touches it.
Pixels: 1920 × (60 mm / 300 mm) = 384 px per marker side. The detection is healthy; only the meter conversion lies.
Decision: read the published frame's standoff and compare it with the tape. One constant ratio between the two — 3.33 here — convicts the size fields. Enter 0.060 and 0.012, recapture, and require the reported standoff to match the tape within about 2%, which is 8 mm at 0.40 m, before trusting the frame. If the constant ratio survives re-entry, re-measure the sheet; if the ratio scatters, move to intrinsics and capture quality.
Size the camera so your own marker gets enough pixels:
Fix: measure, enter, recapture
- Print or reuse the sheet with fit-to-page off and scale at 100%. Treat the requested size as a cross-check only.
- Lay a ruler across one black square, inside edge to inside edge, in millimeters. Measure a second square to confirm; the two should agree within a millimeter.
- Measure the white gap between two adjacent squares the same way. A single-marker target has no gap, so only the size field applies.
- Convert to meters — 60 mm becomes 0.060 m — and type the values into measured marker size (m) and measured separation (m). Three decimals make a dropped digit visible.
- Recapture the dataset with the board flat and the arm still between shots.
- Solve, then run the checks in the next section before any robot motion.
Prove the frame before the robot moves
- Two-standoff ratio test. Read the published frame's distance at two tape-measured standoffs, say 0.20 m and 0.60 m. Divided by the tape values, both ratios must sit near 1.0. A shared constant other than 1.0 is a size entry; scattered ratios point at intrinsics or blur.
- Residual check. After re-solving, compare the solver's residual with the targets you used for the intrinsics run; a solve that is markedly worse needs a cause before the robot moves.
- Touch-off test. Command the arm to the published target origin and measure the gap at the tool with a ruler; single-digit millimeters at bench distances is a pass.
- Runtime check. Push a known object through the runtime object-pose flow and confirm the result lands where the tape says.
Keep it from coming back
- Write the measured sizes on the back of the board in pencil. The number travels with the target, and any reprint gets re-measured instead of assumed.
- Glue the sheet to flat stock — foam board or aluminum. Curl biases the corner detections and no software sees it.
- Give the camera and the board fixed mounts so the standoff repeats across the dataset. The LS-MNT-0040 slide-table stand gives 700 mm of column height on a 400 x 450 mm base, which holds the geometry while you work through the poses:
- Type
- Camera stands
- Change the viewing angle deliberately between captures instead of nudging the clamp by eye; the LS-MNT-0001 tilt stage slopes the board shot by shot:
- Type
- CCD camera stand and positioning stage (LS-MNT-S01)
- Lock the optics: no zoom, refocus or lens swap between the intrinsics run and the dataset, or start the intrinsics over.
- Store the measured sizes next to the dataset, so whoever re-solves it later knows which ruler produced it.
Parts and where to go next
A calibration bench reduces to a camera, a rigid target and two mounts that do not move. Cameras for marker-based hand-eye work sit in the 3D sensors category; slide tables, tilt stages and brackets live under camera stands. The stand step of the system configurator narrows mounts by height and stage type, and the 3D topic page collects the rest of the hand-eye guides. If a standoff or a board size has you stuck, send us the numbers and we will run the arithmetic with you.
Questions
Do the size fields control how large the target prints?
No. Saving or printing a target writes an image at the requested pixel dimensions, and the driver's dots-per-inch setting turns those pixels into paper: a 960 px square at 100 dpi prints about 244 mm wide, and the same file at 200 dpi prints half that. The size fields only tell the solver what to assume after the sheet is out. So print, measure a square with a ruler, then enter the measured value; even at 100% scale, confirm one marker.
How accurate does the ruler measurement need to be?
To the nearest millimeter is plenty. Distance error equals size error, so a 1 mm slip on a 60 mm marker is a 1.7 percent scale error — about 7 mm on a 0.40 m standoff. Measure one marker twice and one gap once, and write the values in meters with three decimals (0.060, not 0.06) so a dropped digit is obvious at a glance.
Why does the overlay look correct while the transform is wrong?
The on-image overlay needs only the marker detection: its pixel position and orientation. The published transform is the step that converts pixels to meters, and it uses the size you typed. A wrong size leaves the drawing untouched while stretching every translation along the camera ray — which is why the rotation reads plausibly while the position is off by a factor of three. Note that reprinting the board larger without updating the fields shrinks the error but never zeroes it.
What if my target is a single ArUco marker, not a grid?
Then only the marker size field matters: enter the measured side length and leave the separation box as it is, since a lone marker has no gaps for the solver to use. The scale rule is unchanged. A 50 mm marker entered as 0.2 m reports distances four times too long, because 0.2 divided by 0.050 is 4. Measure the printed square the same way, edge to edge.
Does the entered size matter for a laser profiler calibration?
Less, and for a different reason. A laser profiler triangulates the scene itself, so its hand-eye step does not hinge on a printed marker's entered size the way marker-based camera calibration does. The comparable trap is mounting distance: hold the profiler at the standoff its data sheet states, or every profile lands at the wrong depth regardless of how well the poses were captured.

