Preserve the completed teach-and-repeat laboratory stage: reference preparation, cascaded acquisition, local tracking and recovery, recording lifecycle, replay qualification, and persistent Rerun scene controls. Document the open grid-picking regression and Rerun upgrade contract. No autonomous driving or loop-closure optimization is claimed.
11 KiB
Recorded passage registration — 2026-09-11
The mission planner now compares a selected saved reference route with a bounded interval of another saved recording. The operator opens Тестирование, selects the query recording and interval, and starts Сопоставить проходы. The report, inputs and 3D evidence remain available after the window closes or the service restarts. This is a recorded-data experiment; no live localization or vehicle commands are produced.
Initial hypothesis and scope
The selected query entry is assumed to be near the selected reference route entry, with matching travel direction. Initial translation maps those entry poses together; initial yaw aligns the first displacement of at least 3 m. Roll/pitch initially agree with the sessions' vertical axes. GICP refines all six degrees of freedom. The hypothesis is explicitly shown in the UI. This is not global place recognition and does not establish a 20 m acquisition radius.
Both intervals must be 3–40 m. The reference comes from the immutable saved draft revision. Different recording IDs do not, by themselves, prove independent K1 projects. For B the operator must start a new K1 project and a separate Mission Core recording. Overlapping intervals of the same recording are rejected. Disjoint A outbound/return intervals are permitted as an explicitly labelled internal diagnostic, retaining shared SLAM limitations.
Implementation
missions/registration.py: pinned small_gicp 1.0.1 CPU GICP; source-to-reference rigid transform; finite/bounded input validation; origin-independent centering; nearest-surface evaluation and candidate rejection policy.missions/registration_worker.py: one short-lived numerical process, one computation thread, 30 s timeout. The process exits after each result. No permanent worker or second backend.missions/registration_runs.py: single admitted background job, submitted draft snapshot, generation and SHA-256 source binding, immutable per-run JSON/NPZ/RRD artifacts in the existing private data directory. Interrupted queued/running reports are marked as errors on restart. No implicit retry that would duplicate a run.- Plugin-owned K1 extraction reads only cloud messages inside the selected pose-message interval. It selects at most 120 frames, records original message indices and receipts, crops within 20 m of the preceding recorded scanner position and between −3/+6 m relative height, then keeps the first point per 0.25 m voxel. It never applies the scanner pose a second time to K1 map-space points. No future query frames beyond the selected end enter the cloud.
- Extraction is bounded by 90 s, 2 million raw points, 1 million cropped observations and 100,000 final points. Missing real receipt timing remains null. Immutable source digests are checked before and after prefix staging/extraction.
web/mission_registration_api.py: separate run/history/report/scene API.components/missions/andcore/missions/own the UI. Existing route data checks retain their distinct purpose. The background cloud viewer is unmounted while the test window is open; one result Rerun realm is active, with expand/restore and teardown.
Install only in the repository environment: uv sync --extra localization --inexact. Core remains usable without the optional numeric module; a calculation failure is retained as an error report. Upstream method: small_gicp, version 1.0.1. The local/global registration distinction is also described in Open3D's registration tutorial.
Fixed candidate policy v1
0.25 m preprocessing; 1.5 m correspondence search; 40 iterations. Required: convergence, ≥55% of query points within 0.5 m of the reference, inlier point-to-point RMSE ≤0.25 m, correction at the patch center ≤3 m and rotation ≤30°. Shape covariance and diagonal-normalized information eigenvalue ratios must exceed 0.002 and 0.0001. These are experimental rejection gates fixed before the real probe, not validated safety thresholds. A candidate is not an accepted robot pose. localization_confirmed=false, vehicle_control=false on every report.
Measurements
One bounded functional probe on the local arm64 Mac; no load/stress test and no Mini resource qualification. Raw source A digests remained unchanged. Display-only overview sampling was not used as registration geometry.
| Probe | Result | Query within 0.5 m | Inlier RMSE | Registration |
|---|---|---|---|---|
| Known synthetic rigid transform, 0.7/−0.4/0.2 m and 5.73° yaw | Candidate; transform recovered within 1 cm / 0.1° assertions | 100% | 0.065 m | about 0.03 s |
| A outbound 30 m vs final return 30 m; initial hypothesis perturbed by 0.7/−0.4/0.2 m and 6° | Candidate | 90.70% | 0.188 m | 0.23 s |
| A different road section, 130–155 m, deliberately seeded at reference entry | Rejected: non-convergence and residual | 59.38% | 0.274 m | 0.57 s |
| Same clouds with initial offset 1 km on each axis | Rejected: no overlap/information | 0% | unavailable | 3.27 s |
| Coincident synthetic plane | Rejected: insufficient 3D geometry | — | — | unit test |
The A return fit differs from the original common frame by about 0.716 m / 0.906°. This is a fitting correction, not localization ground-truth error. Independent survey measurements are absent. Only one wrong-region example was checked; false-positive frequency and repeated-scene robustness remain unmeasured.
The real server/UI comparison used a reversed 30 m reference and a 20.06 m inbound query with the route-entry/travel-heading hypothesis. Result: 89.32%, 0.194 m inlier RMSE; correction 2.94 m / 3.5°. It completed in 35.0 s initially, of which 1.60 s was registration; most time was bounded Python data extraction. A repeat with the isolated numerical process completed in 31.2 s (1.46 s registration). The first run appeared stalled during interactive inspection but did finish; a native-library deadlock was not established. Timeout isolation was retained as containment, not presented as proof of that diagnosis.
Validation and retained limitations
23 focused backend tests passed (registration, planner, overview), including known-transform recovery, no-overlap/plane rejection, input limits, no future-frame inclusion, no second pose transform, immutable report/revision behavior and one-job admission. Nine planner/architecture frontend tests and typecheck/build passed. Optional localization tests require the localization extra. Real 8000 browser flow, result display, history reopening after server restart, expanded 3D and Escape restore were checked on the available narrow in-app viewport. Full desktop layout and a clean deployment host are not qualified by this check.
Not implemented: independent B proof, sequential causal tracking, consensus over several windows, arbitrary-start/global relocalization, ground-truth accuracy, hardware timing, LAS comparison, obstacle policy or chassis control. The test consumes an already saved interval; it does not run while the operator walks.
Next acquisition
A is already available. Record only B: new K1 project + separate Mission Core session, start near A's first physical start with the same travel direction, hold the scanner at roughly the same height, walk the first 20–30 m once, finish and save. Keep original A unchanged. Choose the forward 30 m mission draft, then B in Testing; the first comparison uses B's first 20 m. If acquisition starts elsewhere, record the location/direction and select the corresponding reference entry instead of silently treating it as the first start. LAS and Gaussian generation are unnecessary for this probe.
Independent B recording — saved comparison at 14:24 UTC
The acquisition instruction above is now complete: JA-SADOVAYA-002 is saved. No new field recording is needed for the next analysis. One bounded comparison was executed through the canonical server on port 8000, without source changes, a restart, hardware commands or a new capture.
- Run
820571ba-6076-482b-be34-29ceb5328c80, 2026-09-11T14:24:04.314Z–14:24:33.127Z; started monotonic ns514814164352083. - Forward draft
6159d3fa-dda4-4223-acdf-ceeceedefaad, revision 1, JA-SADOVAYA · проверка 30 м. A:20260911T085226Z_viewer_live, poses 0–577, 30.012 m. - B:
20260911T134352Z_viewer_live, poses 0–251, 20.078 m, 39.530 s. Its whole recorded trajectory is approximately 62.974 m. Evidence relation isdifferent_recordings; K1 SLAM reset is not independently verified by this label. - GICP candidate, converged in 23 iterations: 91.212% of 23,135 query evaluation points within 0.5 m of the 30,280-point reference; inlier surface RMSE 0.1763 m. These are geometric consistency measures, not scanner/rover pose accuracy.
- Correction from the entry/direction hypothesis: 2.940 m / 6.920°. Translation is close to the fixed 3 m rejection gate; this run does not establish a reliable startup radius. Gates were unchanged. No arbitrary-location search was performed.
- Numerical registration 1.048 s, complete preparation/evaluation/persistence 28.810 s on the local Darwin arm64 Python 3.12.13 environment. This is one recorded-data probe, not a live-rate or onboard-computer qualification.
localization_confirmed=false,vehicle_control=false. No independent ground truth or sequential-window/false-positive qualification for B yet.
Report and artifacts are retained under private data_dir/missions/registration-runs/820571ba-6076-482b-be34-29ceb5328c80/. SHA-256 verification passed for all four declared artifacts:
| Artifact | SHA-256 |
|---|---|
| report.json | 97236f89d73f63745a77558bf585dcac5ead5ffaa8191c27afb73b52c6271d59 |
| clouds.npz | 174e60a37685c83553a97500bbe89e0a7da5ec39543629c03fff1691e0c09717 |
| scene.rrd | 2824f1d3f0064d5d62dbe6823febd6c6013c162ad08ecfc57281abfe7c9069a4 |
| registration-input.npz | 5eedfda3e792bf291bab16c723646b2dfb4e8a1ca3b117a3c7e26dd15bfd4a52 |
| registration-result.json | 1c0faf1ed677391a126e8fbb5ee6d7bacdf48343581ad0c503f15f9a5d2fd52e |
The saved result was opened in the actual browser comparison history at 17:24:04 Moscow time and its expanded Rerun view inspected: gray reference, colored B and green distance-qualified correspondences rendered. The short-lived numerical worker exited; port 8000 still returned HTTP 200. Docker backend/VM was not running during this probe. No new permanent process was introduced.
Next planned experiment: replay successive bounded B windows against fixed A, retain causal evidence and assess discontinuities; add wrong-region controls before claiming stable localization. New scanning can wait for those results. The previous failed live report remains unchanged and is not reclassified by this recorded result. Missing archived B camera frames are not restored by point-cloud registration.