3.4 KiB
3.4 KiB
- Corrected success gate logic to
> 0. - Added INFO logging for all attempted ICP pairs.
- Ensured all pairs are stored in
metrics.per_pair_results. - Fixed overlap skip logging to use DEBUG level.
- Fixed syntax and indentation errors in
aruco/icp_registration.pythat were causing unreachable code and malformed control flow. - Relaxed success gate to
metrics.num_cameras_optimized > 0, allowing single-camera optimizations to be considered successful. - Implemented comprehensive per-pair diagnostic logging: INFO for ICP results (fitness, RMSE, convergence) and DEBUG for overlap skips.
- Ensured all attempted ICP results are stored in
metrics.per_pair_resultsfor better downstream diagnostics. - Updated
tests/test_icp_registration.pyto reflect the new success gate logic.
Task 3: 3D AABB Overlap Check
- Implemented
compute_overlap_3dinaruco/icp_registration.py. - Added
overlap_modetoICPConfig(defaulting to "xz"). - Verified 3D overlap logic with new tests in
tests/test_icp_registration.py. - Confirmed that empty inputs return 0.0 volume.
- Confirmed that disjoint boxes return 0.0 volume.
- Confirmed that partial and full overlaps return correct hand-calculable volumes.
Task 2: Point Extraction & Preprocessing
- Implemented
extract_scene_pointswith floor, hybrid, and full modes. - Implemented
preprocess_point_cloudwith statistical outlier removal (SOR). - Added
regionfield toICPConfigdataclass. - Added comprehensive tests for new extraction modes and preprocessing.
- Verified backward compatibility for floor mode.
- Verified hybrid mode behavior (vertical structure inclusion and fallback).
- Verified full mode behavior.
- Verified SOR preprocessing effectiveness.
Task 4: TukeyLoss Robust Kernel Support
- Added
robust_kernelandrobust_kernel_ktoICPConfig. - Implemented TukeyLoss application in
pairwise_icpfor both Point-to-Plane and Generalized ICP. - Verified that TukeyLoss correctly handles outliers in synthetic tests, maintaining convergence accuracy.
- Default behavior remains backward-compatible with
robust_kernel="none".
Task 6: FPFH+RANSAC Global Pre-alignment
- Implemented
compute_fpfh_featuresandglobal_registrationusing Open3D RANSAC. - Added
global_initflag toICPConfig(default False). - Integrated global registration into
refine_with_icpas a pre-alignment step before pairwise ICP. - Added safety checks: global registration result is only used if fitness > 0.1 and the resulting transform is within
max_rotation_degandmax_translation_mbounds relative to the initial extrinsic guess. - Verified with synthetic tests:
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).