scoop_image_limit — DRIVE scoop op

• Data kinds: scalar × scalar × scalar × scalar → table

• Call: import fullseye as fs; fs.ledger.scoop_image_limit(a: 'float', pitch: 'float', radius: 'float', bulk_density: 'float', *, h: 'float | None' = None, phi_deg: 'float' = 30.0, edge_px: 'float' = 0.5, grain_frac: 'float' = 0.25, min_a_over_d: 'float' = 5.0, target_mass: 'float | None' = None, rel_tol: 'float' = 0.05) -> 'dict' (to call the implementation directly, import scoop; scoop.scoop_image_limit(a: 'float', pitch: 'float', radius: 'float', bulk_density: 'float', *, h: 'float | None' = None, phi_deg: 'float' = 30.0, edge_px: 'float' = 0.5, grain_frac: 'float' = 0.25, min_a_over_d: 'float' = 5.0, target_mass: 'float | None' = None, rel_tol: 'float' = 0.05) -> 'dict'; from the registry, opsdrive.get("scoop_image_limit"))

Usage

Rough uncertainty guide for measuring a heaped spoon from a side image, and "is the image enough, or a scale?" (rule-based, a rough guide).

Model: volume error ≈ visible surface area S × boundary uncertainty e = edge_px·pitch + grain_frac·r (the edge pixels, plus the remainder of the part where the silhouette becomes the outer envelope of the grains that calibration does not remove). S is the lateral surface of the heap cone π a √(a² + H²) (H = a tan φ), and the volume is the heaped closed form (h if a/2 is not given). grain_frac = 0.25 is 0.15 — back-computed from the upper bound where, with MuJoCo rigid spheres (radius 2 mm, rim radius 30 mm, packing calibrated once), the count error over 3 quantities × 2 seeds stayed within 4.3 % — plus a margin (PoC). With few grains it breaks down faster than linear extrapolation (radius 3.5 mm, rim radius / grain diameter 4.3 gives 9.5 %), so a / d < min_a_over_d returns scale regardless of the error.

Returns: sigma_V, sigma_mass = ρ_b σ_V, rel_err = σ_V / V, a_over_d (rim radius / grain diameter), a_min (the smallest rim radius that satisfies rel_tol — the error is proportional to e / a), verdict (image / scale), reason. If target_mass is given, the verdict uses the relative error rel_err_target when a bowl of the same shape is shrunk to that mass. Raises ValueError: argument ranges.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_powder_scoop_pour — py -3.11 examples/poc_powder_scoop_pour.py

Ops the type connects to (they accept table as input)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Same category (scoop)

spoon_bowl_volume · scoop_synth_side · revolution_volume_side · two_view_volume · scoop_volume_read · scoop_count · tilt_wedge_retained · tilt_pour_rate


*Provenance: scoop.py — DRIVE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.