Agent handoff 4 / 4 self-contained — no vault access needed

Implement asphalt-edge extraction — new repo

2026-07-10 · for a fresh implementation agent on a machine with repo + Nexus access, without the knowledge vault · all research findings inlined · biggest head start of the four: the road surface is already extracted upstream

Continuation target: new repo that turns the already-extracted road surface (surface point clouds + .ply meshes from iolabs-point-cloud-filtering-surface) into left/right asphalt-edge CAD polylines: boundary of the surface → station-wise edge sampling along the axis → cross-profile multi-signal refinement → smoothing/simplification → XML/DXF export. No ML in v1. German Autobahn edges are mostly curbless: the cue is texture, not height.

Project context (inlined)

Research findings (inlined — compiled & verified 2026-07-07)

Signal reliability for curbless asphalt-vs-shoulder (the ranking to implement):
  1. Roughness / plane-fit deviation — strongest cue: asphalt is locally planar and smooth; grass/gravel has high surface variation (PDAL covariancefeatures: scattering, surface variation; filters.planefit).
  2. Point density — sampling/returns change at vegetation/gravel boundaries.
  3. Slope / crossfall change — useful at gutters, shoulder drops, embankments; fixed thresholds fail on slopes.
  4. Laser intensity / RGB — supporting only, and strictly local per profile: MLS intensity depends on material and range, incidence angle, sensor, campaign [Schwab & Kolbe 2026]. "This side darker than that side, right here" is safe; a global "asphalt < X" threshold is a trap.
  5. Height step — mostly absent on the Autobahn (no curb); only helps at Rinne/gutter transitions.
Curb-literature lessons [Xu 2016]: single-feature detectors fail on low steps, slopes, occlusions; the robust pattern is a voxel density-gradient candidate search + least-cost-path / continuity refinement (their urban result: 78.6% completeness, 83.3% correctness). Adapt as an asphalt→non-asphalt transition search, not a curb-height search. Reference road-extraction accuracy with skeleton refinement: 67→73% IoU [Wang 2025] — road-region, not edge-specific.
Hard constraints: no global intensity thresholds (verified non-stationarity); never bridge exits/on-ramps — the edge genuinely branches at gore areas, emit an explicit gap; occlusion holes (parked vehicles) must produce flagged gaps or flagged interpolations, never silent straight lines.
Open questions — answered by the day-1 QC experiment: does the upstream surface bleed onto compacted gravel shoulders (flat + smooth, exactly what a flatness filter likes)? Are concrete gutter channels (Rinne) included in the surface — if yes, the asphalt edge is a material boundary inside one smooth surface and local intensity contrast gets promoted to a primary signal.

Artifacts to reuse

Nexus index: https://nexus.iolabs.ch/repository/pypi-private/simple (copy [tool.uv.sources] from 3dai.lanefinder). Flat naming: iolabs-point-cloud-* → import iolabs_point_cloud_*. Update: uv lock --upgrade-package … && uv sync.

ArtifactUse for
iolabs-point-cloud-filtering-surface (Nexus)Your input: road-surface points + .ply meshes per segment
iolabs-point-cloud-segmentation-trajectory · iolabs-geometry-geometry (Nexus)Segment planes, axis spline, station/offset sampling, perpendicular profiles
PDAL filters.hexbin (boundary output) or alphashape/CGAL Alpha_shape_2Initial surface outline — don't hand-roll concave hulls
PDAL filters.covariancefeatures, filters.planefitRoughness/scattering/density for profile refinement
shapely (simplify, linear referencing) · scipy (savgol_filter) · sklearn (RANSACRegressor)Polyline post-processing to CAD quality
iolabs-point-cloud-modelling-export · iolabs-geometry-visualization · io_orchestrator.ray_stepXML out (mirror lines schema), QC overlays, pipeline step; ezdxf if surveyors want DXF directly

Suggested repo/package: 3dai.iolabs.pointcloud.asphaltedge / iolabs-point-cloud-detection-asphaltedgeconfirm remote/org with Miro.

Algorithm to implement

  1. Day-1 QC experiment (before pipeline code): outline the existing road surface on the sample segments (hexbin/alpha-shape) and visually compare against the true edge. Decides how much refinement is needed; answers the gravel-bleed and Rinne questions.
  2. Initial boundary: project surface points to XY, compute the concave boundary; split left/right by side-of-axis.
  3. Station sampling: every 0.5–1.0 m along the axis, intersect the perpendicular with the boundary → initial edge point per side.
  4. Profile refinement: in a ±1–2 m window around each initial edge point, score the strongest combined transition (surface-membership drop + roughness rise + density gradient + slope change + local intensity/RGB contrast); snap the edge to the best offset.
  5. Polyline hygiene: robust outlier rejection on lateral offset vs station → Savitzky-Golay smoothing → shapely.simplify (topology-preserving).
  6. Gaps & ramps: interpolate only short gaps where both ends agree in offset + heading; explicit gaps at ramps/gores.
  7. Export: left/right polylines as XML via modelling-export; optional DXF via ezdxf.

Verification

References (inlined)

  1. Xu, Wang & Zheng (2016). Road Curb Extraction from Mobile LiDAR Point Clouds. arXiv:1610.04673 (IEEE TGRS)
  2. Schwab & Kolbe (2026). Radiometric fingerprinting of object surfaces using MLS. arXiv:2603.11252
  3. Wang, Ibrahim, Mansoor et al. (2025). Automated Road Extraction and Centreline Fitting in LiDAR. arXiv:2502.07486
  4. Zhao et al. (2024). CurbNet. arXiv:2403.16794 — only its class-imbalance/post-processing ideas apply here
  5. Tooling: CGAL Alpha_shape_2 · PDAL hexbin/covariancefeatures/planefit (pdal.io) · shapely simplify · scipy savgol_filter

Public research briefs: asphalt-edge brief · all 30 sources.

Conventions