Tags

Tags give the ability to mark specific points in history as being important
  • 3.1.0

    SwiftICP 3.1.0
    
    Additive release. Index reuse across frames, voxel downsampling, and robust
    weighting (Huber, Tukey, trimmed ICP).
    
    No existing signature changed and no case was added to ICPError or
    ICPTerminationReason, so downstream exhaustive switches keep compiling.
    Every default reproduces 3.0 bit for bit.
  • 3.0.0

    Release 3.0
    
    Correctness
    - Non-finite coordinates are rejected rather than silently corrupting the k-d
      tree's ordering invariant and returning wrong neighbours.
    - A run returns the best pose it measured, not the last one it reached. Under a
      rejection radius, 455 of 600 sampled runs previously returned a pose already
      measured as worse; now none do.
    - tryIndexCorrespondence defaults off: it made results discontinuous in the
      length of the input.
    - New minTransformChange criterion, which does not depend on which points are
      currently inliers.
    
    Point-to-plane
    - ICPOptions.metric = .pointToPlane. On near-planar geometry, 108 iterations
      and 814ms become 4 iterations and 52.6ms at 100k points, same ~1e-16 RMSE.
    - Solved with Givens QR rather than the normal equations. Rank-deficient
      directions are truncated, not divided by.
    - k-nearest search and PCA normal estimation (ICP.estimateNormals).
    
    Portability and performance
    - Accelerate is gone. The 3x3 SVD is a one-sided Jacobi solver: 3.4x faster
      than dgesdd and more accurate on small singular values. The library imports
      only simd and Dispatch.
    
    Tests
    - 60 -> 109 tests. 11 of the 25 ICP tests had been passing only through the
      index shortcut, exercising closed-form Kabsch rather than ICP; rewritten.
    
    Breaking changes are listed under "Upgrading from 2.x" in the README.
  • 2.0.0

    SwiftICP 2.0.0
    
    Dependency-free release built around an internal flat k-d tree, a parallel
    correspondence search and a Swift 6 concurrency-clean API.
    
    Breaking: init and align throw; iterate becomes align(options:) taking
    ICPOptions; getRigidTransform becomes static ICP.rigidTransform;
    applyTransform becomes ICP.apply. KDPoint3D, init(_:_:), getRTMatrixSVD,
    useDualPathAlignment and Mat4.fromRowMajorR are removed. Requires Swift 6.0
    tooling.
    
    Fixes degeneracy detection, which previously reported false for every
    degenerate input, and removes all traps on bad data in favour of ICPError.
    
    Aligning 100k points drops from 7.2s to 136ms against 1.x, at the same
    ~5e-16 RMSE.
  • 1.0.0

    6ba4613d · README.md ·