@@ -413,6 +413,23 @@ mechanically, not by discipline.
413413 as the env's CPU OpenCV — CUDA libs must be FIRST on LD_LIBRARY_PATH,
414414 never both loaded. ` docs/vision/CUDA_OPENCV.md ` .
415415
416+ - ** Vision loop-closure tutorial (2026-07-11, GO; 10 commits, merged 08868d8):**
417+ the capstone — ORB-SLAM2's place-recognition front-end as short Python:
418+ zero-copy image ingest (cv::Mat aliases the C++ msg buffer,
419+ pointer-identity-tested — first zero-copy-IN across the kits; 1080p ingest
420+ ~ 155× vs rclpy copy), C++ cv::ORB (~ 270 fps), DBoW2 built from source
421+ (5 files, no CMake; ORB-SLAM2-style binary vocab cache: real 145 MB
422+ ORBvoc → 971k words in 2.3 s, binary reload 0.37 s), temporally-gated
423+ loop detection — synthetic: 19 loops, P=1.00/R=0.95, GOLDEN TEST green,
424+ no download; TUM fr3_long_office (1.48 GB tooling-downloaded): the genuine
425+ revisit detected (frame ~ 2207 → ~ 78). M4: GTSAM pose-graph correction,
426+ drift 2.19 → 0.14 m (~ 15×) — via gtsam's Python binding (cppyy gtsam
427+ BLOCKED on missing boost headers; sound fallback, batch step not hot loop).
428+ Reusable dataset tooling: synthetic generator + TUM/ORBvoc downloaders +
429+ dataset_publisher node. Headline doc: ` docs/tutorials/vision_loop_closure.md ` .
430+ CUDA path documented via the Esri prebuilt (~ 5.3× ORB). Post-merge fix:
431+ stale vendored DBoW2 rebuilt (14/14 green).
432+
416433## Risks & mitigations
417434
418435- ** conda-forge cppyy behaves differently from the pip wheel** (cling resource
0 commit comments