Camera Calibration Tool
Generate a checkerboard or circle-grid calibration pattern sized in real millimeters — download it as SVG or PNG and print at actual size for use with OpenCV's findChessboardCorners / ROS's camera_calibration.
Pattern
OpenCV / ROS findChessboardCorners and camera_calibration count internal corners (where four squares meet), not full squares — a "9×6" board like this one has 10×7 squares.
Size & export
Pattern area: 250.0 × 175.0 mm
Full sheet (with margin): 280.0 × 205.0 mm
The preview on the right is not to scale on screen. Print the downloaded file at 100% / "actual size" (never "fit to page"), then measure a square or circle spacing with a ruler before using it — printer scaling errors are the most common source of bad calibration results. Mount the print on a flat, rigid surface (foam board, acrylic, a clipboard) so it can't warp.
Preview
Why don't my RGB and depth images line up? (RealSense and other RGB-D cameras)
On a RealSense (and most RGB-D cameras), depth comes from a separate stereo IR pair, while color comes from its own imager processed through an ISP — two physically distinct sensors mounted a few centimeters apart on the same rigid board, each with its own resolution, field of view, and principal point. Pixel (u, v) in the depth image and pixel (u, v) in the color image are not the same physical ray. If you compute a centroid in each stream independently and compare their pixel coordinates directly, you'll see an offset that roughly tracks that baseline — which is almost certainly what you're running into.
The fix is to request depth aligned to the color frame, not raw depth. The SDK (via rs2::align) does this per pixel: it deprojects each depth pixel to a 3D point using the depth intrinsics, transforms that point into the color camera's coordinate frame using the factory-calibrated extrinsics (translation + rotation between the two imagers), then reprojects it into the color image using the color intrinsics. The result is a depth image that shares the color image's resolution and is pixel-registered with it.
In ROS 2, the easiest way to get this is the launch argument you already found:
ros2 launch realsense2_camera rs_launch.py align_depth.enable:=true
which publishes the reprojected depth on an aligned_depth_to_color/image_raw topic — sample that topic at the same (u, v) as your color-space centroid, rather than computing a centroid in raw depth space and comparing pixel coordinates across the two streams.
Even after aligning, expect residual "fringing" right at object edges — a single reprojected depth sample can't fully resolve what the color camera sees just behind a foreground boundary (occlusion/parallax), so alignment is most accurate over continuous surfaces and least accurate exactly at depth discontinuities. If your measurement point sits on an edge, a millimeter-scale residual offset there is expected, not a bug.
This isn't RealSense-specific — the same separate-imager-plus-extrinsics setup (and the same fix) applies to any stereo-depth-plus-color rig: ZED, OAK-D, Kinect, Orbbec, etc.