Files
orisys-sensor-design/sensors/finger/r01/design.yaml
T
ykcheungab 30a903a299 Give the stroke pattern one mode and design.yaml tuning
The twelve experimental modes collapse to camera_compensated_width, whose ten
knobs now come from a `stroke_pattern` block, and the PNG-only binary-preview
command goes with them as a strict subset of stroke-texture.

Verified: output is byte-identical at the defaults against the previous code, a
knob change is visible in the artifacts, the suite is green and the doc gate is
clean.
2026-10-04 09:40:17 +08:00

131 lines
5.8 KiB
YAML

sensor: finger
revision: r01
status: experimental
# Authoring unit in Blender (mm). Export converts using meters_per_source_unit.
authoring_unit: mm
meters_per_source_unit: 0.001
source_blend: source/geometry.blend
frames:
sensor: origin_sensor
objects:
sensing_surface: sensing_surface
cam_sensor: cam_sensor
origin_sensor: origin_sensor
# Read on every export; changing `assembly` silently changes what ships.
collections:
frames: FRAMES
export_compute: EXPORT_COMPUTE
assembly: ASSEMBLY
design_sim: DESIGN_SIM
exclude: EXCLUDE
# Topology guard. NOT YET WIRED - no code reads these, and the measured topology is
# 1034/1977. Unverified until connected to the export manifest; see
# docs/design-parameters.md part 5.
expected:
sensing_vertices: 1032
sensing_triangles: 1974
# Camera-space artwork on UV unwraps (`orisys-design texture`).
# See docs/design-parameters.md part 1.
texture_patch:
mesh: sensing_surface
camera: cam_sensor
uv_outputs: # ORDER IS OBSERVABLE: becomes the job's outputs[] array
produce: patch_texture_produce.png
compute: patch_texture_compute.png
width: 3280 # raster px; keep == px_per_mm * vector below
height: 3200
nx: 80 # 16:9 camera frame, left as-is from the original grid
ny: 45
color_r: 0.05
edge_sample_grid: 5
seed: 7 # pinned: one reproducible colour set across PNG/SVG/PDF
vector: # physical page; the `page: fixed` fallback for texture_patch_views
width_mm: 16.4
height_mm: 16.0
cross:
enabled: true
length_px: 40
thickness_px: 3
color: [1.0, 0.0, 0.0, 1.0]
# Projected views with per-triangle ownership (`orisys-design texture-views`).
# The PATTERN is grounded on cam_sensor, not on the production views: uv_1 and uv_2 are two
# parameterisations of the one surface pattern `compute` carries, so the printed marker stays
# a single pattern. `cam_uv_1`/`cam_uv_2` authored those layouts (Project from View (Bounds))
# and now serve as each pair's REGION camera, deciding what that pair may own.
# Ownership closes the overlap: both layouts are full-surface, so without a partition printing
# both would double-ink essentially the whole part.
# Keys: docs/design-parameters.md section 4. Why: D:\orisys_ws\docs\workflow\multiview-ownership-decision.md
texture_patch_views:
enabled: true
pattern_camera: cam_sensor # the ink source; a pair's `camera` only decides ownership
page:
mode: auto # auto = derived per view (projections only); fixed = use vector above
px_per_mm: 200
pairs:
- id: uv_1
camera: cam_uv_1 # REGION camera, not the pattern source
uv_map: uv_1
- id: uv_2
camera: cam_uv_2
uv_map: uv_2
merge:
mode: authored # honour the seam marked on the mesh
incidence_limit_deg: 62.0 # calibrated to THIS revision's cameras; re-measure if they move
max_hole_fraction: 0.02 # enforced: the run fails above this rather than shipping a gap
min_footprint_mm2: 2.0e-3
min_triangle_coverage: 0.60
component_policy: best_coverage # not `pinned`: both views qualify, so let the metric rank
seam:
boundary: use_seam # read mesh.edges[].use_seam as a hard graph cut
pins: [] # {component, view, reason} to override a component's owner
gap:
enabled: true # false = hard butt at the seam, no band at all
apply: post_process # post_process = straight edge | geometry_trim = sawtooth
treatment: no_print
alignment_tolerance_mm: 0.1 # per-pass placement accuracy; band total = 2x this
print:
base_fill: owned # white ground, already split by the seam
# Random Stroke Pattern (`orisys-design stroke-texture`).
# One mode: a capsule of `width` swept `length`, rotated per cell, sized from the camera
# cell's print-page footprint so a cell the projection stretches gets a proportionally
# larger mark. `--seed` / `--min-cell-pixels` / `--camera-width-fraction` override per run.
# Field reference: the inline comments below. These defaults are an image-space experiment,
# not a print master: `width_min_mm: 0.11` is below the demonstrated 0.2 mm dot (see
# docs/probe-findings.md). The resolved values are written to _stroke_pattern_params.json and
# recorded in the stroke-texture manifest, which is what makes a run reproducible.
stroke_pattern:
seed: 7 # per-cell offset and angle; reproducible
min_cell_pixels: 20 # cells smaller than this are skipped
jitter_fraction: 0.66 # mark offset range inside its cell; 0 pins to the centre
angle_span_deg: 180.0 # rotation range; 0 makes every stroke parallel
width_fraction: 0.50 # width = clamp(cell footprint x this, width_min_mm, width_max_mm)
width_min_mm: 0.11
width_max_mm: 0.28
length_ratio: 2.4 # length = ratio x width
coverage_cap: 0.45 # skip a mark that would exceed this local fill
neighbourhood_mm: 0.5 # radius of the local-fill neighbourhood
# Advisory only: reports a verdict, never blocks generation or changes exit codes.
# Millimetres are measured on the vector page declared above.
printability:
printer_dpi: 600 # target UV printer resolution
min_dots: 2 # printer dots required across the smallest feature
min_feature_mm: 0.10 # smallest acceptable feature width
min_edge_mm: 0.05 # shortest acceptable polygon edge
max_sliver_ratio: 4.0 # longest edge / minimum width
min_patch_area_mm2: 1.0e-4 # area above which a polygon is a material feature
notes: |
Canonical source is geometry.blend with named collections and objects.
Compute export uses sensing_surface + cam_sensor relative to origin_sensor.
Studio observation cameras are derived from mesh bounds; no cam_viz required.