Research and validation workspace for finding a reproducible ORB-SLAM3 version/configuration that works for a stereo fisheye rig with IMU, then verifying it on the user's dataset.
make build
make smoke
make calibration-smoke
make fetch-tum-rgbd
make fetch-tum-vi
make rgbd-sanity
make tum-vi-sanity
make checkmake buildgenerates the current dry-run smoke plan inbuild/smoke-plan.md.make smokeexercises the canonical dry-run launcher path and writes outputs tologs/out/andreports/out/.make calibration-smokegenerates and validates the checked-in shareable calibration settings bundles for the first monocular baseline.make fetch-tum-rgbddownloads and extracts the public TUM RGB-Dfr1/xyzdataset intodatasets/public/.make fetch-tum-vidownloads and extracts the public TUM-VIroom1_512_16dataset intodatasets/public/.make rgbd-sanityruns the clean-room public RGB-D sanity lane against upstreamrgbd_tum.make tum-vi-sanityruns the clean-room public TUM-VI monocular sanity lane against upstreammono_tum_vi.make checkruns tests, build, smoke, calibration-smoke, and normalization as one aggregate validation command.
- Execution plan
- Final validation report
- TUM RGB-D sanity run report
- HEL-67 public TUM-VI sanity report
- HEL-63 post-initialization abort follow-up
- HEL-68 ASan crash follow-up
- HEL-69 worktree containment follow-up
- HEL-71 Eigen static-alignment follow-up
- HEL-72 ASan plus no-static-alignment follow-up
- HEL-73 private aggressive follow-up
- HEL-74 private ASan leak follow-up
- HEL-75 public save-path probe follow-up
- HEL-76 private save comparison follow-up
- HEL-77 private save comparison follow-up
- Dataset normalization
- Calibration translation
- Monocular baseline
- Future rig plan
- Development guide
- Production verification
- Publication decision
HEL-64 promotes the first concrete publishable artifact for this repo: the
public TUM RGB-D sanity-run report bundle under
reports/published/tum_rgbd_fr1_xyz_sanity/. The deploy target is now a
static GitHub Pages publication of that bundle, while the versioned repo copy
remains the audit source of truth. Use
make verify-production ARTIFACT_URL=https://<published-artifact-url> against
the published Pages root after deployment, and record the final URL in the PR
summary plus the Linear handoff/completion comment.
The current repo-level conclusion is captured in
docs/final-validation-report.md. The
checked-in rerun path is validated through make check. A real user-rig run
still remains blocked until the local-only lens-10 inputs are imported into the
current checkout. Pangolin is now part of the documented repo-local bootstrap
flow through make bootstrap-local-pangolin, which extracts the required
GL/GLEW/X11 development sysroot and installs a CMake-discoverable Pangolin
prefix under build/local-tools/pangolin-root/usr/local/. The repo-local
OpenCV bootstrap now also records its resolved dependency closure so the local
prefix carries the transitive Qt/TBB/media libraries needed by the ORB-SLAM3
example link step. On a host with the imported lens-10 bundle and the repo-local
native toolchain in place, the baseline now executes end-to-end, but the current
user sequence still produces zero keyframes and no saved trajectory artifacts.
The latest follow-up in
docs/hel-71-eigen-static-alignment-follow-up.md
shows that a clean-room public rerun with
ORB_SLAM3_DISABLE_EIGEN_STATIC_ALIGNMENT=1 still crashes at frame 93
immediately after New Map created with 375 points, now as a plain
segmentation fault. That means Eigen static-alignment policy alone is not yet a
safe fix to promote into the canonical lane before the next private rerun. The
current HEL-72 checkpoint in
docs/hel-72-asan-static-alignment-follow-up.md
shows the combined public rerun with ORB_SLAM3_ENABLE_ASAN=1 plus
ORB_SLAM3_DISABLE_EIGEN_STATIC_ALIGNMENT=1 surviving past first-map creation
and continuing well beyond the old frame-93 crash boundary, while the private
aggressive lens-10 baseline remains blocked in this checkout because only the
raw 00.mp4 and 10.mp4 exports are present, not the calibration/extrinsics
sidecars needed to rebuild datasets/user/insta360_x3_one_lens_baseline/.
The current HEL-73 follow-up in
docs/hel-73-private-aggressive-follow-up.md
turns that blocker into a dedicated repo entrypoint,
scripts/run_private_monocular_followup.py, which now fails fast with an
auditable report and .symphony/progress/HEL-73.json until the missing
calibration/extrinsics sidecars are restored.
The current HEL-74 follow-up in
docs/hel-74-private-asan-leak-follow-up.md
shows that once those sidecars are restored, the private aggressive lane can
run all 270 frames, initialize twice, and reach SaveTrajectoryEuRoC, but the
expected frame trajectory is still missing and LeakSanitizer returns non-zero at
shutdown because ORB-SLAM3 leaves large persistent allocations behind.
The current HEL-75 follow-up in
docs/hel-75-public-save-path-follow-up.md
shows that the same ASan/no-static-alignment build can still save both frame
and keyframe trajectories on a bounded public monocular fisheye lane, so the
remaining blocker is now private-lane-specific rather than a generic save-path
or working-directory failure. The current HEL-76 follow-up in
docs/hel-76-private-save-comparison-follow-up.md
turns that conclusion into a dedicated comparison entrypoint,
scripts/run_private_save_comparison_followup.py, which reuses the HEL-74
aggressive private lane, records the HEL-75 public save-byte reference in the
repo, auto-discovers the known OpenClaw host paths for the raw videos and
calibration/extrinsics sidecars when the repo-local bundle is absent, and
leaves a blocked report when the current host still lacks the private inputs
needed to rerun the comparison.
The current HEL-77 follow-up in
docs/hel-77-private-save-comparison-follow-up.md
shows that this host does expose the private exports and sidecars, and that the
repo can materialize the lens-10 bundle plus fetch the pinned ORB-SLAM3
checkout, but the clean workspace is still blocked at cmake and the remaining
native dependency lane before any private save-byte comparison can run.
HEL-46 adds the one supported raw-input and normalized-output contract for
stereo fisheye plus IMU sequences. The checked-in fixture manifest is
manifests/stereo_imu_fixture_normalization.json.
Validate the import path from a clean checkout with:
make normalize-fixtureThat command normalizes the checked-in raw fixture into
build/fixtures/stereo_imu_fixture/normalized/ and writes a saved report to
reports/out/stereo_imu_fixture_normalization.md.
HEL-47 adds a checked-in calibration bundle at
configs/calibration/insta360_x3_shareable_rig.json, committed monocular YAMLs
for lens 10/ and lens 00/, and a harness-integrated config smoke path at
manifests/insta360_x3_shareable_calibration_smoke.json.
Validate that lane from a clean checkout with:
make calibration-smokeThat command regenerates:
configs/orbslam3/insta360_x3_lens10_monocular.yamlconfigs/orbslam3/insta360_x3_lens00_monocular.yamllogs/out/insta360_x3_shareable_calibration_smoke.logreports/out/insta360_x3_shareable_calibration_smoke.md
The saved report also records the unresolved blockers for any future stereo+IMU ORB-SLAM3 bundle.
HEL-51 adds the first real run contract for a single Insta360 X3 lens without
IMU. The checked-in manifest is
manifests/insta360_x3_lens10_monocular_baseline.json.
HEL-48 keeps that lane on the official upstream ORB-SLAM3 master line,
currently pinned to commit 4452a3c4ab75b1cde34e5505a36ec3f9edcdc4c4. The
candidate comparison and recommendation memo live in
docs/candidate-baseline-evaluation.md.
The baseline flow is:
- Fetch the pinned ORB-SLAM3 checkout with
./scripts/fetch_orbslam3_baseline.sh. That helper also unpacksVocabulary/ORBvoc.txtfrom the upstream archive so the runtime vocabulary path exists before the full native build. - If the host does not provide
cmake, bootstrap a repo-local copy withmake bootstrap-local-cmake. - If the host does not provide
Eigen3, bootstrap a repo-local prefix withmake bootstrap-local-eigen. - If the host does not provide OpenCV 4, bootstrap a repo-local prefix with
make bootstrap-local-opencv. - If the host does not provide Boost serialization, bootstrap a repo-local
prefix with
make bootstrap-local-boost. - If the host does not provide
ffmpeg/ffprobe, bootstrap the pinned repo-local media bundle withmake bootstrap-local-ffmpeg. - If the host does not provide Pangolin, bootstrap the repo-local Pangolin
prefix plus its GL/GLEW/X11 development sysroot with
make bootstrap-local-pangolin. - Build the upstream checkout with
./scripts/build_orbslam3_baseline.sh. That wrapper reproduces the upstream native build steps but disables the optionalThirdparty/Sophustests/examples, which are not required formono_tum_viand otherwise fail on newer GCC toolchains because upstream enables-Werror. It now asks CMake for the requiredmono_tum_vitarget directly instead of blocking on unrelated upstream example binaries. - Run
make monocular-prereqsto confirm that the private lens-10 inputs, native build toolchain, and baseline assets are all ready. That command writes a saved report toreports/out/insta360_x3_lens10_monocular_prereqs.mdand returns non-zero until the lane is actually runnable. - Import the provided one-lens raw assets into
datasets/user/insta360_x3_one_lens_baseline/with:./scripts/import_monocular_video_inputs.py --video-00 /path/to/00.mp4 --video-10 /path/to/10.mp4 --calibration-00 /path/to/insta360_x3_kb4_00_calib.txt --calibration-10 /path/to/insta360_x3_kb4_10_calib.txt --extrinsics /path/to/insta360_x3_extr_rigs_calib.json. That helper copies the raw files into a deterministic repo-local layout, extracts source PNGs, and generates the per-lensmonocular_calibration.json,frame_index.csv,timestamps.txt, andimport_manifest.jsonfiles needed for the baseline lane. - Generate settings plus the timestamp-named image folder with
./scripts/run_orbslam3_sequence.sh --manifest manifests/insta360_x3_lens10_monocular_baseline.json --prepare-only. - Execute the actual upstream
mono_tum_virunner with./scripts/run_orbslam3_sequence.sh --manifest manifests/insta360_x3_lens10_monocular_baseline.json. The wrapper now auto-injects repo-local OpenCV, Boost, and Pangolin runtime library paths, usesxvfb-run -aon headless hosts, runs from the trajectory output directory so ORB-SLAM3 writesf_<stem>.txtandkf_<stem>.txtcorrectly, and returns non-zero when the run finishes without trajectory artifacts.
The repo still does not include the private calibration or user sequence payload, so the checked-in automation defines the reproducible contract and output layout rather than committing user-specific values.
HEL-61 adds a clean-room upstream sanity path against the public TUM RGB-D
fr1/xyz dataset. The checked-in manifest is
manifests/tum_rgbd_fr1_xyz_sanity.json.
Run the full public lane with:
make rgbd-sanityThat command:
- fetches a fresh upstream ORB-SLAM3 checkout at the pinned commit
- bootstraps repo-local
cmake,Eigen3, OpenCV, Boost serialization, and Pangolin prefixes - downloads and extracts the TUM RGB-D
fr1/xyzarchive intodatasets/public/tum_rgbd/ - builds the upstream
rgbd_tumtarget from scratch - runs the public sequence with upstream
TUM1.yamland the upstreamfr1_xyz.txtassociation file - writes trajectories, logs, a markdown report, an SVG trajectory plot, and a
visual HTML report under
build/,logs/out/, andreports/out/ - promotes the inspectable published bundle with
make publish-rgbd-sanityunderreports/published/tum_rgbd_fr1_xyz_sanity/
For the final rerun order, auditable artifacts, and the reference-only historical paths that are no longer the canonical entrypoint, use docs/final-validation-report.md. For the actual public-run verdict and published artifact paths, use docs/tum-rgbd-sanity-report.md.
HEL-67 extends the same clean-room baseline proof into the public TUM-VI
room1_512_16 monocular fisheye lane. The checked-in manifest is
manifests/tum_vi_room1_512_16_cam0_sanity.json.
Run the full public lane with:
make tum-vi-sanityThat command:
- fetches a fresh upstream ORB-SLAM3 checkout at the pinned commit
- bootstraps repo-local
cmake,Eigen3, OpenCV, Boost serialization, and Pangolin prefixes - downloads and extracts the public TUM-VI
room1_512_16archive intodatasets/public/tum_vi/ - materializes
cam0into the repo's monocular calibration and frame-index contract fromdso/cam0/camera.txtandmav0/cam0/data.csv - builds the upstream
mono_tum_vitarget from scratch - runs the public sequence under
xvfb-run -a - writes the orchestration log, runtime log, and markdown report under
logs/out/,reports/out/, and.symphony/
For the final public-run verdict and the exact runtime blocker that remains on this host, use docs/reports/hel-67-public-tum-vi-room1-cam0.md.
configs/: calibration and ORB-SLAM3 settings bundlesdatasets/: shareable fixtures plus local-only user recordingslogs/out/: generated logsreports/out/: generated validation reports and publishable artifactsscripts/: runnable harness entrypointssrc/splatica_orb_test/: harness contract helperstests/: automated tests