diff --git a/py_workspace/.sisyphus/notepads/full-icp-pipeline/learnings.md b/py_workspace/.sisyphus/notepads/full-icp-pipeline/learnings.md index d1af3b2..55245ee 100644 --- a/py_workspace/.sisyphus/notepads/full-icp-pipeline/learnings.md +++ b/py_workspace/.sisyphus/notepads/full-icp-pipeline/learnings.md @@ -41,3 +41,14 @@ - `test_compute_fpfh_features`: Validates feature dimension and count. - `test_global_registration_known_transform`: Confirms RANSAC can recover a known large transform (30 deg rotation). - `test_refine_with_icp_global_init_success`: End-to-end test showing global init can recover from a very bad initial guess (90 deg error) where local ICP would fail. + +## Task 8: Relax ICPConfig defaults +- Relaxed defaults for ICPConfig to improve convergence and allow more flexible corrections. +- New defaults: + - min_fitness: 0.15 + - min_overlap_area: 0.5 + - gravity_penalty_weight: 2.0 + - max_correspondence_distance_factor: 2.5 + - max_translation_m: 0.3 + - max_rotation_deg: 10.0 +- Verified with 36 passing tests and clean basedpyright (0 errors, though many warnings due to missing stubs). diff --git a/py_workspace/aruco/icp_registration.py b/py_workspace/aruco/icp_registration.py index 63a3893..5cdd857 100644 --- a/py_workspace/aruco/icp_registration.py +++ b/py_workspace/aruco/icp_registration.py @@ -25,14 +25,14 @@ class ICPConfig: max_iterations: list[int] = field(default_factory=lambda: [50, 30, 14]) method: str = "point_to_plane" # "point_to_plane" or "gicp" band_height: float = 0.3 # Near-floor band height in meters - min_fitness: float = 0.3 # Min ICP fitness to accept pair - min_overlap_area: float = 1.0 # Min XZ overlap area in m^2 + min_fitness: float = 0.15 # Min ICP fitness to accept pair + min_overlap_area: float = 0.5 # Min XZ overlap area in m^2 overlap_margin: float = 0.5 # Inflate bboxes by this margin (m) overlap_mode: str = "xz" # 'xz' or '3d' - gravity_penalty_weight: float = 10.0 # Soft constraint on pitch/roll - max_correspondence_distance_factor: float = 1.4 - max_rotation_deg: float = 5.0 # Safety bound on ICP delta - max_translation_m: float = 0.1 # Safety bound on ICP delta + gravity_penalty_weight: float = 2.0 # Soft constraint on pitch/roll + max_correspondence_distance_factor: float = 2.5 + max_rotation_deg: float = 10.0 # Safety bound on ICP delta + max_translation_m: float = 0.3 # Safety bound on ICP delta region: str = "floor" # "floor", "hybrid", or "full" robust_kernel: str = "none" # "none" or "tukey" robust_kernel_k: float = 0.1