tacsim op• Data kinds: image2d × scalar → table
• Call: import fullseye as fs; fs.ledger.contact_radius_ring(h, pitch: 'float', n_az: 'int' = 72, step_px: 'float' = 0.25, r_max_px: 'float | None' = None) -> 'dict' (to call the implementation directly, import tacsim; tacsim.contact_radius_ring(h, pitch: 'float', n_az: 'int' = 72, step_px: 'float' = 0.25, r_max_px: 'float | None' = None) -> 'dict'; from the registry, opsdrive.get("contact_radius_ring"))
Reads the contact radius a from the height field without a model: the contact edge r = a is the ring where the radial slope |∂h/∂r| is maximal (in Hertz it grows as r/R inside and drops sharply as √ outside, a cusp). |∇h| is bilinearly interpolated in step_px steps along n_az radial lines in azimuth, each line's peak is refined to subpixel by parabolic interpolation → measure.fit_circle on the 72 points (2nd implementation) and the median of the radii.
Returns: a (median × pitch) [m], a_circle (radius of circle fit × pitch), r_px, cy, cx, rms_px (circle), radii_px (peak radius per azimuth), centre (centroid (cy, cx)), bias_px_per_a (rough guide to the resolution limit = −0.7 px / a; bilinear interpolation smooths the cusp by about 1 px, so it comes out −5 % inward when a is 14 px and −3 % when 21 px —— measured values, the price of having no model). Learning from the centroid of a threshold band (prototype v1) shifting 9 % inward, the peak position is used instead of a band, and the radial slope is taken as a 1 px-span difference of bilinear samples of h (less smoothing than np.gradient's 2 px). By default (r_max_px=None) it searches up to the window edge − 2 px. For real-device images with another peak (a neighbouring contact, an edge shadow) outside the membrane skirt, specify r_max_px explicitly. Raises ValueError: no dent, pitch ≤ 0, search radius under 2 px (dent too close to the window edge).
• 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.
• poc_tacscalib_sphere_lut — py -3.11 examples/poc_tacscalib_sphere_lut.py
• poc_tacsim_elastic_membrane — py -3.11 examples/poc_tacsim_elastic_membrane.py
table as input)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
tacsim)combined_modulus · hertz_sphere · hertz_force · hertz_cylinder · hertz_surface_uz · hertz_pressure · membrane_indent_sphere · membrane_indent_shape
*Provenance: tacsim.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.