## 2026-02-10T09:45:00Z Session bootstrap - Initial notepad created for full-icp-pipeline execution. - Baseline code references verified in `aruco/icp_registration.py` and `refine_ground_plane.py`. ## Task 2: Point Extraction Functions ### Learnings - Open3D's `remove_statistical_outlier` returns a tuple `(pcd, ind)`, where `ind` is the list of indices. We only need the point cloud. - `estimate_normals` with `KDTreeSearchParamHybrid` is robust for mixed geometry (floor + walls). - Hybrid extraction strategy: 1. Extract floor band (spatial filter). 2. Extract vertical points (normal-based filter: `abs(normal ยท floor_normal) < 0.3`). 3. Combine using boolean masks on the original point set to avoid duplicates. - `extract_scene_points` provides a unified interface for different registration strategies (floor-only vs full-scene). ### Decisions - Kept `extract_near_floor_band` as a standalone function for backward compatibility and as a helper for `extract_scene_points`. - Used `mode='floor'` as default to match existing behavior. - Implemented `preprocess_point_cloud` to encapsulate downsampling and SOR, making the pipeline cleaner. - Added `region` field to `ICPConfig` to control the extraction mode in future tasks.