e7618faed4
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.
111 lines
4.5 KiB
YAML
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.
|