@@ -12,11 +12,10 @@ short-lived allocations in R-VPF + R-GPF.
1212
1313** High-impact (this is where the +14.8% comes from):**
1414
15- - ` estimate_plane ` : drop ` Eigen::MatrixX3f eigen_ground ` + ` centered `
16- + ` centered.adjoint() * centered ` . Replace with a single-pass
17- scalar accumulation of mean and 9 cross-products, then build the
18- 3x3 covariance on the stack. No more per-call Eigen heap
19- allocations.
15+ - ` estimate_plane ` : drop the ` Eigen::MatrixX3f eigen_ground ` ,
16+ ` centered ` , and ` centered.adjoint() * centered ` heap allocations.
17+ Replace with a single-pass scalar accumulation of mean and 9
18+ cross-products, then build the 3x3 covariance on the stack.
2019- ` extract_piecewiseground ` : promote ` src_wo_verticals ` and
2120 ` src_tmp ` to reused instance scratch members. ` vector::clear() `
2221 keeps capacity, so per-patch malloc pressure on the glibc heap
@@ -50,10 +49,10 @@ is sub-us/patch.
5049
5150KITTI seq 00 (4541 frames), v1.4.0 to v1.4.1:
5251
53- | Method (protocol) | Before | After | Δ F1 |
54- | ------------------- | -------------------------- | -------------------------- | ----: |
55- | ` patchwork ` (pw) | P 92.34, R 94.64, F1 93.41 | P 92.34, R 94.64, F1 93.41 | 0.00 |
56- | ` patchworkpp ` (pp) | P 94.88, R 98.47, F1 96.62 | P 94.89, R 98.48, F1 96.63 | +0.01 |
52+ | Method (protocol) | Before | After | Δ F1 |
53+ | ------------------ | -------------------------- | -------------------------- | ----: |
54+ | ` patchwork ` (pw) | P 92.34, R 94.64, F1 93.41 | P 92.34, R 94.64, F1 93.41 | 0.00 |
55+ | ` patchworkpp ` (pp) | P 94.88, R 98.47, F1 96.62 | P 94.89, R 98.48, F1 96.63 | +0.01 |
5756
5857Algebraic identity of ` JacobiSVD ` vs ` eigh ` verified on 500 real
5958KITTI patch covariances: ` normal_ ` (up to sign),
@@ -95,10 +94,10 @@ order so numerical results are byte-identical to the sequential path.
9594
9695Measured on KITTI seq 00 (i7-12700, 24 logical cores):
9796
98- | Configuration | Median ms/frame | Median Hz |
99- | -- | --: | --: |
100- | ` --method patchwork ` single-thread (taskset -c 0) | 8.31 | 120.4 |
101- | ` --method patchwork ` parallel (TBB default scheduler) | ** 4.81** | ** 207.8** |
97+ | Configuration | Median ms/frame | Median Hz |
98+ | ----------------------------------------------------- | -------------- : | ------ --: |
99+ | ` --method patchwork ` single-thread (taskset -c 0) | 8.31 | 120.4 |
100+ | ` --method patchwork ` parallel (TBB default scheduler) | ** 4.81** | ** 207.8** |
102101
103102** 1.73× speedup** . TBB is an ** optional** build dependency: missing
104103TBB causes a CMake STATUS message and falls back to a sequential
@@ -129,10 +128,10 @@ or a real user CPU complaint).
129128KITTI 00-10 full sweep (23,201 frames), Patchwork++ paper protocol,
130129v1.3.1 → v1.4.0:
131130
132- | Method | F1 v1.3.1 | F1 v1.4.0 | Δ |
133- | --- | --- | --- | --- |
134- | ` --method patchwork ` | 96.0172 | 96.0172 | 0 (byte-identical) |
135- | ` --method patchworkpp ` | 96.2918 | 96.2919 | +0.0001 (float noise) |
131+ | Method | F1 v1.3.1 | F1 v1.4.0 | Δ |
132+ | ---------------------- | --------- | --------- | ------------------ --- |
133+ | ` --method patchwork ` | 96.0172 | 96.0172 | 0 (byte-identical) |
134+ | ` --method patchworkpp ` | 96.2918 | 96.2919 | +0.0001 (float noise) |
136135
137136Both well within the ±0.05 budget set in the refactor plan.
138137
@@ -177,12 +176,12 @@ parameters (`uprightness_thr=0.707`, `using_global_thr=false`) on SemanticKITTI
177176sequences 00–10 (23,201 frames), under the Patchwork++ paper evaluation
178177protocol (Sec. IV.A — VEGETATION excluded):
179178
180- | Configuration | Precision | Recall | F1 |
181- | --- | --- | --- | --- |
182- | v1.2.0 (` pypatchworkpp.patchwork ` ) | 89.70 | 98.49 | 93.73 |
183- | ** v1.3.0 (` pypatchworkpp.patchwork ` )** | ** 94.64** | ** 97.58** | ** 96.02** |
184- | Original Patchwork ROS 2 (reference) | 94.38 | 97.90 | 96.05 |
185- | Patchwork++ paper Table I, Patchwork \[ 1 \ ] | 94.23 | 97.62 | 95.88 |
179+ | Configuration | Precision | Recall | F1 |
180+ | ---------------------------------------- | --------- | --------- | ------ --- |
181+ | v1.2.0 (` pypatchworkpp.patchwork ` ) | 89.70 | 98.49 | 93.73 |
182+ | ** v1.3.0 (` pypatchworkpp.patchwork ` )** | ** 94.64** | ** 97.58** | ** 96.02** |
183+ | Original Patchwork ROS 2 (reference) | 94.38 | 97.90 | 96.05 |
184+ | Patchwork++ paper Table I, Patchwork [ 1 ] | 94.23 | 97.62 | 95.88 |
186185
187186** +2.29 F1** vs v1.2.0; within ±0.14 F1 of the original Patchwork ROS 2 build
188187and within paper run-to-run variance of Table I.
@@ -195,7 +194,7 @@ Fixes:
195194 effectively never fired for normal ground.
1961951 . Plane-distance comparison now uses uncentred ` normal · p ` against
197196 ` th_dist_d_ = th_dist − d_ ` , which is equivalent to "signed distance to
198- plane \ < th_dist". The previous centred form shifted the cutoff by an
197+ plane < th_dist". The previous centred form shifted the cutoff by an
199198 extra ` −d_ ≈ |normal · mean| ≈ 1.6 m ` on KITTI ground.
2001991 . The elevation/flatness tier index is now the GLOBAL ring index across all
201200 zones, so each of the first ` elevation_thr.size() ` rings gets its own
0 commit comments