metrics op• Data kinds: pose × pose → table
• Call: import fullseye as fs; fs.ledger.pose_error(R_est, t_est, R_gt, t_gt) (to call the implementation directly, import metrics3d; metrics3d.pose_error(R_est, t_est, R_gt, t_gt); from the registry, ops3d.get("pose_error"))
• Return value through the ledger: fullseye.ledger.pose_error(...) returns only the declared out type table (the underlying function also returns auxiliary values). When you need what was dropped, use fullseye.ledger.pose_error.raw(...) or call metrics3d.pose_error directly.
Pose error = (rotation angle [deg], translation norm). For comparing a registration result against ground truth. → (rot_deg, trans_err).
Computation:
• Rotation: the rotation angle of dR = R_est.T @ R_gt, atan2(|axial(dR − dRᵀ)| / 2, (trace(dR) − 1) / 2), converted to degrees (sin is taken from the skew-symmetric part, cos from the trace. arccos has a √ε floor near 1 and answered 0 for anything at or below 1e-6° —— fixed 2026-10-07). Range [0, 180] degrees. 0 if R_est == R_gt.
• Translation: |t_est - t_gt| (Euclidean norm, in the same unit as the coordinates).
Args: R_est, R_gt are (3, 3), t_est, t_gt have length 3. They are only converted to float, and shape and orthogonality are not checked — if R is not a rotation matrix (contains a reflection or scale), the trace formula loses its meaning, and anything other than (3, 3) yields a matrix-product ValueError or a meaningless value. Pass the (R, t) returned by register_fpfh / icp_point2point_3d / register_cross and the GT (R, t) in the same convention (dst ≈ src @ R.T + t).
Returns: (rot_deg, trans_err), 2 float values.
Note: the translation error is coupled with the rotation error (for objects far from the origin, a small rotation error shows up as a large translation error). To see the effective error on the point cloud, compare the transformed clouds with rmse_correspondence (correspondences known) or chamfer_distance.
• blender_interop — Using Blender alongside — build the shape, measure it with fullseye (pitfalls: axes, units, ground truth)
• measurement_uncertainty — Measurement uncertainty and calibration — what it takes to claim you are measuring
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• itokawa_self_register — py -3.11 examples_3d/itokawa_self_register.py
table as input)fuse_to_voxel · mesh_select_lod
metrics)chamfer_distance · hausdorff_distance · m3c2_distance · fscore · rmse_correspondence · normal_consistency · voxel_iou
*Provenance: metrics3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.