feat: keep the previous pose when the worker rejects one, and expose the rejection reason

This commit is contained in:
2026-08-24 11:49:00 +10:00
parent 83976205d6
commit f1830fc961
+6 -2
View File
@@ -4,7 +4,7 @@
* becomes a 3D world point (from scene.json anchors, same anchorWorldMatrix * becomes a 3D world point (from scene.json anchors, same anchorWorldMatrix
* convention as v2), and ONE solvePnP recovers the camera pose directly: * convention as v2), and ONE solvePnP recovers the camera pose directly:
* - stability scales with marker spread instead of degrading into fusion tuning * - stability scales with marker spread instead of degrading into fusion tuning
* - the wall crest makes the point set non-coplanar => planar ambiguity gone * - a non-coplanar crest (one standing vertical) removes planar ambiguity
* - single visible marker still works (IPPE init + iterative refine w/ prior) * - single visible marker still works (IPPE init + iterative refine w/ prior)
* *
* The solve itself runs in cv-worker.js. OpenCV.js embeds ~8MB of WASM as a * The solve itself runs in cv-worker.js. OpenCV.js embeds ~8MB of WASM as a
@@ -95,6 +95,7 @@ export class CvBoardSolver {
this.lastPose = null; // newest smoothed pose from the worker this.lastPose = null; // newest smoothed pose from the worker
this.lastReproj = 0; this.lastReproj = 0;
this.lastCount = 0; this.lastCount = 0;
this.lastReject = ''; // why the worker last refused a pose (HUD)
this._v = new THREE.Vector3(); this._v = new THREE.Vector3();
this._m4 = new THREE.Matrix4(); this._m4 = new THREE.Matrix4();
this._q = new THREE.Quaternion(); this._q = new THREE.Quaternion();
@@ -126,7 +127,10 @@ export class CvBoardSolver {
_onPose(m) { _onPose(m) {
this.inFlight = false; this.inFlight = false;
if (!m.ok) return; // a rejected pose leaves the previous one in place: better a slightly stale
// camera than a mirrored one that throws every ghost across the table
if (!m.ok) { this.lastReject = m.why || 'fail'; return; }
this.lastReject = '';
this.lastReproj = m.reproj || 0; this.lastReproj = m.reproj || 0;
this.lastCount = m.n / 4; this.lastCount = m.n / 4;
this._m4.set( this._m4.set(