Files
orisys-sensor-design/sensors/finger/r01/design.yaml
T
ykcheungab e7618faed4 docs: give the multi-view design and geometry facts one home each
Two workspace documents described the multi-view ownership decision by
overlapping each other and had both gone stale: neither matched the shipped
code, and the architecture document was referenced by nothing at all. They are
archived in the workspace, and this repo now carries the parts that belong to
it.

New: docs/geometry-measurements.md. Measured properties of the r01 sensing
surface, the sensing camera, the UV layouts, the printed cell pitch and the
runtime unroll domain - topology (1032 v / 1974 t), 355.77 mm2 area with 38.1%
near-vertical wall, the off-origin centroid, 94.5% inward-facing normals, the
0.516 x 0.714 mm measured pitch against a wrong 0.205 x 0.3556 mm nominal cell,
75.6% runtime coverage, and incidence over that region (p50 55.6 deg, invariant
to adding views). Merge-mode agreement is included, with an explicit note that
these values are camera-specific and expire when a camera moves - the Xynova
surface already needs 70 deg where r01 ships 62 deg.

Wiring:
- README.md points at the measurements and says they expire.
- design-parameters.md section 4 keeps the key semantics and now links to the
  workspace record for rationale and to the measurements for data, instead of
  restating either.
- design.yaml: replace a self-referential comment pointing back at the same
  document with the keys location and the rationale location.

No behaviour change: the YAML edit is a comment, and no source file is touched.
2026-09-30 16:29:39 +08:00

111 lines
4.5 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
# 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.