## [2026-02-09] Dependency Update - Added `open3d` and `h5py` to `pyproject.toml`. - Successfully synced with `uv sync`. - Verified imports: - open3d: 0.19.0 - h5py: 3.15.1 ## [2026-02-09] Ground Plane Detection Implementation - Implemented `unproject_depth_to_points` using vectorized NumPy operations for efficiency. - Implemented `detect_floor_plane` using Open3D's `segment_plane` (RANSAC) with deterministic seeding. - Implemented `compute_consensus_plane` with weighted averaging and normal alignment to handle flipped normals. - Implemented `compute_floor_correction` using `rotation_align_vectors` for minimal rotation (preserving yaw) and vertical translation. - Added comprehensive tests covering edge cases (outliers, bounds, identity transforms). - Refactored to use `FloorPlane` and `FloorCorrection` dataclasses for structured outputs. - Fixed test logic for `compute_consensus_plane` to correctly account for normal normalization effects on `d`. - Verified type safety with `basedpyright` (0 errors, only expected warnings). ## [2026-02-09] Ground Plane Diagnostic Visualization - Implemented `create_ground_diagnostic_plot` using Plotly `go.Figure`. - Visualization includes: - World origin axes (RGB triad). - Consensus plane surface (semi-transparent gray). - Per-camera floor points (scatter3d). - Camera positions before (red) and after (green) refinement. - Added `save_diagnostic_plot` for HTML export. - Verified with smoke tests in `tests/test_ground_plane.py`. ## [2026-02-09] Final Integration - Full test suite (90 tests) passed successfully. - basedpyright verified on new modules (depth_save.py, ground_plane.py, refine_ground_plane.py). - README updated with Ground Plane Refinement workflow. ## [2026-02-09] Documentation Hardening - Updated `docs/calibrate-extrinsics-workflow.md` with detailed implementation notes. - Documented the HDF5 depth data schema for reproducibility. - Clarified the "Consensus-Relative Correction" strategy vs. absolute alignment. - Added explicit tuning guidance for `stride`, `ransac-dist-thresh`, and `max-rotation-deg` based on implementation constraints. ## Schema Compatibility Fix - Moved per-camera ground refinement diagnostics to `_meta.ground_refined.per_camera` to maintain compatibility with consumers expecting only `pose` in camera nodes. - Preserved `.pose` contract.