Ground-plane alignment can silently pick the mirrored ChArUco pose (cameras underground, reprojection still excellent)
Thank you for FreeMoCap. We run 1.8.2 unmodified under a small Blender classroom addon at San Jose State, and this is the one calibration failure that repeatedly fooled us in the field, so we wrote it up in case it is useful while V2 calibration is in motion.
When the calibration views of a ChArUco board are mostly planar, the board pose has two mathematically valid solutions (the OpenCV planar ambiguity). The ground-plane alignment can pick the mirrored one: the world comes out flipped below the floor, every camera lands underground, and the reprojection error still reads excellent, because reprojection cannot see orientation.
A field case from July 3rd: a six-camera solve scored 0.28 px and looked perfect by every number we watched, while the performer's heels sat 59 cm below the floor and 71 percent of frames were under the ground plane. We kept a matched pair of calibrations (one good, one flipped, same room and cameras) and are happy to package it as a data session ZIP per the contributing guide if that helps.
Reading the installed 1.8.2 source, we could not find ambiguity handling in the calibration path, and the failure behavior is a silent revert to camera-0 origin with a log line (anipose_camera_calibrator.py around lines 240 and 247). We also could not find an existing issue describing this; the open ground-plane issues appear unrelated.
Our classroom mitigation is a post-solve sanity check: parse the calibration TOML, recover each camera's world position, and refuse loudly if any camera sits at or below the floor. It has caught every recurrence since. A direction that might fit upstream: an ambiguity-aware planar solve so both candidate poses and their errors are visible, which would make the flip detectable instead of silent.
Fuller writeup, alongside everything else we have learned running FreeMoCap in a classroom: https://github.com/davidbayus/hiho-software/blob/main/HIHO_MOCAP/UPSTREAM_NOTES_FOR_FREEMOCAP_2026-08-05.md
Source: freemocap/freemocap